0

Ich verwende ImageMagick, um Thumbnails meiner Fotos auf S3 zu erstellen. Dies ist der Ablauf:MIME auf Anwendung/Oktett in AWS S3 eingestellt, wenn binärer Puffer verwendet wird

  1. Holen Sie sich das Bild von S3.
  2. Machen Sie Thumbnail aus der data.Body.
  3. Setzen Sie das Thumbnail auf S3.

Hier ist die Make Thumbnail-Funktion:

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; 
} 

Das image Objekt ist von der Form, dass S3 SDK, um es erwartet:

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

Doch wenn die Miniaturansicht auf S3 setzen , der MIME ist aus irgendeinem Grund auf application/octet-stream eingestellt. Beim Herunterladen des Thumbnails öffnet es sich wie jedes andere Bild, aber die Browser behandeln es nicht wie ein Bild und das ist ein Problem für mich.

Was verursacht dieses Problem? und wie kann ich es lösen?

Dank

+0

Es ist schwer, aus dem Code zu sagen, Sie gepostet haben, wo/wann/wie die Content wird eingestellt und wie Sie das sind bestätigt ... aber wenn Es ist wirklich auf image/png eingestellt, wenn Sie den Upload tatsächlich durchführen, der beim Hochladen beibehalten, in den S3-Metadaten festgelegt und wie erwartet zum Browser zurückgeleitet werden soll. –

+0

Ich hoffe, Sie haben Recht, aber die Dokumentation schlägt vor, dass der Inhaltstyp von der Inhaltscodierung abgeleitet werden kann, die in meinem Fall binär ist. Daher dachte ich, dass meine explizite Deklaration des Inhaltstyps überschrieben wird, sobald S3 sdk feststellt, dass die Kodierung binär ist. – johni

+0

Ich bin ziemlich sicher, dass, wenn ein 'Content-Type:' HTTP-Request-Header an S3 gesendet wird, wenn ein Objekt hochgeladen wird, dieser Wert beim Anfordern von Objekten an den Browser zurückgegeben wird. Ich habe meine eigenen Bibliotheken für AWS geschrieben, verwende die SDKs nicht sehr oft, daher bin ich "nur" wirklich mit dem Verhalten des eigentlichen S3-Dienstes vertraut, nicht mit dem SDK selbst. Ich bin mir nicht sicher, wie die Art der Codierung wirklich möglich oder wünschenswert wäre. S3 selbst honoriert nur die Anweisungen, die gesendet werden - kein Denken passiert. (Die Konsole kann MIME-Typen herausfinden, wenn Sie dort Dateien hochladen, aber die Konsole macht das, nicht S3). –

Antwort

0

Die Dokumentation für node-imagemagick.resize() sagt das Standardformat jpg ist. Vielleicht ist Ihre Ausgabe keine png wie Sie denken.

Wir verwenden das im-resize Paket und enthält Ein- und Ausgangsparameter, wo wir .jpeg Bilder typischerweise konvertieren von einem Web-Formular in .png Ausgabedatei hochgeladen. (Wir lesen aus dem Dateisystem nach der Konvertierung, nicht Stream-Puffer, nur fyi).

Unser Code ist so etwas wie folgt aus:

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

Wie würden Sie die S3 Body-Eigenschaft auf den Ergebnisstrom der Größenänderung setzen? – johni

+0

Wir verwendeten ein anderes Paket, das eine Datei speicherte, die in einen Filestream umgewandelt wurde. Die [AWS S3-Dokumentation] (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property) sagt 'Body: new Buffer ('...') || 'STRING_VALUE' || streamObject, ', solange Sie' Body' also 'Buffer',' string' oder 'streamObject' zuweisen, sollten Sie in guter Verfassung sein. Ich weiß nicht, was 'im.resize' zurückgibt, da wir das Paket nicht benutzt haben. – clay