Не удается загрузить файл 5 МБ с помощью загрузчика файлов AJAX
Я использую плагин для загрузки файлов (из: https://github.com/valums/file-uploader) для загрузки файлов на мой сайт.
Если вы используете модернистский веб-браузер (например, Firefox 6 или Chrome 13), он загружается путем потоковой передачи файла в теле POST и может отображать индикатор выполнения. Если вы используете IE (или старый браузер), он использует стандартный $_FILES (используя скрытый iFrame).
Все работало нормально, но внезапно я не могу загрузить файлы размером 5 МБ в Chrome или Firefox. Когда я загружаю 5-мегабайтный файл в Chome или Firefox, я получаю ошибку 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);
}
Я знаю, что мой код работает, так как файлы размером менее 4 МБ загружаются нормально (во всех браузерах). У меня проблема только с файлами размером более 5 МБ (с использованием Chrome/Firefox). Странно то, что это отлично работает на моем тестовом сервере, но не на моем рабочем сервере. Вероятно, они имеют разные настройки (suhosin находится на производстве, но не на тесте).
2 ответа
Я посмотрел в своих логах apache и нашел
Неустранимая ошибка PHP: допустимый объем памяти 16777216 байт исчерпан (попытка выделить 5242881 байт)
Я изменился memory_limit
до 64M, теперь, кажется, все в порядке.
Пожалуйста, проверьте правильность загрузки настроек php.ini, просмотрев <?php phpinfo(); ?>
,