Laravel 5.7 无法解析 POST multipart/form-data 请求

Laravel 5.7 can't parse POST multipart/form-data request

我在 Angular 中使用此代码将数据作为 multipart/form-data:

发送到我的 Laravel 5.7 API 端点
sendImageFile(id: number, fileToUpload: File) {
  const formData: FormData = new FormData();
  formData.append('file', fileToUpload, fileToUpload.name);
  formData.append('photoalbum_id', id.toString() );

  this.headers.delete('Content-Type'); // remove default application/json setting
  this.headers.append('Content-Type', 'multipart/form-data');

  this.options = new RequestOptions({ headers: this.headers });

  return this.http.post(this.url, formData, this.options)
    .pipe(catchError(this.handleError));
}

我用这个代码检查了发送的数据:

new Response(formData).text().then(console.log);

在控制台中得到这个结果:

------WebKitFormBoundaryRjHGSmIZUd0iUMK9
Content-Disposition: form-data; name="file"; filename="mice.jpg"
Content-Type: image/jpeg

here-is-some-blob-data

------WebKitFormBoundaryRjHGSmIZUd0iUMK9
Content-Disposition: form-data; name="photoalbum_id"

1

看来数据(和 photoalbum_id 字段)已发送。

但是 Laravel 返回一个内部服务器错误,错误消息为:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'photoalbum_id' cannot be null (SQL: insert into...

在这种情况下我做错了什么?为什么不解析 Laravel 表单数据?

似乎 photoalbum_id 已发送,但您没有将其插入数据库的 photoalbum_id 列。 修复插入代码并将您的数据插入 photoalbum_id 列,或者如果您有时不想将数据插入该列,请将此列设置为可空,或者放置您的控制器代码以更好地帮助 ..

问题是 Laravel 的 csrf protection。您需要将 csrf_token 添加到您的 formData

formData.append('csrfmiddlewaretoken', '{{ csrf_token }}');

或者您可以添加到您的 post header

        headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'},

您还需要添加您的 http.post

    contentType: false,
    processData: false,

这是两个相关的答案first , second

希望对您有所帮助...