我正在使用Plupload来管理我网站的文件上传。当我将Plupload配置为发布到以下测试文件时,记录显示正确,但是当我发布到CI控制器时,$ _POST AND $ _FILES都是空的。
test.php的
<?php print_r($_FILES); print_r($_POST); ?>
CI在使用标准HTML表单时会正确显示$ _FILES和$ _POST数组,所以任何想法是什么导致了这个?
修改 这是plupload配置
var uploader = new plupload.Uploader({
runtimes : 'html5,html4,flash,silverlight,browserplus',
browse_button : 'pickfiles',
container : 'container',
max_file_size : '15mb',
url : '/test.php',
//url : '/upload/do_upload/',
flash_swf_url : '/js/plupload/plupload.flash.swf',
silverlight_xap_url : '/js/plupload/plupload.silverlight.xap',
filters : [
{title : "Documents", extensions : "pdf,doc,docx,rtf,txt"}
],
multipart_params : { job : -2 }
});
这是控制器
class Upload extends CI_Controller {
function __construct()
{
parent::__construct();
}
function index()
{
$this->load->view('upload_form', array('error' => ' ' ));
}
function do_upload()
{
print_r($_POST);
print_r($_FILES);
$config['upload_path'] = 'incoming/';
$config['allowed_types'] = 'pdf|doc|docx|rtf|txt';
$config['max_size'] = '900';
$this->load->library('upload');
$this->upload->initialize($config); // MUST CALL ELSE config not loaded
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->model('translation_model');
$this->translation_model->add_orig($job, $filePath);
$this->load->view('upload_success', $data);
}
}
}
答案 0 :(得分:5)
最可能的原因是错误的mod重写规则。如果您使用任何一种,请尝试禁用它们并重新发布数据。
答案 1 :(得分:1)
我正在使用输入类和常规的$ _POST变量,它一直对我有用。当CI能够以常规形式转储时,CI清理后变量的理论并没有增加。
关闭csrf保护,请告知我们结果。使用firebug控制台从服务器读取答案。 有关csrf的解决方法,请使用https://github.com/EllisLab/CodeIgniter/pull/236
CodeIgniter还存在文件类型问题。 http://codeigniter.com/forums/viewthread/113029
我有两个工作库,如果你想要它们只是给我留言。
答案 2 :(得分:0)
可能是plupload中的某些内容正在拦截$ _POST和$ _FILES。
在codeigniter中,通常最好使用input class来处理帖子变量,使用file uploading class来处理文件上传。
我猜有些东西已经清空了$ _POST和$ _FILES数组的安全性,可能是因为包括输入和文件上传类,codeigniter本身会擦除$ _POST和$ _FILES数组,这样你就不得不使用它们了类。它总是一个好主意,因为codeigniter可以消除XSS攻击并清理变量。
答案 3 :(得分:0)
首先,您应该检查您是否有用于 enctype 的表单标签。
在表单中添加enctype="multipart/form-data"
,因为它支持上传。
它会起作用,你能不能尝试将 print_r
函数放在 else
之前的 $data
标签之后,
一旦 if
() 条件满足,它就会运行。所以将它添加到 else
标签中并运行它。
function do_upload()
{
$config['upload_path'] = 'incoming/';
$config['allowed_types'] = 'pdf|doc|docx|rtf|txt';
$config['max_size'] = '900';
$this->load->library('upload');
$this->upload->initialize($config); // MUST CALL ELSE config not loaded
if ( ! $this->upload->do_upload()) {
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
}
else {
print_r($_POST);
print_r($_FILES);
$data = array('upload_data' => $this->upload->data());
$this->load->model('translation_model');
$this->translation_model->add_orig($job, $filePath);
$this->load->view('upload_success', $data);
}
}