Laravel 5.7 не может разобрать запрос POST multipart / form-data - PullRequest
0 голосов
/ 06 января 2019

Я использую этот код в Angular для отправки данных на мою Laravel 5.7 конечную точку API как multipart/form-data:

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 голосов
/ 06 января 2019

Проблема в защите Laravel csrf . Вам нужно добавить csrf_token в formData

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

или вы можете добавить в заголовок своего поста

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

также вам нужно добавить свой http.post

    contentType: false,
    processData: false,

Вот два связанных ответа первый , второй

Надеюсь, это поможет ...

0 голосов
/ 06 января 2019

кажется, что photoalbum_id был отправлен, но вы не вставляете его в базу данных в столбец photoalbum_id. исправьте код вставки и вставьте свои данные в столбец photoalbum_id ИЛИ если вы иногда не хотите вставлять данные в этот столбец, сделайте этот столбец обнуляемым ИЛИ поместите свой код контроллера, чтобы помочь лучше ..

...