我在一个Laravel项目中设置了一个文件上传系统。较小的文件可以正确上传,但是当我尝试上传较大的文件时,在生产服务器上出现以下错误:upload_max_filesize
在查看了几个SO帖子等之后,我认为这个问题与php.ini
文件中的upload_max_filesize
或post_max_size
值太小有关。
但是,upload_max_filesize
被设置为5M
,post_max_size
被设置为8M
,我能够正确地重新启动Apache服务器,并且我确信(在服务器上运行PHP文件中的php_ini_loaded_file
和php_ini_scanned_files
函数后)所有这些设置都来自服务器上的/etc/php.ini
文件。
即便如此,如果我尝试上传一个大约3.6 MB的文件,那么它会失败,并显示上面的错误消息。
是什么可能导致了这个问题,而我没有想到?谢谢。
Edit:下面是一些在服务器上重现错误的示例代码:
路线:
Route::get('/temp/upload-test', [TempController::class, 'uploadTest']);
Route::post('/temp/upload-test', [TempController::class, 'uploadFileTest']);
控制器:
public function uploadTest() {
return view('uploadTest');
}
public function uploadFileTest() {
$file = request()->file('file_0');
if ($file) {
$mimeType = $file->getMimeType(); // <-- This throws the error.
return [
'mimeType' => $mimeType
];
}
}
uploadTest
刀片文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<form>
<input type="file">
<input type="submit">
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.1.3/axios.min.js">
</script>
<script>
let file;
const process = async (formData) => {
const response = await axios.post('/temp/upload-test', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
console.log(response.data);
};
document.querySelector('input[type="file"]').addEventListener('change', (evt) => {
if (evt.target.files[0]) {
file = evt.target.files[0];
}
});
document.querySelector('form').addEventListener('submit', async (evt) => {
if (file) {
let formData = new FormData();
formData.append(`file_0`, file);
process(formData);
}
evt.preventDefault();
});
</script>
</body>
</html>
关键是我使用Axios将文件发送到服务器。这段代码正确地返回了本地主机设置中所有文件的MIME类型(无论大小),但似乎无法返回服务器上任何超过2 MB的文件,所以我假设这是服务器配置问题,但如前所述,php.ini
文件似乎设置正确,我已经多次重新启动Apache。
下面是Laravel日志中错误的开始:
[timestamp] production.ERROR: The "" file does not exist or is not readable. {"exception":"[object] (Symfony\\Component\\Mime\\Exception\\InvalidArgumentException(code: 0): The \"\" file does not exist or is not readable. at /$
[stacktrace]
# 0 /var/www/sub-folder/vendor/symfony/mime/MimeTypes.php(134): Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser->guessMimeType('')
# 1 /var/www/sub-folder/vendor/symfony/http-foundation/File/File.php(77): Symfony\\Component\\Mime\\MimeTypes->guessMimeType('')
# 2 /var/www/sub-folder/app/Http/Controllers/TempController.php(61): Symfony\\Component\\HttpFoundation\\File\\File->getMimeType()
# 3 /var/www/sub-folder/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\TempController->uploadFileTest()
# 4 /var/www/sub-folder/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('uploadFileTest', Array)
编辑#2:我刚刚通过另一个测试确认了Axios不是问题所在。当我在没有任何JS的情况下提交标准表单时,我也遇到了同样的问题。
1条答案
按热度按时间hwamh0ep1#
我终于找到了答案。我必须在重新启动Apache之前运行以下命令,以使
php.ini
文件的更改生效:sudo systemctl restart php-fpm.service
个在我运行了那个命令之后,***然后***重新启动了Apache服务器,一切都很好。