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

Laravel嵌套Form-Data文件上传Request返回空文件数组问题

问题分析

Laravel无法识别嵌套form-data中的文件,本质是PHP对嵌套数组文件上传的解析结构和Laravel Request类的默认解析逻辑不兼容。从你打印的$_FILES可以看到,PHP将文件的每个属性(name、tmp_name、type等)拆分为独立的嵌套数组,而不是把完整的文件对象挂载到portfolios[x][files][y]的位置。Laravel的$request->file()方法无法自动将这种分散的属性组装成UploadedFile实例,所以返回空对象。

解决方案

1. 自定义Request方法,手动解析嵌套文件

在你的StoreWorkerRequest类中添加一个方法,负责将$_FILES中的嵌套文件属性组装成UploadedFile实例:

use Illuminate\Http\UploadedFile;

public function getPortfoliosWithFiles()
{
    $portfolios = $this->input('portfolios', []);
    $filesData = $_FILES['portfolios'] ?? [];

    foreach ($portfolios as $index => &$portfolio) {
        if (empty($filesData['name'][$index]['files'])) {
            continue;
        }

        $portfolioFiles = [];
        foreach ($filesData['name'][$index]['files'] as $fileIndex => $fileName) {
            if ($filesData['error'][$index]['files'][$fileIndex] !== UPLOAD_ERR_OK) {
                continue;
            }

            $portfolioFiles[] = new UploadedFile(
                $filesData['tmp_name'][$index]['files'][$fileIndex],
                $fileName,
                $filesData['type'][$index]['files'][$fileIndex],
                $filesData['error'][$index]['files'][$fileIndex],
                true // 标记为临时文件,Laravel会自动处理后续清理
            );
        }

        $portfolio['files'] = $portfolioFiles;
    }

    return $portfolios;
}

2. 调整控制器逻辑,使用自定义方法获取文件

修改控制器中的代码,替换原来的$request->file()调用:

public function register(StoreWorkerRequest $request): JsonResponse
{
    $validatedData = $request->validated();
    $portfoliosWithFiles = $request->getPortfoliosWithFiles();

    return response()->json([
        'all_inputs' => $request->all(),
        'file_inputs' => $portfoliosWithFiles,
    ]);
}

3. 验证规则保持不变

你的现有验证规则是正确的,Laravel的验证器可以正确识别portfolios.*.files.*的规则,只要你在验证后使用自定义方法组装文件即可。

额外注意事项
  • 确保Postman中的字段名格式正确:portfolios[0][files][]、portfolios[1][files][],不要遗漏方括号。
  • 不要手动设置Content-Type,让Postman自动生成multipart/form-data请求头,避免边界符错误。
  • 如果需要批量处理多个文件,上述方法会自动遍历所有portfolio下的文件数组,无需额外修改。

内容的提问来源于stack exchange,提问作者DigitalBraine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:12:07