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

3

我在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返回了500服务器内部错误,显示以下错误消息:

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

在这种情况下,我做错了什么?为什么Laravel没有解析表单数据?
2个回答

2
问题在于 Laravel 的 csrf 保护。您需要将 csrf_token 添加到您的 formData 中。
formData.append('csrfmiddlewaretoken', '{{ csrf_token }}');

或者您可以在帖子标题中添加。
        headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'},

你还需要添加你的 http.post
    contentType: false,
    processData: false,

这里是两个相关的答案:firstsecond 希望能有所帮助...

1
感谢您的回答,但是我没有使用 csrf_token,我使用 JWT 进行授权,并且 JWT 令牌已经在请求头中了。不过将 contentType: false(从头部删除 Content-Type 选项)确实有所帮助。谢谢! - netdjw

-3

看起来已经发送了photoalbum_id,但您没有将其插入到photoalbum_id列中的数据库中。 修复插入代码并将数据插入到photoalbum_id列中,或者如果您有时不想将数据插入到该列中,则使此列可为空,或者将控制器代码放置在更好的位置以提供帮助..


SQL插入代码是正确的,在Postman中进行了测试,但问题已经得到解答。谢谢! - netdjw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接