我发现了这个问题,但它似乎没有回答我的问题,因为我认为它仍在讨论本地文件。
我想接受,并且imgur.com链接并使用节点将其上传到S3。 knox能够做到这一点还是我需要使用别的东西?
不知道从哪里开始。
答案 0 :(得分:15)
我没有使用knox,而是官方AWS SDK for JavaScript in Node.js。我向{encoding: null}
的网址发出请求,以便检索缓冲区中的数据,该数据可以直接传递给Body
的{{1}}参数。以下是使用aws-sdk和request将远程图像放入存储桶的示例。
s3.putObject()
答案 1 :(得分:4)
对于那些正在寻求基于{micmia代码的doesn't involves callbacks
并且更喜欢promises
的解决方案的人,这里是另一种选择:
var AWS = require('aws-sdk'),
request = require('request');
const bucketName='yourBucketName';
const bucketOptions = {...Your options};
var s3 = new AWS.S3(options);
function UploadFromUrlToS3(url,destPath){
return new Promise((resolve,reject)=> {
request({
url: url,
encoding: null
}, function(err, res, body) {
if (err){
reject(err);
}
var objectParams = {
ContentType: res.headers['content-type'],
ContentLength: res.headers['content-length'],
Key: destPath,
Body: body
};
resolve(s3.putObject(objectParams).promise());
});
});
}
UploadFromUrlToS3(
'http://a0.awsstatic.com/main/images/logos/aws_logo.png',
'your/s3/path/aws_logo.png' )
.then(function() {
console.log('image was saved...');
}).catch(function(err) {
console.log('image was not saved!',err);
});
答案 2 :(得分:2)
在@Yuri的帖子的基础上,对于那些想使用axios
而不是request
和ES6语法来实现更现代方法的用户,+在{{1 }}(它会下载任何文件,而不仅仅是图像):
Bucket
答案 3 :(得分:0)
与上述答案相同,但具有 fetch:
async function upload(url: string, key: string, bucket: string) {
const response = await fetch(url)
const contentType = response.headers.get("content-type") ?? undefined;
const contentLength =
response.headers.get("content-length") != null
? Number(response.headers.get("content-length"))
: undefined;
return s3
.putObject({
Bucket: bucket,
Key: key,
ContentType: contentType,
ContentLength: contentLength,
Body: response.body, // buffer
})
.promise();
}
答案 4 :(得分:-1)
是。在knox README中有一个这样做的例子
http.get('http://google.com/doodle.png', function(res){
var headers = {
'Content-Length': res.headers['content-length']
, 'Content-Type': res.headers['content-type']
};
client.putStream(res, '/doodle.png', headers, function(err, res){
// Logic
});
});