2012-02-11 2 views
14

私のnode.jsアプリケーションでは、gm (a graphicsmagick wrapper)aws2js (amazon cli wrapper)を使用しています。問題は、Amazonがコンテンツの長さを知っている必要があり、ストリームをS3に置くことができるということです。 、ストリームのコンテンツの長さを取得

var fileStream=fs.createReadStream(file.path) 

私はGMにそのファイルを渡してサイズを変更してから、そのファイルをストリーミングすることを教えて:私は私のアプリに画像をアップロードしてい

は、ストリームを作成することによって、そのファイルを読み込みます。私は、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) { 
      .....  
      } 
     }); 
    }); 
}); 

問題はAmazonがストリームを置くために、コンテンツの長さ(そのないライブラリを)知っている必要があるということです。 AWSはチャンクストリームをサポートしていません。

ストリームのコンテンツの長さをどのように判断することができますか?または、唯一の解決策は、ディスクに書き込み、ストリームとしてファイルを読み込んだ後、一時ファイルの内容の長さのアマゾンに置くことです。

+0

あなたはこれを解明しましたか?私はまったく同じことをしようとしています... – Bill

+1

Bill;私は結果をバッファリングし、そのサイズを取得します。悲しいことに、アマゾンはサイズを知る必要があり、ストリームがうまくいくので、それを行う他の方法はありません - ストリームは固定長ではありません。 – japrescott

答えて

1

アップロードの仕方によって異なります。私はexpress.jsを使用していますが、このreq.files。[ファイル入力名] .lengthのようにreq.filesオブジェクトから長さを取得しています。

私は実際にこの全く同じことをやろうとしていますが、ストリームを認識しているaws2jsに問題があります。あなたがそれを働かせたら私に知らせてください。

+0

ストリームを直接入れると(すべて実際のファイルサイズを取得しているので、アップロードしたばかりです)、すべて動作します。しかし、私はサイズを変更しているので、サイズ変更されたファイルは長さが違うので、私はあなたを掲載していきます.. – japrescott

+0

ああ、それについて忘れました。私は同じことをする必要があります。何らかの理由で私はS3から400のエラーが発生しています。 – jabbermonkey

+0

私はあなたがおそらくExpressでBody Parserを使用していると思います。そのため、 "req.files"が利用可能になっています。フードの下にあるBody Parserは実際にファイルを最初に保存します(これがファイルのサイズを取得する理由です)。これは、OPがやっていなかったことだったと思います。ストリームをS3に直接パイプする利点が失われています。 – schankam

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) { 
     // .....  
    }); 
    }); 
}); 
関連する問題