2017-04-04 121 views
0

目前,我正在使用putObject通過REST API調用將大文件上傳到AWS s3。使用express js synchrounsly將大文件上傳到AWS s3

var params ={    
    Bucket:'lambdacushbu',  
    Key:req.files.image.name, 
    Body:req.files.image.data 
}        
    s3.putObject(params,function(err, data) {      
     if (err) console.log(err, err.stack); // an error occurred  
     else  {              
      console.timeEnd('Uploadtime');        
      console.log("uploaded",data);        
      res.json({             
       'status':'Uploaded',          
       'url':data.Location          
      });               
     }   // successful response        
    });           

但它看起來像異步我希望在同步模式上面也發生超時,但文件正在上傳到AWS s3。

那麼如何增加超時值?試圖用connect-timeout

app.use(timeout('600000')); 

但是這麼想的工作

+0

嘗試multer-S3庫 – hjpotter92

+0

但是multer是異步? –

回答

1

使用upload函數代替putObject嘗試。這應該解決您的超時問題。

下面是該功能的文檔:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property

同步調用,肯定會降低你的應用程序的性能。你能提供給我更多關於你的問題的細節,所以我們可以找到一個異步解決方案嗎?

編輯: 下面是你應該在你的控制器返回響應:

router.post('/your-route', 
    //additional middlewares 
    function(req, res, next) { 
    var params = {    
     Bucket:'lambdacushbu',  
     Key:req.files.image.name, 
     Body:req.files.image.data 
     }        
     s3.upload(params,function(err, data) {      
     if (err) { res.json(err); }  
     else {               
      res.json({             
      'status':'Uploaded',          
      'url':data.Location          
     } 
     });            
    } 
); 

並確保你不叫res.json()res.send()其他地方在這條航線

+0

上傳是通過REST api調用i(來自移動設備)和它的異步啓動的,但其餘的api已經響應了respnse。所以我怎麼知道上傳已完成或沒有在客戶端 –

+0

在S3上傳完成後,您應該將響應返回給客戶端。 我會修改我的答案並提供一個代碼示例 –

+0

這種方法非常好。但是,當我看到性能時,AWS S3命令行將在3分鐘內上傳3GB文件,而此命令在15分鐘內完成相同的操作。有沒有辦法加快速度? – Ashish