Laravel大文件上传报错求助:文件不存在或不可读问题排查
大文件上传Laravel报错:
The "" file does not exist or is not readable. 我在Laravel项目中搭建了文件上传系统,小文件可正常上传,但生产服务器上传大文件时出现如下错误:
The "" file does not exist or is not readable.
最初推测问题与php.ini中的upload_max_filesize或post_max_size值过小有关,但已将upload_max_filesize设为5M,post_max_size设为8M,且通过运行php_ini_loaded_file和php_ini_scanned_files函数确认所有设置均来自服务器的/etc/php.ini文件,也正确重启了Apache服务器。即便如此,上传约3.6MB的文件时仍会触发上述错误。
补充:可复现的测试代码
路由
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(); // <-- 此处触发错误 return [ 'mimeType' => $mimeType ]; } }
uploadTest Blade文件
<!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>
该代码在本地环境可正确返回所有文件(无论大小)的MIME类型,但服务器上上传超过2MB的文件就会失败,因此判断是服务器配置问题,但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的标准表单提交时也会出现相同问题。
可能的排查方向
- 检查
max_input_time配置:大文件上传耗时可能超过php.ini中max_input_time的默认值,导致上传中断,临时文件未正常生成或被提前清理。可适当增大该值,比如设为120。 - 验证临时目录权限:PHP上传文件时会先存储到
upload_tmp_dir指定的临时目录,若该目录权限不足(比如Apache进程无读写权限),PHP无法写入临时文件,后续读取就会报错。可通过phpinfo()查看upload_tmp_dir路径,检查其权限设置。 - Apache的
LimitRequestBody限制:Apache自身有请求体大小限制,默认可能为2MB,即使PHP配置满足要求,Apache会先拦截超过大小的请求。需在httpd.conf或虚拟主机配置中添加LimitRequestBody 8388608(对应8MB,数值单位为字节),之后重启Apache。 - Laravel中间件或验证规则:检查项目中是否存在全局或路由级别的中间件,对文件上传大小做了额外限制;也可在控制器中添加明确的文件大小验证,排查是否是验证环节导致文件对象异常。
- 临时文件清理机制:服务器的临时文件清理服务(如
systemd-tmpfiles)可能在上传完成前就清理了临时文件,导致Laravel读取时找不到文件。可调整清理规则,延长临时文件保留时间。
内容的提问来源于stack exchange,提问作者HartleySan
相关产品推荐
相关产品推荐

