React+Laravel上传PDF至数据库报错:Call to a member function file() on array
解决“Call to a member function file() on array”错误
错误根源
- React提交方式错误:你将FormData拆解为普通JSON对象发送,文件无法被Laravel解析为
UploadedFile实例,后端接收到的是无效数组/字符串,调用file()方法时触发报错。 - 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
相关产品推荐
相关产品推荐

