NestJS - 文件上传到微服务

Posted

技术标签:

【中文标题】NestJS - 文件上传到微服务【英文标题】:NestJS - File upload to microservice 【发布时间】:2020-01-14 16:55:48 【问题描述】:

我需要将文件上传到 API 网关。添加一些元信息后,文件应该被发送到另一个(微)服务(如 Content-Type:multipart/form-data)。我在 API-Gateway 中构建 FormData 对象时遇到了一些问题。我不想将文件保留在网关上,所以我基本上只是想通过它。

为了创建formData-object,我使用Form-Data

这是尝试过的:

    // Controller
    @Post()
    @UseInterceptors(FileInterceptor('file'))
    async create(@Res() res, @UploadedFile('file') file, @Body() body: any) 
        return await this.someService.create(file);
    
    // Service
    async create(file: any) 
        const formData = new FormData();

        formData.append('file', file);
        formData.append('key', 'value');

        const formHeaders = formData.getHeaders();

        try 
            const result = await this.httpService

                .post('http://some-other-service/import', formData , 
                    headers: 
                        ...formHeaders,
                    ,
                )
                .toPromise();
            return result.data;
         catch (e) 
            throw new BadGatewayException();
        
    

这会导致以下错误:

TypeError: source.on is not a function
at Function.DelayedStream.create (/usr/app/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
at FormData.CombinedStream.append (/usr/app/node_modules/combined-stream/lib/combined_stream.js:44:37)
at FormData.append (/usr/app/node_modules/form-data/lib/form_data.js:74:3)
at ImportService.<anonymous> (/usr/app/src/import/import.service.ts:47:18)

【问题讨论】:

【参考方案1】:

这个问题有点老了,但有人可能会从这个解决方案中受益。

问题是您将整个 @UploadedFile 对象传递给 formData.append 方法。 @UploadedFile 对象包含来自文件的数据,还包含 mimetype、大小、字段名(在本例中为“文件”)、原始名称(原始文件名)等。

您需要将您尝试上传的文件的实际内容传递给 formData.append 方法。

所以要让它工作,请使用

formData.append('file', file.buffer);

//OR 
formData.append('file', file.buffer, file.originalname);

【讨论】:

以上是关于NestJS - 文件上传到微服务的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nestjs-graphql-fastify 服务器上传文件以及如何测试此类功能?

文件上传(图片语音等上传到微信服务器)

nestjs 文件上传

无法使用 NestJs 和 Multer 上传文件

如何使用nestJS将文件上传到mongoose上的mongodb?

NestJS 中的 FileInterceptor 和 Body 问题(在请求中上传文件和数据)