Не удается загрузить файл 5 МБ с помощью загрузчика файлов AJAX - PullRequest
1 голос
/ 21 сентября 2011

Я использую плагин для загрузки файлов (с: https://github.com/valums/file-uploader) для загрузки файлов на мой сайт.

Если вы используете браузер Moden (например, Firefox 6 или Chrome 13), тогдаон загружается путем потоковой передачи файла в теле POST и может отображать индикатор выполнения. Если вы используете IE (или старый браузер), он возвращается к стандартному $ _FILES (с использованием скрытого iFrame).

Все работало нормально, но вдруг я не могу загрузить файлы 5 МБ в Chrome или Firefox. Когда я загружаю файл 5 МБ в Chome или Firefox, я получаю ошибку 500, и мой код PHP никогда даже не запускается. Если я использую ИнтернетПроводник (который использует $ _FILES), он работает нормально.

Это должно быть проблемой конфигурации, так как мой PHP-код никогда даже не запускается. Итак, я проверил свои настройки.

/etc/php.ini

upload_max_filesize = 15M
post_max_size = 16M

Я искал LimitRequestBody, но его нигде не найти (и значение по умолчанию не ограничено).

Настройки выглядят правильно. Iотладил это на некоторое время, и я не могу понять, что не так.

Есть линастройки, которые мне не хватает?На сервере установлен 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);
}

Я знаю, что мой код работает как файлыменее 4 МБ загружать нормально (во всех браузерах).У меня проблема только с файлами размером более 5 МБ (с использованием Chrome / Firefox).Странно то, что это отлично работает на моем тестовом сервере, но не на моем рабочем сервере.Возможно, они имеют разные настройки (suhosin находится на производстве, но не на тесте).

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Проверьте правильность загрузки настроек php.ini, просмотрев <?php phpinfo(); ?>.

0 голосов
/ 21 сентября 2011

Я посмотрел в своих логах apache и обнаружил

Неустранимая ошибка PHP: исчерпан допустимый объем памяти 16777216 байт (попытался выделить 5242881 байт)

Я изменилmemory_limit до 64M, теперь, кажется, все в порядке.

...