2017-04-04 119 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