Skip to content

Latest commit

 

History

History
74 lines (49 loc) · 2.22 KB

透传上传文件的坑.md

File metadata and controls

74 lines (49 loc) · 2.22 KB

透传上传文件的坑

技术

需求

做一个透传上传文件的接口:

client -文件-> Nest Server -文件-> 第三方服务

实现

在 Nest Server 里使用了 FileInteceptor 来获取上传文件。

@Post('upload')
@UseInterceptors(FileInterceptor('file'))
uploadFile(@UploadedFile() file: Express.Multer.File) {
  console.log(file);
}

然后用 form-data 在 Node 端生成 FormData 再传给第三方服务。

问题

第三方服务一直说我没有把文件传上去。

排查1

后面发现自己太zz了,在 Postman 里没有添加 Content-Type: multipart/form-data

后来又报了这个错误:

multipart: Boundary not found

排查2

经过一顿排查后发现了我的 Postman 还是 Chrome 的插件,这个插件的版本已经非常老了,只有 v5.x,而现在已经到了 v9.x 版本。

推荐别再使用 Chrome 插件版的 Postman 工具,而使用客户端的 Postman

排查3

终于不再报 multipart: Boundary not found 这个错误,转而报没有收到文件的问题,唉。

又一翻排查后,我发现了 Stackoverflow 这个帖子

总的来说就是,你得在 append 的时候要把文件对应的属性都要加上,这个帖子其实不全,应该要把所有 File 的属性都加上 form-data 才会帮你把文件强加上:

async postFileRequest(url: string, file: Express.Multer.File, query: any = {}, options = {}) {
  // 组装 formData
  const formData = new FormData();
  // 每个属性都不能少
  formData.append('media', file.buffer, {
    filename: file.filename,
    contentType: file.mimetype,
    knownLength: file.size,
    filepath: '', // 假的就可以
  });
}