Laravel 5.7无法解析POST多部分/表单数据请求

时间:2019-01-05 23:27:49

标签: laravel laravel-5 multipartform-data

我在Angular中使用此代码将数据作为Laravel 5.7发送到我的multipart/form-data 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表单数据?

2 个答案:

答案 0 :(得分:2)

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

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

或者您可以将其添加到帖子标题中

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

还需要添加 http.post

    contentType: false,
    processData: false,

这是两个相关的答案firstsecond

希望有帮助...

答案 1 :(得分:0)

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