来自 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
并且您使用 <form method="post" action="http://mysite.com/my_script">
,您将收到一个空的 $_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->input->get("Foo");
访问它们的托管方式似乎没有为多部分表单填充托管访问
默认情况下它不会破坏全局 $_GET 数组,而且它似乎永远不会取消设置 $_POST 全局。可以使用$config['allow_get_array'] = FALSE
销毁 $_GET 数组,但 $_POST 数组似乎保持不变。输入帮助函数仅通过在索引不存在时返回 false 来简化从这些数组中的检索。否则只要 $_POST['foo'] 设置 $this->input->post('foo')
和 $_POST['foo']
是等价的。 CodeIgnitor User Guide Entry以上是关于来自 Post 数据的 CodeIgniter 未通过的主要内容,如果未能解决你的问题,请参考以下文章