#angular #typescript #file-upload #nestjs
#angular #машинописный текст #загрузка файла #nestjs
Вопрос:
Я пытаюсь загрузить файл из приложения Angular в серверную часть nestjs, но контроллер получает неопределенный файл. Это файловый сервис Angular:
async create(file: File): Promise<string> {
// With console.log I can see file is defined
// file comes directly from the input file (event.target.files[0])
const formData: FormData = new FormData();
formData.append('file', file);
let headers = new HttpHeaders();
headers = headers
.set(
'Content-Type',
`multipart/form-data; boundary=-----${guid.v4()}`
)
.set('Accept', 'application/json');
return await this.http.post<string>('/api/files', formData, { headers }).toPromise();
}
И это метод контроллера:
@Post()
@UseInterceptors(FileInterceptor('file'))
async create(@UploadedFile() file: any) {
return await this.files.create(file.buffer);
}
Перехватчик http сообщает: TypeError: Cannot read property 'buffer' of undefined
.
Я попытался загрузить файлы с помощью postman, и это работает, я предполагаю, что я что-то упускаю в своем угловом коде.
Комментарии:
1. Каково было ваше решение?
2. К сожалению, я пока не нашел решения этой проблемы. Мне нужно было для личного проекта, который мне пришлось отложить на данный момент. Вы нашли решение для этого?
3. Попробуйте удалить
multipart/form-data
заголовок? Мне это кажется чрезмерным. Я выполнял простые запросы post из angular почти идентично этому без этого заголовка, установленного вручную, как вы делаете, и он работает с multer / FileInterceptor.4. Да, удаление заголовка сработало.
Ответ №1:
Попробуйте что-то вроде этой функции create():
return this.http.patch<any>(
`${this.domain}/users/avatar/upload/${id}`,
formData,
{
headers: new HttpHeaders()
.set("Accept", "application/json") // <=== there is the point
}
);
это сработало для меня.