2016-06-10 114 views
0

我使用节点多党,试图挽救流图像天青Blob存储,但“关闭”事件不叫?:关闭事件不叫

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); 
}); 
+0

'part'是在'part'事件中可访问的可读流。你应该把逻辑上传到'部分'事件的天蓝色。示例https://github.com/andrewrk/node-multiparty/blob/master/examples/azureblobstorage.js – Sami

+0

我想在上传前检查字段上的一些信息。 – Alvin

+0

什么样的信息? – Sami

回答

0

我们可以参考答案Why multipart is not generating close events以获得为什么你不能发出close事件的提示。

因为你没有管道的数据文件,关闭时发出的,只有当所有数据已被管道出了REQ对象,造成REQ在内部发出它的终点事件,从而引发多方关闭事件。

所以旁边穿上形式文件之上的所有字段,你可以尝试利用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);