我在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表单数据?
答案 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,
希望有帮助...
答案 1 :(得分:0)
似乎photoalbum_id已发送,但您没有将其插入数据库中的photoalbum_id列。 修复插入代码,然后将数据插入到photoalbum_id列中;或者,如果您有时不希望将数据插入到该列中,请将该列设置为可空,或者放置控制器代码以帮助更好..