繁体   English   中英

从 Url 下载文件并上传到 AWS S3 存储桶

[英]Download file from Url and upload to AWS S3 bucket

我正在创建一个系统来上传使用节点快速服务器发送到 WhatsApp 机器人的文件。

当我的服务器从 whatsapp 获取数据时,req.body 中有一个指向媒体文件的链接,我希望能够从该链接获取文件并将其上传到 AWS S3 存储桶。 我还想获取文件类型,即通常为 jpg 或 pdf。

我玩过 Johann Philipp Strathausen 的这段代码

var fs = require('fs');
var zlib = require('zlib');

var body = fs.createReadStream('bigfile').pipe(zlib.createGzip());
var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}});
s3obj.upload({Body: body})
  .on('httpUploadProgress', function(evt) { console.log(evt); })
  .send(function(err, data) { console.log(err, data) });

使用它执行最后一行时出现以下错误

错误:ENOENT:没有这样的文件或目录,打开“url/from/whatsapp/api”在以下位置发出“错误”事件:

在lazyFs.open (internal/fs/streams.js:115:12)

在 FSReqWrap.args [as oncomplete] (fs.js:140:20)

最后我使用 axios 获取文件并将其传递给 s3upload function

const whatsAppUpload = async (file) => {
    try{
        let {data, headers} = await axios.get(file, {responseType: 'stream'});
        let id = crypto.randomBytes(8).toString('hex');
        let link = headers['content-type'];
        let format = link.split("/").pop();
        let key = Date.now() + id + "." + format;
        const objectParams = {
            Bucket: 'bucket-name-here',
            ACL: 'public-read',
            ServerSideEncryption: 'AES256',
            ContentLength: headers['content-length'],
            Body: data,
            ContentType: headers['content-type'],
            Key: key
        };
        data = await s3.upload(objectParams).promise();
        console.log(`File uploaded successfully. ${data.Location}`);
    } catch(err){
        console.log("ERROR --->" + err)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM