来自 Post 数据的 CodeIgniter 未通过

Posted

技术标签:

【中文标题】来自 Post 数据的 CodeIgniter 未通过【英文标题】:CodeIgniter From Post Data Not Going through 【发布时间】:2011-07-09 16:05:03 【问题描述】:

我试图在 CodeIgniter 中进行文件上传,但是当我添加 enctype="multipart form-data" 时,不会通过任何帖子数据。甚至连其他领域都没有。但是,当我不添加它时,我可以获得其他帖子数据,但当然没有文件上传。这里出了什么问题。这是我的视图和控制器:

查看:

<h2>Add a New Album</h2>
<form enctype="multipart/form-data"  method="post" action="<?php echo base_url();?>index.php/photo/newAlbum">

                            <table style="margin-left:5px;">
                                <tr>
                                    <td>     Album Name:</td>
                                    <td><input type="text" name="name" /></td>
                                </tr>
                                <tr>
                                    <td>     Photo .zip File:</td>
                                    <td><input type="file" name="userfile" size="20" /></td>
                                </tr>
                                <tr>
                                    <td></td>
                                    <td><input type="submit" value="Upload Photo File" /></td>
                                </tr>
                            </table>

</form>

控制器只包含:

var_dump($_POST);

结果是:

array(0)  

【问题讨论】:

控制器是照片,方法是 newAlbum - 我假设 var_dump 在方法中 - 索引和构造函数中有什么? 【参考方案1】:

我遇到了类似的问题 - 当您超过最大上传大小/最大帖子大小时,POST 数据为空。 这个答案解决了我的问题并允许我查看 $_POST 和 $_FORM 数据: $_POST data returns empty when headers are > POST_MAX_SIZE

【讨论】:

【参考方案2】:

检查 CI 层中可能的错误重定向。这可能是由错误的 URL 请求引起的(例如,在 URL 末尾缺少斜杠“/”)。重定向会删除任何 POST 数据(我正在处理这个问题)。

因此,请确保您在表单操作中使用完整的 URL。

检查您的 .htaccess 和 $config['uri_protocol'] 的一致性。

【讨论】:

【参考方案3】:

您可以添加此表单属性:enctype="multipart/form-data;charset=utf-8" 而不是:enctype="multipart/form-data" 你可以看到这个link。

【讨论】:

感谢@Mustafa,这解决了我这几天遇到的问题。【参考方案4】:

我也有这个问题。我不同意楼上的回答。我认为关键是您尝试在控制器的哪个阶段获取发布数据。也许您可以发布控制器的相关部分。我发现post data和upload data只有在你调用后才可用

this->upload->do_upload()

显然,您使用 if 语句来检查是否成功。如果成功,

$this->upload->data() 

返回包含上传文件信息的标准数组和

$this->input->post('name_of_your_form_element')

填充有您在相关表单元素中输入的内容。

【讨论】:

【参考方案5】:

我也遇到了同样的问题。 我是这样解决的。在 application/config/config.php 你设置 base_url 请注意,此网址必须与您呼叫的网址完全相同 您的网络应用程序。对我来说,我用 www.sdfsd.com 调用我的域,但在配置文件中 我写了http://sdfsd.com,所以表单的 POST 不起作用。所以我改变了这个 现在一切正常!!

干杯

【讨论】:

请注意,如果您使用完整的 URL,您的基本 URL 必须与表单的 action 属性匹配。例如,如果 base_url = http://www.mysite.com 并且您使用 &lt;form method="post" action="http://mysite.com/my_script"&gt;,您将收到一个空的 $_POST 数组。【参考方案6】:

你需要修复你的do_upload,像这样..

$this->upload->do_upload('name-of-input-file-element-of-your-form')

例如,在您的视图代码中,您有:

<input type="file" name="userfile" size="20" />

所以,您的do_upload 行应该是这样的:

$this->upload->do_upload('userfile')

致敬!

【讨论】:

【参考方案7】:

实际上,像 image/zip 或其他一些 blob 数据这样的多部分数据将包含在 $_FILES 数组中,而不是 $_POST 数组中。 我建议你使用上传库。

查看:upload_form.php

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<?php echo $error;?>

<?php echo form_open_multipart('upload/do_upload');?>

<input type="file" name="userfile" size="20" />

<br /><br />

<input type="submit" value="upload" />

</form>

</body>
</html>

查看:upload_success.php

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<h3>Your file was successfully uploaded!</h3>

<ul>
<?php foreach($upload_data as $item => $value):?>
<li><?php echo $item;?>: <?php echo $value;?></li>
<?php endforeach; ?>
</ul>

<p><?php echo anchor('upload', 'Upload Another File!'); ?></p>

</body>
</html>

控制器:上传.php

<?php

class Upload extends CI_Controller 

 function __construct()
 
  parent::__construct();
  $this->load->helper(array('form', 'url'));
 

 function index()
  
  $this->load->view('upload_form', array('error' => ' ' ));
 

 function do_upload()
 
  $config['upload_path'] = './uploads/';
  $config['allowed_types'] = 'gif|jpg|png';
  $config['max_size'] = '100';
  $config['max_width']  = '1024';
  $config['max_height']  = '768';

  $this->load->library('upload', $config);

  if ( ! $this->upload->do_upload())
  
   $error = array('error' => $this->upload->display_errors());

   $this->load->view('upload_form', $error);
   
  else
  
   $data = array('upload_data' => $this->upload->data());

   $this->load->view('upload_success', $data);
  
  

?>

仅此而已

【讨论】:

【参考方案8】:

有趣。您发布的代码应该可以工作。我使用您的表单制作了一个快速测试脚本,并且 $_FILES 和 $_POST 数据都可以通过。

我在 SO 上找到了这个先前的问题:PHP--parsing multipart form data

这听起来像你遇到的同样的问题。不幸的是,这个问题没有得到真正的答案。我认为这可能是服务器配置问题 - 您可以在另一台服务器上尝试相同的代码并查看它是否正常工作?

我能找到的唯一其他信息是这个问题的答案,$_POST data returns empty when headers are > POST_MAX_SIZE

如果您尝试上传过大的文件,显然这也会导致 PHP 丢弃 $_POST 数据。但是,如果您尝试在不上传文件的情况下提交表单(但仍使用“multipart/form-data”),但仍然看不到任何 $_POST 数据通过,则不适用。

【讨论】:

CodeIgniter 取消设置 $_POST$_GET 等...作为一种安全措施,并提供了一种通过 $this-&gt;input-&gt;get("Foo"); 访问它们的托管方式似乎没有为多部分表单填充托管访问 默认情况下它不会破坏全局 $_GET 数组,而且它似乎永远不会取消设置 $_POST 全局。可以使用$config['allow_get_array'] = FALSE 销毁 $_GET 数组,但 $_POST 数组似乎保持不变。输入帮助函数仅通过在索引不存在时返回 false 来简化从这些数组中的检索。否则只要 $_POST['foo'] 设置 $this-&gt;input-&gt;post('foo')$_POST['foo'] 是等价的。 CodeIgnitor User Guide Entry

以上是关于来自 Post 数据的 CodeIgniter 未通过的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 不会显示来自数据库的信息

PHP Codeigniter 数据库助手类“未使用表”

来自模型的输入未包含在表单 POST 数据中

判断帖子是不是来自codeigniter中的ajax调用的方法?

Codeigniter中foreach循环中的未定义变量

PHP 未检测到来自 JavaScript 请求的 POST JSON 数据