You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

问题根源

  1. 临时目录不可用:error:6对应PHP的UPLOAD_ERR_NO_TMP_DIR,即服务器的临时上传目录不存在或无写入权限,Infinity Free免费主机的默认临时目录可能受限。
  2. 扩展名获取错误:用getMimeType()作为文件扩展名,线上部分图片(如jfif)会被识别为application/octet-stream,导致生成的文件名格式非法,存储失败。
  3. 存储目录权限问题:Laravel的storage目录或public磁盘对应的目录无写入权限。
  4. 上传大小限制:服务器默认的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__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:48:15