@PatriotSY

Почему не работает загрузка файлов на сервер?

Делаю кроп фотографии через ngx-image-cropper и пытаюсь отправить кроп на сервер (PHP Yii2).
Несколько уроков в интернете нашел, везде ± одинаковый алгоритм, но видать что-то упускаю. Итак, компонент:
imageCropped(event: ImageCroppedEvent) {
        this.croppedImage = event.base64;
    }

    uploadAttachmentToServer() {
        const fileToUpload: File = new File([this.croppedImage], 'avatar.png');
        this.profileService.uploadAvatar(fileToUpload).subscribe(data => {
            console.log(data);
        }, error => {
            console.log(error);
        });
    }


В this.croppedImage лежит кропнутый блоб.
Сервис:

export const httpOptions = {
    headers: new HttpHeaders({
        'Content-Type': 'multipart/form-data',
    }),
    observe: 'response' as 'body',
};


    uploadAvatar(file: File): Observable<HttpResponse<any>> {
        const url = `${this.url}/avatar`;
        const formData: FormData = new FormData();
        formData.append('uploadFile', file, file.name);
        return this.http.post<HttpResponse<any>>(url, file, httpOptions);
    }


В итого в нетворке видим, что запрос ушел, а RequestPaylod видно данные файла, что-то типа:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAKACAYAAAAMzckj...


Но в PHP данные приходят не в переменную $_FILES как при обычном механизме отправки формы, а в тело запроса. Можно конечно какие-нибудь надстройки сделать, что бы файл получать из body, а не стандартным механизмом, но может есть еще варианты? Как сделать что бы ангуляр отправлял файл как при обычном ?
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
@PatriotSY Автор вопроса
Разобрался, тут две ошибки:
1) Я отправляю на сервер не форму, а файл, правильно так, это поечатка:
return this.http.post<HttpResponse<any>>(url, formData, httpOptions);
// вместо
return this.http.post<HttpResponse<any>>(url, file, httpOptions);


2) Основная причина в Content-Type. При отправке бэк с PHP, если указать любой, даже пустой, Content-Type, то данные прийдут в тело запроса php://input, без заголовка в $_FILES.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы