从外部url上传文件到S3



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

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

下面是我使用的代码(get就是我用来获取资源的代码):

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上只有几个字节。

获取对象的请求正在将其转换为字符串。无论你选择什么编码都会破坏它,因为JPG是二进制数据,不能用字符串的编码来表示。

got库的文档说明:

编码类型:string

默认值:'utf8'

响应数据的setEncoding中使用的编码。

要获得Buffer,您需要将responseType设置为Buffer。不要将此选项设置为空。

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

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

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

上传文件到S3时密钥错误:

Key: 'images/'

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

Key: 'images/image.jpg'

通过Ermiya Eskandary提到的流来做似乎是有效的:

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

最新更新