2013-04-04 11 views
14

, więc chcę przesłać obraz z adresu URL, przetworzyć go za pomocą graphicsmagick i przesłać strumieniowo do s3. po prostu nie działa.Strumień przesyłając obraz o rozmiarze zmienionym przez gm na s3 z aws-sdk

przesyłanie przetworzonego obrazu na dysk lokalny (przy użyciu metody fs.createWriteStream) działa bez problemu.

kiedy buforuję mój strumień, ostateczny obraz w s3 ma co najmniej oczekiwany rozmiar (kb-mądry), ale nie mogę otworzyć tego obrazu.

ów mój obecny postęp:

var request = require('request'); 

var gm = require("gm"); 

var AWS = require('aws-sdk'); 

var mime = require('mime'); 

var s3 = new AWS.S3(); 

gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg") 
    .resize("100^", "100^") 
    .stream(function(err, stdout, stderr) { 
    var str = ''; 
    stdout.on('data', function(data) { 
     str += data; 
    }); 
    stdout.on('end', function(data) { 
     var data = { 
     Bucket: "my-bucket", 
     Key: "my-image.jpg", 
     Body: new Buffer(str, 'binary'), // thats where im probably wrong 
     ContentType: mime.lookup("my-image.jpg") 
     }; 
     s3.client.putObject(data, function(err, res) { 
     console.log("done"); 
     }); 
    }); 
    }); 

Próbowałem kilka rzeczy jak tworzenie filewritestream i filereadstream, ale myślę, że powinna istnieć jakaś sprzątaczka ładniejsze rozwiązanie tego problemu ...

EDIT : pierwszą rzeczą próbowałem zachodziło organizm do stdout (sugerowana odpowiedź od @AndyD):

var data = { 
    Bucket: "my-bucket", 
    Key: "my-image.jpg", 
    Body: stdout, 
    ContentType: mime.lookup("my-image.jpg") 
    }; 

ale powraca następujący błąd:

Cannot determine length of [object Object]' 

EDIT2:

  • nodeversion: 0.8.6 (Próbowałem też 0.8.22 i 0.10.0)
  • AWS-SDK: 0.9.7-pre.8 (zainstalowany dzisiaj)

pełna err:

{ [Error: Cannot determine length of [object Object]] 
    message: 'Cannot determine length of [object Object]', 
    object: 
    { _handle: 
    { writeQueueSize: 0, 
    owner: [Circular], 
    onread: [Function: onread] }, 
_pendingWriteReqs: 0, 
_flags: 0, 
_connectQueueSize: 0, 
destroyed: false, 
errorEmitted: false, 
bytesRead: 0, 
_bytesDispatched: 0, 
allowHalfOpen: undefined, 
writable: false, 
readable: true, 
_paused: false, 
_events: { close: [Function], error: [Function: handlerr] } }, 
name: 'Error' } 

Odpowiedz

12

nie trzeba ponownie reklamuj sam strumień (w twoim przypadku wydajesz się konwertować z binarnego na ciąg i z powrotem ze względu na var str = '', a następnie dołączając dane, które są binarnym buforem itp. ...

Spróbuj wypuścić rurkę putObject jak strumień to:

gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg") 
    .resize("100^", "100^") 
    .stream(function(err, stdout, stderr) { 
     var data = { 
     Bucket: "my-bucket", 
     Key: "my-image.jpg", 
     Body: stdout 
     ContentType: mime.lookup("my-image.jpg") 
     }; 
     s3.client.putObject(data, function(err, res) { 
     console.log("done"); 
     }); 
    }); 
    }); 

Zobacz te release notes, aby uzyskać więcej informacji.

Jeśli streaming/pipe nie działa, to coś takiego może załadować wszystko do pamięci, a następnie załadować. W tym przypadku jesteś ograniczony do 4 MB.

var buf = new Buffer(''); 
    stdout.on('data', function(data) { 
     buf = Buffer.concat([buf, data]); 
    }); 
    stdout.on('end', function(data) { 
     var data = { 
     Bucket: "my-bucket", 
     Key: "my-image.jpg", 
     Body: buf, 
     ContentType: mime.lookup("my-image.jpg") 
     }; 
     s3.client.putObject(data, function(err, res) { 
     console.log("done"); 
     }); 
    }); 
+0

to pierwsza rzecz, którą wypróbowałem, ponieważ stdout powinien już być strumieniem, prawda? ale to nie działa, "err" w ostatnim wywołaniu zwrotnym mówi "Nie można określić długości [object Object]" ;-( – hereandnow78

+0

czy masz stacktrace? Czy używasz najnowszej wersji aws-SDK? – AndyD

+0

zobacz moją drugą edycję – hereandnow78

Powiązane problemy