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

从外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:27:03