【问题标题】:Downloading heavy images(>2GB) from server using NodeJS使用 NodeJS 从服务器下载大量图像(> 2GB)
【发布时间】:2019-08-23 15:18:35
【问题描述】:

我在我的项目中使用 AngularJS 和 NodeJS。我将我的图像存储到与 AWS-EC2 实例连接的 AWS-EFS 存储中。在我下载小图像(小于 1 GB)之前一切正常。当我尝试下载大图像(大于 1 GB)时,它会抛出错误。

这是我的后端代码,

getTiff: function(req, res)
   {
       res.set('Content-Type', 'application/octet-stream')
       var name = req.param('filename').split('.')[0]
       var id = req.param('id')
       var filePath = '/mys3storage/' + id + '/' + name + 
       '/3_dsm_ortho/2_mosaic/' + name + '_transparent_mosaic_group1.tiff'
       files = fs.readFileSync(filePath)
       res.send(files)
},

错误:发送 500(“服务器错误”)响应:

RangeError: Invalid typed array length
    at new Uint8Array (native)
    at createBuffer (buffer.js:23:15)
    at allocate (buffer.js:98:12)
    at new Buffer (buffer.js:53:12)
    at Object.fs.readFileSync (fs.js:419:16)
    at Object.module.exports.getAutocad.res.getContourLines.res.getContourPdf.res.getOrthoM (G:\desktop\unifliBackend\api\controllers\WebController.js:153:20)
    at wrapper (G:\desktop\unifliBackend\node_modules\@sailshq\lodash\lib\index.js:3250:19)
    at routeTargetFnWrapper (G:\desktop\unifliBackend\node_modules\sails\lib\router\bind.js:181:5)
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:164:37)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:138:11)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:135:11)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:135:11)
    at pass (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:145:5)
    at nextRoute (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:100:7)
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:167:11)
    at alwaysAllow (G:\desktop\unifliBackend\node_modules\sails\lib\hooks\policies\index.js:224:11)
    at routeTargetFnWrapper (G:\desktop\unifliBackend\node_modules\sails\lib\router\bind.js:181:5)
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:164:37)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:138:11)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:135:11)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:135:11)
    at pass (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:145:5)
    at nextRoute (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:100:7)
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:167:11)
    at G:\desktop\unifliBackend\node_modules\sails\lib\router\bind.js:232:18
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:164:37)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:138:11)
    at pass (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:145:5)
    at nextRoute (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:100:7)
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:167:11)
    at G:\desktop\unifliBackend\node_modules\sails\lib\router\bind.js:232:18
    at callbacks (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:164:37)
    at param (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:138:11)
    at pass (G:\desktop\unifliBackend\node_modules\@sailshq\express\lib\router\index.js:145:5)

我也尝试过使用 createReadStream() 但我可以一次下载一个文件,在第二个文件上它会给我浏览器上的网络失败错误。请帮忙!


getTiff: function(req, res) {
    res.set('Content-Type', 'application/octet-stream')
    var name = req.param('filename').split('.')[0] 
    var filePath = req.param('id') var filePath = '/mys3storage/' + id + '/' + name + '/3_dsm_ortho/2_mosaic/' + name + '_transparent_mosaic_group1.tiff'
    fs.createReadStream(filePath).pipe(res)
}

这是我使用的流代码。当我一次下载一个文件时它工作正常。如果尝试一次下载到两个文件,它将停止第二个文件并从浏览器显示“网络失败”

这是我的浏览器端代码:

$scope.downloadOrthoMission = function(idForDownload, missionIdForDownload) {
    window.open(adminurl + 'getTiff/' + idForDownload + '/' + missionIdForDownload + '.tif', '_self')
}

【问题讨论】:

  • 您肯定希望流式传输这些大文件,这样就不必将它们全部读入服务器内存(这似乎是您的错误消息的内容)。你确定浏览器本身可以处理这么大的图像吗?
  • 是的,当我尝试使用 createReadStream 时,浏览器可以处理这种图像大小,但它不允许我在同一实例下载第二个文件。
  • 切换到流式传输大文件,并就您遇到的任何问题提出问题。
  • 好吧,如果您向我们展示您尝试过的流式传输代码并向我们准确展示发生了什么错误,我们只能帮助您解决流式传输问题。对于我们看不到的代码和您不分享的错误,真的无能为力。
  • getTiff: function(req, res) { res.set('Content-Type', 'application/octet-stream') var name = req.param('filename').split(' .')[0] var id = req.param('id') var filePath = '/mys3storage/' + id + '/' + name + '/3_dsm_ortho/2_mosaic/' + name + '_transparent_mosaic_group1.tiff' fs .createReadStream(filePath).pipe(res) } 这是我使用的流代码。当我一次下载一个文件时它工作正常。如果尝试一次下载到两个文件,它将停止第二个文件并从浏览器显示“网络失败”

标签: node.js angularjs amazon-ec2


【解决方案1】:

刚刚提到这个答案,

Nginx node.js express download big files stop at 1.08GB

它对我来说绝对没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2017-03-11
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多