2016-04-26 12 views
0

私はImageMagickを使用して、S3で自分の写真のサムネイルを作成しています。 これは流れです:バイナリバッファを使用すると、MIMEがAWS S3のアプリケーション/オクテットに設定される

  1. S3から画像を取得します。
  2. data.Bodyからサムネイルを作成します。
  3. サムネイルをS3に挿入します。ここで

メイクサムネイル機能である:

function makeThumbnail(image) { 
    var defer = q.defer(); 

    im.resize({ 
    srcData: image.Body, 
    width: 256 
    }, function (err, stdout) { 
    if (err) { 
     defer.reject(err); 

    } else { 
     image.Key.replace(/^images/, "thumbs"); 
     image.Body = new Buffer(stdout, 'binary'); 

     defer.resolve(image); 
    } 
    }); 

    return defer.promise; 
} 

imageオブジェクトは、S3 SDKはそれを得ることを想定している形式は次のとおりです。

しかし
var image = { 
    Bucket: 'bucket name', 
    Key: 'object key', 
    Body: 'body', 
    ContentType: 'image/png' 
    }; 

、S3上のサムネイルを入れたときに何らかの理由でMIMEがapplication/octet-streamに設定されています。サムネイルをダウンロードするときに他の画像のように開きますが、ブラウザは画像のように扱わず、それが問題です。

この問題の原因を教えてください。どのように私はそれを解決することができますか?

おかげ

+0

それは/ときContentTypeをが設定されますとどのようにあなたがそれを確認しているか/ ...しかし、もしあなたが投稿したコードから言うのは難しいです実際にアップロードを行うときにはイメージ/ pngに設定されています。これはアップロード時に維持し、S3メタデータに設定して、期待どおりにブラウザに戻します。 –

+0

私はあなたが正しいと思っていますが、ドキュメンテーションは、私の場合はバイナリであるコンテンツのエンコーディングからコンテンツタイプを導き出すことを示唆しています。そのため、私は、S3のsdkがエンコーディングがバイナリであることに気付くと、コンテンツタイプの明示的な宣言が上書きされていると考えました。 – johni

+0

私は、オブジェクトがアップロードされたときにS3に 'Content-Type:' HTTPリクエストヘッダが送られた場合、オブジェクトを要求するときにその値がブラウザに返されることを確信しています。 AWS用の独自のライブラリを作成しましたが、SDKを頻繁に使用しないでください.SDK自体ではなく、実際のS3サービスの動作に「本当に」慣れています。エンコーディングからどのように型を引き出すのが本当に可能か望ましいかはわかりません。 S3自体は送信される指令を尊重するだけのものであり、思考は起こりません。 (コンソールは、そこにファイルをアップロードするとMIMEタイプを認識することができますが、コンソールはS3ではありません)。 –

答えて

0

node-imagemagick.resize()のためのドキュメントは、既定のフォーマットがjpgであると言います。たぶんあなたの出力はあなたのようにpngではありません。

im-resizeパッケージを使用し、入力と出力のパラメータが含まれています。通常、ウェブフォームから.jpeg画像をアップロードして.png出力ファイルに変換します。 (変換後のファイルシステムから、ストリームバッファではなくfyiから読み込みます)。

私たちのコードは次のようなものです:

var resize = require('im-resize'); 
var metadata = require('im-metadata'); 
var AWS = require('aws-sdk'); 

metadata(data.params.file.path, {}, function(error, metadataResults) { 
    //error checking 

    var image = { 
    //set from metadataResults 
    }; 
    var output = { 
    versions: [{ 
     //set as desired 
    }] 
    }; 

    resize(image, output, function(error, versions) { 

    var filename = 'images/' + uuid.v4() + '.png'; //this was enough for us 
    var fileStream = fs.createReadStream(versions[0].path); 
      fileStream.on('error', function(err) { 
      //handle error 
      }); 
      fileStream.on('open', function() { 
      var s3 = new AWS.S3(); 
      s3.putObject({ 
       Bucket: 'bucketname', 
       Key: filename, 
       Body: fileStream 
      }, function(err) { 
       //handle errors 

//know the file has been saved to S3 
//close up all the squiggly braces and return HTTP response or whatever 
+0

S3 Bodyプロパティをサイズ変更操作の結果ストリームに設定する方法はありますか? – johni

+0

ファイルを保存した別のパッケージを使用しましたが、これはファイルストリームになりました。 [AWS S3 docs](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property)は 'Body:new Buffer( '...')と言っています。 'STRING_VALUE' ||あなたが 'Body'に割り当てるものが' Buffer'、 'string'または' streamObject'である限り、あなたは良い形になっているはずです。私たちがパッケージを使用しなかったので、 'im.resize'が何を返すのか分かりません。 – clay

関連する問題