有没有办法使用node.js从URL上传到S3?

时间:2013-05-28 23:44:10

标签: node.js amazon-s3 upload knox-amazon-s3-client

我发现了这个问题,但它似乎没有回答我的问题,因为我认为它仍在讨论本地文件。

我想接受,并且imgur.com链接并使用节点将其上传到S3。 knox能够做到这一点还是我需要使用别的东西?

不知道从哪里开始。

5 个答案:

答案 0 :(得分:15)

我没有使用knox,而是官方AWS SDK for JavaScript in Node.js。我向{encoding: null}的网址发出请求,以便检索缓冲区中的数据,该数据可以直接传递给Body的{​​{1}}参数。以下是使用aws-sdkrequest将远程图像放入存储桶的示例。

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
  });
});