我正在使用文件上传器插件(来自:https://github.com/valums/file-uploader)将文件上传到我的网站。
如果您使用的是模式网络浏览器(如Firefox 6或Chrome 13),则会通过在POST正文中流式传输文件来上传,并可以为您提供进度条。如果您使用的是IE(或旧浏览器),它会回退到标准的$ _FILES(使用隐藏的iFrame)。
一切正常,但突然间我无法在Chrome或Firefox中上传5MB文件。当我在Chome或Firefox上传一个5MB的文件时,我得到一个500错误,我的PHP代码甚至从未运行过。如果我使用Internet Explorer(使用$ _FILES),它可以正常工作。
这必须是一个配置问题,因为我的PHP代码甚至都没有运行。所以,我检查了我的设置。
/etc/php.ini中
upload_max_filesize = 15M
post_max_size = 16M
我找了LimitRequestBody
,但是找不到(默认为无限制)。
设置看起来正确。我调试了一段时间,我无法弄清楚出了什么问题。
我缺少一个设置吗?如果重要的话,服务器安装了suhosin。
这是我正在使用的后端(我正在使用CodeIgniter)代码。
// Can we use the fancy file uploader?
if($this->input->get('qqfile') !== FALSE){ // Yes we can :-)
$name = preg_replace('/[^\-\(\)\d\w\.]/','_', $this->input->get('qqfile'));
// Upload the file using black magic :-)
$input = fopen("php://input", 'r');
$temp = tmpfile();
$fileSize = stream_copy_to_stream($input, $temp);
fclose($input);
if($fileSize > 15728640){
$ret['error'] = 'File not uploaded: file cannot be larger than 15 MB';
}
elseif(isset($_SERVER['CONTENT_LENGTH']) && $fileSize === (int)$_SERVER['CONTENT_LENGTH']){
$path = $folder.'/'.$name; // Where to put the file
// Put the temp uploaded file into the correct spot
$target = fopen($path, 'w');
fseek($temp, 0, SEEK_SET);
stream_copy_to_stream($temp, $target);
fclose($target);
fclose($temp);
$ret['fileSize'] = $fileSize;
$ret['success'] = true;
}
else{
$ret['error'] = 'File not uploaded: content length error';
}
}
else{ // IE 6-8 can't use the fancy uploader, so use the standard $_FILES
$file = $_FILES['qqfile'];
$file['name'] = preg_replace('/[^\-\(\)\d\w\.]/','_', $file['name']);
$config['file_name'] = $file['name'];
// Upload the file using CodeIgniter's upload class (using $_FILES)
$_FILES['userfile'] = $_FILES['qqfile'];
unset($_FILES['qqfile']);
$config['upload_path'] = $folder;
$config['allowed_types'] = '*';
$config['max_size'] = 15360; //15 MB
$this->load->library('upload', $config);
if($this->upload->do_upload()){ // Upload was successful :-)
$upload = $this->upload->data();
$ret['success'] = true;
$ret['fileSize'] = $upload['fileSize']/1000;
}
else{ // Upload was NOT successful
$ret['error'] = 'File not uploaded: '.$this->upload->display_errors('', '');
$ret['type'] = $_FILES['userfile']['type'];
}
echo json_encode($ret);
}
我知道我的代码有效,因为小于4MB的文件上传(在所有浏览器上)。我只有大于5mb的文件有问题(使用Chrome / Firefox)。奇怪的是,这在我的测试服务器上工作正常,但不是我的生产服务器。它们可能有不同的设置(suhosin正在生产,但没有进行测试)。
答案 0 :(得分:3)
请查看<?php phpinfo(); ?>
。
答案 1 :(得分:0)
我查看了我的apache日志,找到了
PHP致命错误:允许的内存大小为16777216字节耗尽(尝试分配5242881字节)
我将memory_limit
更改为64M,现在似乎没问题了。