2012-02-11 64 views
14

在我的node.js应用程序中,我使用的是gm (a graphicsmagick wrapper)aws2js (amazon cli wrapper)。问题是亚马逊需要知道内容长度,以便我可以将流传输到S3上。获取流的内容长度

我的图片上传到我的应用程序,通过创建一个流中读取该文件:

var fileStream=fs.createReadStream(file.path) 

我传递文件,以通用,调整其大小,然后告诉它流该文件。然后,我希望把他们流AWS:

gm(fileStream, "some.png").        
    identify({bufferStream: true}, function(err, info) { 
     this.stream("png", function (err, stdout, stderr) { 
      if (err){console.log(err);cb(err);return;} 

      aws.S3.putStream(path, stdout, 'public-read', {'content-length': ?????, 'content-type': 'image/png'}, function (err, result) { 
      .....  
      } 
     }); 
    }); 
}); 

的问题是,亚马逊需要知道的内容长度(它不是库)放流。 AWS不支持分块流。

有谁知道我怎么能确定一个流的内容长度?或者唯一的解决方案是将tmp写入磁盘,将文件作为流读取,然后将其与temp文件的内容长度一起放入amazon中?

+0

你有没有想过这个?我正在尝试做同样的事情...... – Bill 2012-08-07 23:48:00

+1

Bill;我缓冲结果并获得它的大小。可悲的是,没有其他的方法可以做到这一点,因为亚马逊需要知道尺寸和流是否合适 - 流 - 没有固定的长度。 – japrescott 2012-08-13 12:00:42

回答

1

这取决于你如何做上传。我使用express.js,并从req.files对象获取长度,例如req.files。[file input name] .length。

我实际上正在尝试做同样的事情,但我遇到了aws2js识别流的问题。让我知道如果你得到它的工作。

+0

一切正常,如果我直接把流(因为我有实际的文件大小,我刚刚上传)。但是,因为我正在调整大小,调整大小的文件将有一个不同的内容长度,我需要dermin ..我会让你张贴.. – japrescott 2012-02-11 16:48:04

+0

啊,我忘了这一点。我需要做同样的事情。由于某种原因,我从S3中收到400错误。 – jabbermonkey 2012-02-12 16:51:37

+0

我想你可能使用Express语法解析器,这就是为什么你有一个“req.files”可用。身体解析器实际上将保存文件(这就是为什么你可以得到文件的大小),我相信这是OP试图避免做的。你失去了将流直接输送到S3的优势。 – schankam 2017-12-11 13:15:21

2
gm(fileStream).filesize({bufferStream: true}, function (error, filesize) { 
    this.stream(function (error, stdout, stderr) { 
    aws.S3.putStream(path, stdout, 'public-read', {'content-length': filesize, 'content-type': 'image/png'}, function (error, result) { 
     // .....  
    }); 
    }); 
});