无法使用AJAX文件上传器上传5mb文件

时间:2011-09-21 14:07:34

标签: php ajax apache codeigniter suhosin

我正在使用文件上传器插件(来自: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正在生产,但没有进行测试)。

2 个答案:

答案 0 :(得分:3)

请查看<?php phpinfo(); ?>

,检查您的php.ini设置是否正确加载

答案 1 :(得分:0)

我查看了我的apache日志,找到了

  

PHP致命错误:允许的内存大小为16777216字节耗尽(尝试分配5242881字节)

我将memory_limit更改为64M,现在似乎没问题了。