2012-02-11 133 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) { 
     // .....  
    }); 
    }); 
});