簡體   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