Angular отправляет неопределенный файл в контроллер nestjs

#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      
      }
    );
 

это сработало для меня.