我正在使用节点多方,尝试将流图像保存到 azure 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);
});
我们可以参考为什么多部分不生成接近事件的答案,以获得为什么你不能发出close
事件的提示。
由于您没有将数据管道传输到文件,因此仅当所有数据都已通过管道从 REQ 对象传出时,才会发出 close,从而导致 req 在内部发出其完成事件,从而触发多方关闭事件。
因此,除了将所有字段放在表单中的文件顶部之外,您还可以尝试利用file
事件将文件托管在tmp文件夹中,并在以后close
事件中处理它们。例如:
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);