2015-06-10 55 views
15

我正在使用Node SDK將文件上傳到Amazon S3。節點JS AWS S3文件上傳。如何獲得公共URL響應

文件上傳工作正常,但我想獲取文件的公共網址發送回客戶端。

目前我得到的迴應是:

Successfully uploaded data { ETag: '"957cd1a335adf5b4000a5101ec1f52bf"' } 

這裏是我的代碼。我正在使用Node Express服務器,Multer負責處理上傳。

app.use(multer({ // https://github.com/expressjs/multer 
     dest: './public/uploads/', 
     limits : { fileSize:100000 }, 
     rename: function (fieldname, filename) { 
     var time = new Date().getTime(); 
     return filename.replace(/\W+/g, '-').toLowerCase() + time; 
     }, 
     onFileUploadData: function (file, data, req, res) { 
     // file : { fieldname, originalname, name, encoding, mimetype, path, extension, size, truncated, buffer } 
     var params = { 
      Bucket: creds.awsBucket, 
      Key: file.name, 
      Body: data, 
      ACL: 'public-read' 
     }; 

     var s3 = new aws.S3() 
     s3.putObject(params, function (perr, pres) { 
      if (perr) { 
      console.log("Error uploading data: ", perr); 
      } else { 
      console.log("Successfully uploaded data", pres); 
      } 
     }); 
     } 
    })); 

    app.post('/upload-image', function(req, res){ 
     if(req.files.file === undefined){ 
      res.send("error, no file chosen"); 
     } 
    }); 
+0

你如何做這個工作,我得到「錯誤初始化中間件 類型錯誤:app.use()需要中間件功能」的消息 – someUser

回答

16

使用upload,而不是putObject。 它將返回公共URL在位置關鍵

+3

怪異。 'putObject(...)。promise()'工作正常,但'upload(...)。promise()'未定義。他們爲什麼這樣做。 – Richard

+1

@Richard做putObject(...)。promise()'返回一個位置關鍵字的公共URL,因爲我自己找不到它。以下是2016年7月的一些信息:Promise目前僅支持返回Request對象的操作。由於s3.upload是一個返回ManagedUpload實例而不是Request的自定義函數,因此當前不支持promises [reference](https://github.com/aws/aws-sdk-js/issues/1076# issuecomment-235941953) – Marklar