使用multipart/form-data上传CSV到S3后文件内嵌HTTP头问题咨询
S3预签名URL使用multipart/form-data上传CSV内容异常排查思路
首先核心问题本质:S3的普通PUT预签名URL不会解析multipart/form-data格式的请求体,会把请求内的边界标识、表单字段头等所有内容原样存储为对象内容,这就是你下载的CSV中出现额外HTTP头内容的原因。
排查步骤
- 检查Nest.js服务端预签名URL生成逻辑
确认调用S3 SDKgetSignedUrl('putObject')时传入的ContentType参数是否强制设置为了multipart/form-data。如果生成预签名URL时指定了该参数,请求时就必须带对应Content-Type头,但普通单文件上传不需要用multipart格式,直接指定ContentType: 'text/csv'即可匹配你正常上传的逻辑。 - 抓包验证两种上传的请求体差异
打开Postman控制台查看原始请求体:text/csv头的PUT请求,请求体仅包含CSV文件的原始内容,无额外附加信息multipart/form-data头的PUT请求,请求体前后包含----WebKitFormBoundaryxxx类的边界标识,还附带Content-Disposition等表单头信息,这些都会被S3直接存入文件内容
- 区分两个容易混淆的概念
注意S3的multipart分块上传接口和HTTP请求的multipart/form-data格式是完全无关的两个功能:前者是大文件拆分多块上传的S3专属能力,后者是HTTP协议用于表单提交多字段/多文件的请求格式,普通单文件上传到S3预签名URL完全不需要用到后者。 - 特殊场景兼容方案
如果你因为前端组件限制必须使用multipart/form-data格式上传,不要直接让客户端请求S3预签名URL,改为在Nest.js服务端新增接口接收multipart请求,解析出CSV文件的纯二进制内容后,再调用S3putObject接口上传即可。
内容的提问来源于stack exchange,提问作者KIM
相关产品推荐
相关产品推荐

