我正在尝试从外部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');