2011-10-22 11 views
35

Estoy creando una aplicación que toma algunas cargas de archivos y las envía directamente a S3. Preferiría no tener siquiera el archivo tmp en mi servidor, así que estoy usando el módulo Knox y me gustaría tomar el flujo sin procesar de Formidable y enviarlo a través de Knox a S3. He hecho algo similar con Knox para descargar un archivo utilizando este código:Acceso a la secuencia de archivos sin procesar desde una carga de archivos sin formato de nodo

knox.downloads.get(widget.download).on('response',function(sres){ 
    res.writeHead(200, { 
     'Content-Type':'application/zip', 
     'Content-Length': sres.headers['content-length'], 
     'Content-Disposition':'attachment; filename=' + widget.download 
    }); 
    util.pump(sres, res); 
}).end(); 

Ahora me gustaría hacer algo similar en la dirección opuesta (carga de archivos desde el navegador a S3).

Hasta ahora he escrito un controlador de eventos para capturar cada pieza de datos del archivo como está siendo subido:

var form = new formidable.IncomingForm(); 
form.onPart = function(part){ 
    if(!part.filename){ 
     form.handlePart(part); 
    }else{ 
     if(part.name == 'download'){ 
      // Upload to download bucket 
      controller.putDownload(part); 
     }else{ 
      // Upload to the image bucket 
      controller.putImage(part); 
     } 
     //res.send(sys.inspect(part)); 
    } 
} 
form.parse(req, function(err, fields, files){ 
    if(err){ 
     res.json(err); 
    }else{ 
     res.send(sys.inspect({fields:fields, files:files}), {'content-type':'text/plain'}); 
     //controller.createWidget(res,fields,files);    
    } 
}); 


controller.putDownload = function(part){ 
    part.addListener('data', function(buffer){ 
     knox.download.putStream(data,part.filename, function(err,s3res){ 
      if(err)throwError(err); 
      else{ 
       console.log(s3res); 
      } 
     }); 
    }) 
    knox.downloads.putStream(part, part.filename, function(err,s3res){ 

     if(err)throwError(err); 
     else{ 
      console.log(s3res); 
     } 
    }); 
} 

Pero el caso de datos sólo dame la memoria intermedia. Entonces, ¿es posible capturar la transmisión en sí y llevarla a S3?

Respuesta

17

Lo que se quiere hacer es reemplazar el método Form.onPart:

IncomingForm.prototype.onPart = function(part) { 
    // this method can be overwritten by the user 
    this.handlePart(part); 
}; 

el comportamiento predeterminado del Formidable es escribir la pieza a un archivo. No quieres eso. Desea manejar los eventos 'parte' para escribir en la descarga knox. Comenzar con esto:

form.onPart = function(part) { 
    if (!part.filename) { 
     // let formidable handle all non-file parts 
     form.handlePart(part); 
     return; 
    } 

continuación, abra la solicitud de Knox y controlar los eventos de pieza en bruto a sí mismo:

part.on('data', function(data) { 
    req.write(data); 
}); 
part.on('end', function() { 
    req.end(); 
}); 
part.on('error', function(err) { 
    // handle this too 
}); 

Como beneficio adicional, si el falso req.write(data) retorno que significa que el búfer de emisión está lleno. Debes pausar el analizador Formidable. Cuando obtienes un evento drain de la transmisión de Knox debes reiniciar Formidable.

-2

No hay forma de que capture la secuencia, porque los datos deben ser traducidos por Formidable. El buffer que le dan es el contenido del archivo en fragmentos de buffer.length: esto podría ser un problema porque al mirar los documentos de Formidable parece que hasta que el archivo no se cargue por completo no puede informar el tamaño del archivo y el método de Knox put podría necesitarlo .

nunca utilizado Knox esta manera antes, pero puede que tenga un poco de suerte con algo como esto:

controller.putDownload = function(part){ 
    var req = knox.download.put(part.filename, { 
     'Content-Type': 'text/plain' 
    }); 
    part.addListener('data', function(buffer){ 
    req.write(buffer); 
    }); 
    req.on('response', function(res){ 
     // error checking 
    }); 
    req.end(); 
} 

un poco inseguro acerca de la respuesta comprobando los bits, pero .... ver si usted puede azotar que en forma. Además, Streaming an octet stream from request to S3 with knox on node.js también tiene una descripción que puede serle útil.

Cuestiones relacionadas