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

React+Laravel上传PDF至数据库报错:Call to a member function file() on array

解决“Call to a member function file() on array”错误

错误根源

  1. React提交方式错误:你将FormData拆解为普通JSON对象发送,文件无法被Laravel解析为UploadedFile实例,后端接收到的是无效数组/字符串,调用file()方法时触发报错。
  2. Laravel文件处理语法错误:request('StagiaireCV')->file()写法不符合框架规范,正确的文件获取方式是$request->file('字段名')。

修复步骤

1. 修正React提交逻辑

直接发送完整的FormData,同时设置请求头为multipart/form-data(axios会自动处理边界,显式设置可避免兼容性问题):

function SendRequest(e) {
    e.preventDefault();

    axios.get(`http://localhost:8000/api/Stagires/Requestes/Finder/${StagiaireId}`)
    .then(data => {
            if (!data.data.success) {
                const formData = new FormData(e.target);
                // 将用户ID追加到FormData中
                formData.append('Acc_id', StagiaireId);
                
                axios.post('http://localhost:8000/api/Requestes', formData, {
                    headers: {
                        'Content-Type': 'multipart/form-data'
                    }
                })
                .then(res => {
                    console.log('提交成功', res.data);
                    // 可添加表单重置、成功提示等后续处理
                })
                .catch(err => {
                    console.error('提交失败', err);
                });
            } else {
                alert("You already sent a request!");
            }
        })
        .catch(err => {
            console.error('请求状态检查失败', err);
        });
};

同时确保文件选择的触发逻辑正确:

const AddCv = () => {
    file.current.click();
};

2. 修正Laravel后端逻辑

  • 修正文件获取语法
  • 添加表单验证(确保文件存在、格式为PDF)
  • 确保模型允许批量赋值

路由处理代码修改:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

Route::post('/Requestes', function (Request $request) {
    // 验证请求数据
    $validator = Validator::make($request->all(), [
        'Acc_id' => 'required|exists:stagiaire_acc,id', // 验证关联表存在该用户
        'Message' => 'required|string',
        'CV' => 'required|file|mimes:pdf|max:2048', // 限制PDF格式,最大2MB
    ]);

    if ($validator->fails()) {
        return response()->json(['errors' => $validator->errors()], 400);
    }

    // 存储文件到storage/app/cv目录
    $cvPath = $request->file('CV')->store('cv');

    $dataReq = Requests::create([
        'Acc_id'      => $request->Acc_id,
        'Message'     => $request->Message,
        'StagiaireCV' => $cvPath,
        'RequDate'    => date('Y-m-d'),
    ]);

    return response()->json($dataReq, 200);
});

确保Requests模型支持批量赋值:

在app/Models/Requests.php中添加:

protected $fillable = ['Acc_id', 'Message', 'StagiaireCV', 'RequDate'];

额外注意事项

  • 确保Laravel的storage/app/cv目录存在且有写入权限,可执行命令:mkdir -p storage/app/cv && chmod -R 755 storage/
  • 跨域问题:若React与Laravel不在同一域名,需在Laravel中配置CORS(可使用barryvdh/laravel-cors包快速实现)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:14:54