从外部URL上传文件到AWS S3后下载文件损坏问题求助
问题原因
- got默认返回UTF-8编码的字符串格式响应体,二进制图片资源被强制转为字符串时会发生不可逆的编码破坏,这是文件损坏的核心原因
- S3上传参数中的
Key字段仅填写了目录images/,未指定完整的文件名,会导致上传结果不符合预期
修复方案
方案1:Buffer模式(小文件适用)
给got请求添加responseType: 'buffer'配置,直接获取二进制Buffer,同时补全Key的文件名:
const got = require('got'); const AWS = require('aws-sdk'); // 原代码缺失该引入需补充 const s3 = new AWS.S3({ accessKeyId: AWS_ACCESS_KEY_ID, secretAccessKey: AWS_SECRET_ACCESS_KEY, }); // 新增responseType配置获取二进制Buffer const response = await got('https://example.com/image.jpg', { responseType: 'buffer' }); const uploadedFile = await s3 .upload({ Bucket: 'my_bucket', Key: 'images/uploaded_image.jpg', // 补全完整的文件名 Body: response.body, ContentType: 'image/jpeg', }) .promise();
方案2:流模式(大文件适用,内存占用更低)
直接将got的请求流作为Body传入,不需要等待全量资源下载完成即可开始上传:
const imageStream = got.stream('https://example.com/image.jpg'); const uploadedFile = await s3 .upload({ Bucket: 'my_bucket', Key: 'images/uploaded_image.jpg', Body: imageStream, ContentType: 'image/jpeg', }) .promise();
额外说明
如果使用putObject方法,上述两种Body传参方式同样适用,只需要把upload替换为putObject即可,不需要额外做Buffer转换。
内容的提问来源于stack exchange,提问作者committer
相关产品推荐
相关产品推荐

