2011-10-04 6 views
6

Tengo un problema extraño con un módulo Node.js (v0.4.12) en el que estoy trabajando. Es un módulo CouchDB, y aunque estoy bastante seguro de que CouchDB no es el problema aquí, lo incluiré ya que puede ser información útil.Node.js piping http.ClientRequest en fs.createWriteStream con archivos binarios conduce a archivos dañados/inflados

De todos modos, estoy escribiendo un contenedor para cargar y descargar archivos adjuntos con CouchDB. Tengo la parte de carga funcionando muy bien, es la parte de descarga con la que tengo dificultades.

Mi proceso de prueba es ésta:

  1. archivo de imagen Subir (http.request, fs.createReadStream)
  2. Descargar archivo (http.request)
  3. Guardar el archivo descargado a una ubicación diferente para el control de comparación/corrupción (fs.createWriteStream, stream.pipe)

Esto funciona bien con archivos de texto simple, pero archivos binarios como imágenes se comportan de manera diferente.

Como mencioné antes, la carga parece correcta. Como puedo visitar la URL en CouchDB y ver la imagen. (el tamaño coincide y representa la imagen que cargué) Cuando uso mi módulo para descargar el archivo y guardarlo, el archivo de salida es más grande que el archivo fuente, (50-100% más grande) y no puede ser abierto por ninguna imagen editores. (por lo tanto, está "dañado" de alguna manera)

¿Me falta algo sobre Streams cuando se trata de archivos binarios? He intentado cambiar el encoding en ambos lados a "binary" y "base64", pero el archivo de salida todavía es un 50% más grande que la fuente. Antes de descubrir la opción de codificación, estaba configurada en "utf8", y el archivo de salida era 100% más grande, lo que me lleva a pensar que esto es un problema de codificación en algún lugar de allí.

También intenté conectar manualmente las transmisiones (en lugar de utilizar el método pipe) pero el resultado es el mismo.

Respuesta

6

Disculpe si me salió mal esta pregunta pero parece que está intentando usar codificaciones con un archivo binario. No necesita para: nodo le da almacenamientos intermedios brutos con datos binarios de forma predeterminada.

Aquí es un ejemplo de mi descarga de un payaso:

var http = require("http"), 
    fs = require("fs"); 

http.get({ 
    host: "2.bp.blogspot.com", 
    path: "/_IR8qT_UKjOI/TT2P3qleU9I/AAAAAAAAA3I/beckWSLh3nk/s1600/clown.jpg" }, 
    function(res) { 
    var stream = fs.createWriteStream("clown.jpg"); 
    res.pipe(stream); 
    }); 

espero que esto ayude.

+0

¡Ajá, esto fue lo que hizo! ¡Un millón de gracias! –

0

Comprobar: https://github.com/joyent/node/issues/1569

Nodo no le gustan los saltos de línea en http. Actualice su nodo.

Si buscas couchdb, tengo una publicación de blog sobre el tema en mi blog en writings.nunojob.com. El uso de nano suele ser una buena opción como cliente de sofá

+0

Ya estoy usando v0.4.12, actualizar y usar v0.5.8 tampoco resolvió el problema. –