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

Node.js 通过API请求将PDF文件上传至AWS S3的问题求解

解决方案

拉取PDF的方式说明

你用responseType: 'stream'拉取PDF是最优方案,不需要将文件写入本地磁盘,也不需要把整个文件加载到内存,完美适配你无本地存储路径的场景,性能比拉取全量Buffer更高。

上传代码修复

你当前卡壳的部分有3个需要修正的点:

  1. 首先要实例化FormData对象,现有逻辑缺少该步骤
  2. file字段直接传入拉取到的PDF可读流即可,第三个参数补充文件名保证S3识别正常
  3. 上传请求的Content-Type不能手动硬写,需要使用FormData实例自动生成的带boundary的请求头,否则S3会无法解析表单内容

完整可运行代码

const axios = require('axios');
const FormData = require('form-data');

const uploadUrl = working_location_supplied_as_params.url
const uploadFileName = "string_of_pdf_name.pdf"
const uploadEndpoint = "https://workinglocation.com"

// 1. 拉取PDF流
const pdfResponse = await axios.get(uploadUrl, {responseType: 'stream'});

// 2. 获取S3上传预签名配置
const uploadPrepConfig = {
  method: 'post',
  url: uploadEndpoint,
  headers: {...},
  data: {
    response_content_type: 'application/pdf',
    response_file_name: uploadFileName,
  },
};
const uploadConfig = await axios(uploadPrepConfig);
const fileDestURL = uploadConfig.data.url
const objToUpload = uploadConfig.data.fields

// 3. 组装FormData
const uploadData = new FormData()
// 填充S3所需的鉴权字段
for (const [key, value] of Object.entries(objToUpload)) {
  uploadData.append(key,value)
}
// 追加PDF文件流,第三个参数指定文件名
uploadData.append('file', pdfResponse.data, uploadFileName)

// 4. 上传到S3
const getToS3Please = await axios({
  method: 'post',
  url: fileDestURL,
  // 合并FormData自动生成的请求头,不要手动写multipart/form-data
  headers: {
    ...uploadData.getHeaders()
  },
  data: uploadData,
})

备选Buffer方案(如果你已经拿到PDF Buffer)

如果你的逻辑已经拿到了PDF的Buffer数据,只需要修改append的第二个参数即可:

// 假设pdfBuffer是你已经获取到的PDF Buffer对象
uploadData.append('file', pdfBuffer, {
  filename: uploadFileName,
  contentType: 'application/pdf'
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:39:01