2012-02-11 16 views
14

olsun, ben gm (a graphicsmagick wrapper) ve aws2js (amazon cli wrapper) kullanıyorum. Sorun, Amazon'un içerik uzunluğunu bilmesi ve böylece akışı S3'e yerleştirmem gerekiyor. ,Bir streamin içerik uzunlukta benim node.js uygulamasında

var fileStream=fs.createReadStream(file.path) 

Ben gm için bu dosyayı geçmesi yeniden boyutlandırmak ve daha sonra bu dosyayı akışı söylemek: Uygulamamda resim yükleyerek ediyorum

, bir akışı oluşturarak bu dosyayı okuyun. Sonra çenesinde akış sağlayan koymak istiyorum:

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) { 
      .....  
      } 
     }); 
    }); 
}); 

sorun Amazon akışı koymak için içerik uzunluğunu (onun değil kütüphane) bilmelidir olmasıdır. AWS yığın akışları desteklemiyor.

kimse bir akışın içerik uzunluğunu belirlemek nasıl biliyor mu? Ya da tek çözüm, diske tmp yazmak, dosyayı bir akış olarak okumak ve daha sonra temp dosyasının içerik uzunluğuna dikkat etmektir.

+0

Hiç bu anlamaya mı? Ben tam olarak aynı şeyi yapmaya çalışıyorum ... – Bill

+1

Bill; Sonucunu tamponluyorum ve büyüklüğünü aldım. Ne yazık ki, bunu yapmanın başka bir yolu yoktur, çünkü Amazon'un boyutu bilmek zorundadır ve bir akış da iyi - bir akış - sabit uzunlukta değil. – japrescott

cevap

1

Bu yüklemeyi yapıyoruz bağlıdır. Express.js kullanıyorum ve bu req.files gibi req.files nesnesinden uzunluk alıyorum. [File input name] .length.

Aslında bu tam olarak aynı şeyi yapmaya çalışıyorum ama aws2js akışı tanıyan bir sorun yaşıyorum. Çalışırsan bana haber ver.

+0

her şey çalışır, eğer doğrudan akışı koyarsam (gerçek dosya boyutuna sahip olduğumdan, yeni yükledim). Ben yeniden boyutlandırma ediyorum çünkü Ama, boyutu değiştirilen dosya ben .. ben sizi haberdar edeceğiz dermin gereken, farklı bir içerik-uzunluk, .. – japrescott

+0

Ahh sahip oluyor, ben unutmuştum. Ben de aynı şeyi yapmalıyım. Ve bir sebepten dolayı S3'ten 400 hata alıyorum. – jabbermonkey

+0

Muhtemelen Body Parser'ı ekspresle kullanıyorsunuzdur ve bu yüzden "req.files" e sahip olmanızın nedeni budur. Kaputun altındaki Body Parser, ilk önce dosyayı kurtarır (bu yüzden dosyanın boyutunu elde edebilirsiniz), ki OP'nin yapmaktan kaçınmaya çalıştığı şeydi. Akışı doğrudan S3'e aktarmanın avantajını kaybediyorsunuz. – 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) { 
     // .....  
    }); 
    }); 
}); 
İlgili konular