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?
Estaba tan atascado y cambiando a multiparte resolvió esto –