Node.js 通过API请求将PDF文件上传至AWS S3的问题求解
解决方案
拉取PDF的方式说明
你用responseType: 'stream'拉取PDF是最优方案,不需要将文件写入本地磁盘,也不需要把整个文件加载到内存,完美适配你无本地存储路径的场景,性能比拉取全量Buffer更高。
上传代码修复
你当前卡壳的部分有3个需要修正的点:
- 首先要实例化FormData对象,现有逻辑缺少该步骤
file字段直接传入拉取到的PDF可读流即可,第三个参数补充文件名保证S3识别正常- 上传请求的
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
相关产品推荐
相关产品推荐

