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

时间:2020-08-07 10:10:38

标签: node.js express amazon-s3 file-upload whatsapp

我正在创建一个系统,以使用节点快递服务器上传发送到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” 在以下位置发出的“错误”事件:

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

在FSReqWrap.args中的

[作为完整完成时(fs.js:140:20)

1 个答案:

答案 0 :(得分:0)

最后,我使用axios来获取文件并将其传递给s3upload函数

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