node.js - que - Acceder a la secuencia de archivos sin formato desde una carga de archivos formidable
package.json que es (3)
Lo que desea hacer es anular el método Form.onPart
:
IncomingForm.prototype.onPart = function(part) {
// this method can be overwritten by the user
this.handlePart(part);
};
El comportamiento predeterminado de Formidable es escribir la parte en un archivo. No quieres eso. Desea manejar los eventos ''parte'' para escribir en la descarga knox. Comience con esto:
form.onPart = function(part) {
if (!part.filename) {
// let formidable handle all non-file parts
form.handlePart(part);
return;
}
A continuación, abra la solicitud Knox y maneje los eventos de piezas en bruto usted mismo:
part.on(''data'', function(data) {
req.write(data);
});
part.on(''end'', function() {
req.end();
});
part.on(''error'', function(err) {
// handle this too
});
Como extra, si la req.write(data)
devuelve false, significa que el buffer de envío está lleno. Debes pausar el analizador Formidable. Cuando recibas un evento de drain
de la secuencia de Knox debes reiniciar Formidable.
Estoy creando una aplicación que toma algunos archivos cargados y los 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 usando Knox para descargar un archivo usando este código:
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 del archivo del navegador a S3).
Hasta ahora, he escrito un controlador de eventos para capturar cada dato del archivo a medida que se carga:
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 evento de datos solo me da el buffer. Entonces, ¿es posible capturar la transmisión en sí y llevarla a S3?
No hay forma de que capture la transmisión, porque Formidable debe traducir los datos. El buffer
que se le da es el contenido del archivo en fragmentos de buffer.length
: esto podría ser un problema porque mirando 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''s put
podría necesita que.
Nunca usaste Knox de esta manera, pero podrías tener algo 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 los bits de comprobación de respuesta, pero ... vea si puede convertirlo en forma. Además, la transmisión de una secuencia de octetos desde la solicitud a S3 con knox en node.js también tiene una descripción que puede ser útil para usted.
Use multiparty lugar. Es compatible con este tipo de transmisión como desee. Incluso tiene un ejemplo de transmisión directa a s3: https://github.com/superjoe30/node-multiparty/blob/master/examples/s3.js