Infinity Free上Laravel项目文件上传失败求助
Laravel项目在Infinity Free服务器上文件上传失败问题解决
问题说明
将Laravel项目部署到Infinity Free免费主机后,文件上传功能失效。本地环境中dd($request->file('item_image'))能正常返回UploadedFile实例,但线上返回的实例中error为6,多数文件属性为空,移出hasFile判断后直接触发500错误。
上传核心代码
public function submitItem(Request $request) { // dd($request->file('item_image')); DB::beginTransaction(); try { $item = new Item(); $item->item_name = $request->item_name; $item->item_qty = $request->item_quantity; $item->single_price = $request->single_price; $item->bundle_price = $request->bundle_price; $item->processor_id = $request->processor; $item->category_id = $request->category; $item->description = $request->description == null ? "" : $request->description; if($request->hasFile('item_image')){ $uploadedFile = $request->file('item_image'); $extension = $uploadedFile->getMimeType(); $filename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME); // Ensure the filename is unique to avoid overwriting existing files $filename = $filename . '_' . time(); Storage::disk('public')->put('items/'.$filename.'.'.$extension, $uploadedFile); $item->image_url = $filename; } $item->save(); DB::commit(); Alert::success('Success', 'Item Added!'); return redirect()->route('Items: ')->with('message', 'Item Added!'); } catch (Exception $e) { DB::rollBack(); echo $e; } }
本地与线上实例对比
本地正常输出
Illuminate\Http\UploadedFile {#362 ▼ // app\Http\Controllers\ItemController.php:92 -test: false -originalName: "Galax RTX 4060 1-Click OC 2X 8GB GDDR6.jpg" -mimeType: "image/jpeg" -error: 0 #hashName: null path: "C:\\Users\\marjon\\AppData\\Local\\Temp" filename: "php3DD8.tmp" basename: "php3DD8.tmp" pathname: "C:\\Users\\marjon\\AppData\\Local\\Temp\\php3DD8.tmp" extension: "tmp" realPath: "C:\\Users\\marjon\\AppData\\Local\\Temp\\php3DD8.tmp" aTime: 2023-11-23 09:47:59 mTime: 2023-11-23 09:47:59 cTime: 2023-11-23 09:47:59 inode: 17169973579535044 size: 16874 perms: 0100666 owner: 0 group: 0 type: "file" writable: true readable: true executable: false file: true dir: false link: false linkTarget: "C:\\Users\\marjon\\AppData\\Local\\Temp\\php3DD8.tmp" }
线上异常输出
Illuminate\Http\UploadedFile {#362 ▼ // app/Http/Controllers/ItemController.php:93 -test: false -originalName: "GALAX GeForce RTX™ 4070 EX Gamer 1-Click OC 12GB GDDR6X 192-bit (PINK).jfif" -mimeType: "application/octet-stream" -error: 6 #hashName: null path: "" filename: "" basename: "" pathname: "" extension: "" realPath: "/home/vol2_8/infinityfree.com/if0_35473659/htdocs" aTime: 1970-01-01 00:00:00 mTime: 1970-01-01 00:00:00 cTime: 1970-01-01 00:00:00 inode: false size: false perms: 00 owner: false group: false type: false writable: false readable: false executable: false file: false dir: false link: false }
问题根源
- 临时目录不可用:
error:6对应PHP的UPLOAD_ERR_NO_TMP_DIR,即服务器的临时上传目录不存在或无写入权限,Infinity Free免费主机的默认临时目录可能受限。 - 扩展名获取错误:用
getMimeType()作为文件扩展名,线上部分图片(如jfif)会被识别为application/octet-stream,导致生成的文件名格式非法,存储失败。 - 存储目录权限问题:Laravel的storage目录或public磁盘对应的目录无写入权限。
- 上传大小限制:服务器默认的
upload_max_filesize或post_max_size过小,导致文件无法上传。
修复步骤
1. 手动设置临时上传目录
- 在项目
public目录下创建temp文件夹,设置权限为755。 - 在
public/index.php开头添加代码,指定PHP临时目录:ini_set('upload_tmp_dir', __DIR__ . '/temp');
2. 修正文件扩展名获取逻辑
替换代码中获取扩展名的部分,改用客户端原始扩展名:
// 替换原来的$extension = $uploadedFile->getMimeType(); $extension = $uploadedFile->getClientOriginalExtension();
3. 修复存储目录权限与配置
- 确保
public/storage/items目录存在,权限设置为755。 - 若无法运行
php artisan storage:link,修改config/filesystems.php中public磁盘的配置,直接指向public目录:'public' => [ 'driver' => 'local', 'root' => public_path('storage'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
4. 调整上传大小限制
在项目根目录的.htaccess文件中添加以下配置(Apache服务器):
php_value upload_max_filesize 10M php_value post_max_size 10M php_value max_execution_time 300
5. 完善错误处理
替换catch块中的echo $e,改为日志记录并返回友好提示:
catch (Exception $e) { DB::rollBack(); Log::error('Item upload failed: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString()); Alert::error('Error', 'Failed to add item. Please try again.'); return back()->withInput(); }
内容的提问来源于stack exchange,提问作者noj__
相关产品推荐
相关产品推荐

