2012-02-11 17 views
14

En mi aplicación node.js, estoy usando gm (a graphicsmagick wrapper) y aws2js (amazon cli wrapper). El problema es que Amazon necesita saber la longitud del contenido para poder poner la transmisión en S3.obtener una longitud de contenido de la secuencia

estoy subiendo una imagen para mi aplicación, leer ese archivo mediante la creación de una corriente:

var fileStream=fs.createReadStream(file.path) 

me pase ese archivo a GM, cambiar su tamaño y luego dicen que para transmitir ese archivo. entonces yo quiero poner esa corriente de 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) { 
      .....  
      } 
     }); 
    }); 
}); 

El problema es que Amazon necesita saber la longitud de contenido (que no es la biblioteca) para poner la corriente. AWS no admite transmisiones fragmentadas.

¿Alguien sabe cómo puedo determinar la longitud del contenido de una secuencia? ¿O sería la única solución tmp escribirlo en el disco, leer el archivo como una secuencia y luego ponerlo en Amazon con la longitud del contenido del archivo temporal?

+0

¿Alguna vez descubrió esto? Estoy tratando de hacer exactamente lo mismo ... – Bill

+1

Bill; Yo guardo el resultado y obtengo el tamaño del mismo. Lamentablemente, no hay otra forma de hacerlo, porque Amazon necesita saber el tamaño y una secuencia es buena, una secuencia, sin longitud fija. – japrescott

Respuesta

1

Depende de cómo lo está cargando. Estoy usando express.js y obtengo la longitud del objeto req.files como este req.files. [Nombre de entrada de archivo] .length.

En realidad estoy tratando de hacer exactamente lo mismo pero estoy teniendo un problema con aws2js al reconocer la transmisión. avísame si lo haces funcionar.

+0

todo funciona, si pongo directamente la transmisión (dado que tengo el tamaño real del archivo, acabo de subir). Pero como cambio de tamaño, el archivo redimensionado va a tener una longitud de contenido diferente, que necesito derminar ... Te mantendré informado ... – japrescott

+0

Ahh, me olvidé de eso. Necesito hacer lo mismo. Y por alguna razón recibo un error 400 de S3. – jabbermonkey

+0

Supongo que probablemente esté usando Body Parser con Express, y es por eso que tiene un "archivo requerido" disponible. Body Parser bajo el capó realmente guardará el archivo primero (esta es la razón por la que puede obtener el tamaño del archivo), que creo que fue lo que el OP intentaba evitar. Está perdiendo la ventaja de conectar la corriente directamente a 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) { 
     // .....  
    }); 
    }); 
}); 
Cuestiones relacionadas