不调用close事件

时间:2016-06-10 07:16:08

标签: node.js azure express multipart

我正在使用node-multiparty,试图将流图像保存到azure blob存储,但是没有调用'close'事件?:

var form = new multiparty.Form();
var fields = [];
var parts = [];

form.on('error', function(err) {
    console.log('Error parsing form: ' + err.stack);
});

form.on('field', function(name, value){
    fields.push({name:name, value: value});
});

form.on('part', function(part){
    parts.push({name:part.name, value:part});
});

form.on('close', function(){
        // How do I get the name called image from parts array, and save it to the azure storage?
        var filename = part.filename;
        var size = part.byteCount;

        var onError = function(error) {
            if (error) {
                res.send({ grrr: error });
            }
        };
        blobService.createBlockBlobFromStream('container', filename, part,    size, onError);  
});

1 个答案:

答案 0 :(得分:0)

我们可以参考Why multipart is not generating close events的答案来了解您无法发出close事件的原因。

  

因为您没有将数据传递给文件,所以只有当所有数据都从req对象传出时才会发出close,导致req在内部发出它的finish事件,从而触发multiparty close事件。

除了将所有字段放在表单中的文件之外,您可以尝试利用file事件来托管tmp文件夹中的文件,并在close事件中处理它们。 E.G:

var blobService = azure.createBlobService();
var form = new multiparty.Form({autoFiles:true});
var fields = [];
var files = [];
form.on('field', function(name, value){
    fields.push({name:name, value: value});
});
form.on('file',function(name,file){
  files.push(file);
});
form.on('close',function(){
  console.log(files);
  var file = files[0];
    var onError = function(error) {
        if (error) {
            res.send({ grrr: error });
        }
    };

    blobService.createBlockBlobFromStream(container, file.originalFilename, fs.createReadStream(file.path),file.size,file.headers, function(error) {
    if (error) {
      // error handling
      console.log(error);
    }else{
      res.end('File uploaded successfully');
    }
  });
});
form.parse(req);