【问题标题】:Upload file from external url to S3将文件从外部 url 上传到 S3
【发布时间】:2021-12-03 03:28:45
【问题描述】:

我正在尝试将图像从外部 url 上传到 S3。

目前,我可以成功上传文件,但下载并打开后,我发现它已损坏。

这是我正在使用的代码(got 就是我用来获取资源的代码):

const got = require('got');
const Web3 = require('web3');

const s3 = new AWS.S3({
    accessKeyId: AWS_ACCESS_KEY_ID,
    secretAccessKey: AWS_SECRET_ACCESS_KEY,
});

const response = await got('https://example.com/image.jpg');

const uploadedFile = await s3
    .upload({
        Bucket: 'my_bucket',
        Key: 'images/',
        Body: response.body,
        ContentType: 'image/jpeg',
    })
    .promise();

我尝试创建一个缓冲区,并使用 putObject 而不是上传,但我最终得到的文件在 S3 上只有几个字节。

【问题讨论】:

标签: javascript node.js amazon-web-services amazon-s3


【解决方案1】:

获取对象的请求将其转换为字符串。几乎任何你选择的编码都会破坏它,因为 JPG 是二进制数据,不应该用字符串的编码来表示。

got 库的文档指出:

编码

输入:string

默认:'utf8'

在响应数据的 setEncoding 上使用的编码。

要获取 Buffer,您需要将 responseType 设置为 buffer。不要将此选项设置为 null。

换句话说,如果您将下载更改为:

const response = await got('https://example.com/image.jpg', {'responseType': 'buffer'});

通过将其编码为字符串,您将获取并上传一个 Buffer 对象,而无需对其进行更改。

【讨论】:

    【解决方案2】:

    当您将文件上传到 S3 时,您的密钥错误:

    Key: 'images/'
    

    它不能是images/,因为这会将图像上传到代表文件夹的对象。虽然这可能适用于 Windows/Mac 笔记本电脑上的本地文件系统,但它不适用于对象存储。它需要是一个代表文件的键,例如:

    Key: 'images/image.jpg'
    

    【讨论】:

      【解决方案3】:

      Ermiya Eskandary 提到的通过流执行此操作似乎有效:

      const response = got.stream('https://example.com/image.jpg');
      

      【讨论】:

        猜你喜欢
        • 2018-02-07
        • 2015-04-12
        • 2019-08-17
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 2012-03-07
        • 2020-12-10
        • 2011-07-21
        相关资源
        最近更新 更多