【问题标题】:Upload large files to AWS s3 using express js synchrounsly使用 express js 同步将大文件上传到 AWS s3
【发布时间】:2017-04-04 19:34:49
【问题描述】:

目前我正在使用 putObject 通过 REST api 调用将大文件上传到 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'));

但是没有用

【问题讨论】:

  • 试试 multer-s3 库
  • 但是 multer 是异步的??

标签: node.js amazon-web-services express amazon-s3


【解决方案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()

【讨论】:

  • 上传是通过 REST api 调用 i(From mobile) 和它的异步启动的。但是其余的 api 已经发出了响应。那我怎么知道上传是否在客户端完成
  • 在 S3 上传完成后,您应该向客户端返回响应。我将修改我的答案并为您提供代码示例
  • 这种方法确实不错。但是当我看到性能时,AWS S3 命令行在 3 分钟内上传了一个 3gb 的文件,而这个命令在 15 分钟内完成了同样的事情。有没有办法加快速度?
猜你喜欢
  • 2020-09-25
  • 2019-12-16
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多