You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用预签名URL上传CSV至S3时文件含boundary数据,如何获取原始数据?

解决S3预签名PUT URL上传CSV后出现multipart边界信息的问题

这个问题我之前也碰到过,核心原因是你用Postman的form-data方式上传文件时,自动添加了multipart格式的包裹信息,但S3的putObject预签名URL只接收原始文件内容,不处理表单格式。下面给你具体的解决步骤和原理:

为什么会出现这个问题?

当你通过Postman UI选择文件添加到请求体时,Postman默认会将请求的Content-Type设为multipart/form-data,这会自动在文件内容前后插入boundary分隔符、表单字段描述等额外信息。比如你上传的CSV原本是:

name,age
Alice,30
Bob,25

但Postman会把它包装成类似这样的内容存在S3里:

--------------------------1234567890
Content-Disposition: form-data; name="file"; filename="temp.csv"
Content-Type: text/csv

name,age
Alice,30
Bob,25
--------------------------1234567890--

这些额外的边界信息就被当成了文件的一部分,导致你打开时看到异常内容。

正确的Postman上传方式

要让S3只保存原始CSV内容,你需要用binary模式上传,步骤如下:

  • 打开你的PUT请求,切换到「Body」标签页
  • 选择「binary」选项(不要选form-data)
  • 点击「Select File」按钮,选择你的temp.csv文件
  • 确保没有添加额外的请求头(除非你生成预签名URL时指定了ContentType参数,那需要在Headers里匹配对应的Content-Type,比如text/csv)
  • 发送请求,之后去S3查看文件,就能看到原始的CSV数据了

补充:如果需要支持表单上传怎么办?

如果你的场景是前端通过HTML表单提交文件到S3,那不能用putObject的预签名URL,而是需要生成S3的预签名POST表单。这种方式会生成包含签名的表单字段,前端可以直接用multipart/form-data格式提交,S3会自动解析表单并保存原始文件内容。生成预签名POST表单的Node.js代码示例大概是这样:

const params = {
  Bucket: BUCKET_NAME,
  Key: 'temp.csv',
  Expires: 30,
  Fields: {
    'Content-Type': 'text/csv'
  }
};

s3.createPresignedPost(params, (err, data) => {
  if (err) {
    console.error('Error creating presigned post', err);
    return;
  }
  // 返回给前端的表单信息
  console.log('Presigned post data', data);
});

内容的提问来源于stack exchange,提问作者andy mccullough

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:13