2011-03-06 78 views
8

我试图在CodeIgniter中进行文件上传,但是如果我添加enctype =“multipart form-data”,那么无论发布的数据是否会通过。甚至连其他领域都没有。但是,当我不添加它,我可以得到其他发布数据,但当然没有文件上传。这里出了什么问题。这里是我的视图和控制器:CodeIgniter来自发布数据不经过

查看:只有

<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) { } 
+1

控制器的照片,方法是newAlbum - 我假设的var_dump是方法 - 什么是指数和构造? – bensiu 2011-03-06 04:00:54

回答

1

有趣。你发布的代码应该可以工作。我用你的表单做了一个快速测试脚本,$ _FILES和$ _POST数据都很好。

我发现原来这先前的问题:PHP--parsing multipart form data

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

的我能找到的唯一信息等位是在回答这个问题,$_POST data returns empty when headers are > POST_MAX_SIZE

如果您尝试上传文件太大,显然这会导致PHP扔掉$ _ POST数据作为好。但是,如果您尝试提交表单而未上传文件(但仍使用“multipart/form-data”),但仍未看到任何$ _POST数据通过,则不适用。

+0

CodeIgniter设置'$ _POST','$ _GET'等等作为安全措施,并提供一种通过'$ this-> input-> get(“Foo”)访问它们的托管方式;'似乎托管访问未填充多部分形式 – Basic 2011-08-21 04:17:53

+1

默认情况下,它不会销毁全局$ _GET数组,并且它似乎永远不会取消设置$ _POST全局。可以使用$ config ['allow_get_array'] = FALSE'销毁$ _GET数组,但$ _POST数组似乎保持不变。如果索引不存在,输入帮助函数只会通过返回false来简化从这些数组中检索。否则只要设置$ _POST ['foo']'$ this-> input-> post('foo')'和'$ _POST ['foo']'是等价的。 [CodeIgnitor用户指南条目](http://codeigniter.com/user_guide/libraries/input.html) – ToothlessRebel 2011-11-30 19:53:43

2

实际上,像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> 

控制器:upload.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); 
    } 
} 
} 
?> 

而这一切

1

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

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

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

2

您需要修复您的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') 

Saludos!

1

我刚刚有同样的问题。 我这样解决了。在application/config/config.php中,您设置了base_url ,请注意,此url必须与您的网络应用程序 相同。对我而言,我用www.sdfsd.com打电话给我的域名,但在配置文件 中,我写了http://sdfsd.com,所以表单的POST不起作用。所以我改变了这个 现在一切正常!

欢呼声

+0

请注意,如果您使用完整的网址,则您的基本网址必须与表单的“操作”属性相匹配。例如,如果'base_url = http:// www.mysite.com'并且你使用'

'你会收到一个空的$ _POST数组。 – ToothlessRebel 2011-11-30 19:51:42

0

我也有这个问题。我不同意以上的答案。我认为关键的是你试图获得发布数据的控制器在什么阶段。也许你可以发布你的控制器的相关部分。我发现邮寄数据和上传数据只有在您致电后才可用

this->upload->do_upload() 

很明显,您使用if语句来检查成功。如果成功的话,

$this->upload->data() 

返回标准阵列对上传的文件信息和

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

填充了你在相关的表单元素输入的内容。

3

您可以添加这种形式的属性:
enctype="multipart/form-data;charset=utf-8"
相反的:
enctype="multipart/form-data"
你可以看到这个link

+0

Thanks @Mustafa,这解决了我已经有好几天的问题了。 – 2014-05-21 19:50:58

相关问题