node.js - 将图像、视频上传到 Node.js WebService 并存储在 Azure Blob 存储中

标签 node.js azure blob

我创建了一个 Node.js Web 服务,它在帖子正文中采用 Json 对象,在同一个对象中,我需要传递图像/视频(不确定是否可能)媒体文件,并且需要上传相同的媒体文件到 Azure Blob 存储。

Azure 存储提供了我们上传流的库。但是,在上传到 Azure blob 存储之前,如何将文件从 Apps 上传到 node.js 服务器。

这个概念必须适用于 Windows、Android 和 IOS 平台。

最佳答案

如果您的服务器托管在 Web 应用程序上并假设它是由expressjs 构建的,@Alex Lau 提供了一个很好的观点。

此外,这里还有另外 2 个用于快速处理上传文件的库。我想给你一些代码片段来处理上传文件并使用这些库将其放入expressjs中的blob存储中:

1, connect-busboy

var busboy = require('connect-busboy');
var azure = require('azure-storage');
var fs = require('fs'); 
var path = require('path');
var blobsrv = azure.createBlobService(
    accountname,
    accountkey
)

router.post('/file', function (req, res, next) {
   var fstream;
    var uploadfolder = path.join(__dirname, '../files/');
   if (mkdirsSync(uploadfolder)) {
        req.pipe(req.busboy);
        req.busboy.on('file', function (fieldname, file, filename) {
           console.log("Uploading: " + filename);
            fstream = fs.createWriteStream(uploadfolder + filename);
            file.pipe(fstream);
            fstream.on('close', function () {
                //res.redirect('back');
                blobsrv.createBlockBlobFromLocalFile('mycontainer',filename,uploadfolder + filename, function (error, result, response) {
                    if (!error) {
                        res.send(200, 'upload succeeded');
                    } else {
                        res.send(500, 'error');
                    }
                })
            });
        });
    }
})

function mkdirsSync(dirpath, mode) {
    if (!fs.existsSync(dirpath)) {
        var pathtmp;
        dirpath.split("\\").forEach(function (dirname) {
            console.log(dirname);
            if (pathtmp) {
                pathtmp = path.join(pathtmp, dirname);
            }
            else {
                pathtmp = dirname;
            }
            if (!fs.existsSync(pathtmp)) {
                if (!fs.mkdirSync(pathtmp, mode)) {
                    return false;
                }
            }
        });
    }
    return true;
}

2, formidable

var formidable = require('formidable')
router.post('/fileform', function (req, res, next) {
    var form = new formidable.IncomingForm();
    form.onPart = function (part){
        part.on('data', function (data){
            console.log(data);
            var bufferStream = new stream.PassThrough();
            bufferStream.end(data);
            blobsrv.createBlockBlobFromStream('mycontainer', part.filename, bufferStream, data.length, function (error, result, response){
                if (!error) {
                    res.send(200,'upload succeeded')
                } else {
                    res.send(500,JSON.stringify(error))
                }
            })
        })
   }
    form.parse(req);
    //res.send('OK');
})

如果您使用以 Node.js 作为后端的移动应用来处理这些工作流程,我们可以创建自定义 API,并以 Base64 代码传输媒体内容。

在移动应用程序中:

var azure = require('azure');
var fs = require('fs');   
var path = require('path');
exports.register = function (api) {
        api.post('upload',upload);
}
function upload(req,res){
        var blobSvc = azure.createBlobService(
            req.service.config.appSettings.STORAGE_ACCOUNTNAME,
            req.service.config.appSettings.STORAGE_ACCOUNTKEY
        );
        var decodedImage = new Buffer(req.body.imgdata, 'base64');
        var tmpfilename = (new Date()).getTime()+'.jpg';
        var tmpupload = 'upload/';
        mkdirsSync(tmpupload);
        var filePath = tmpupload+tmpfilename;
        fs.writeFileSync(filePath,decodedImage); blobSvc.createBlockBlobFromFile(req.body.container,tmpfilename,filePath,req.body.option,function(error,result,response){
            if(!error){
                res.send(200,{result:true});
            }else{
                res.send(500,{result:error});
            }
        })
}

在移动应用程序中,我使用标志性框架集成 ng-cordova 插件来处理相机事件。 这是 Controller 和服务器脚本片段。供您引用:

Controller js:

$scope.getpic = function(){
    var options = {
      quality: 10,
      destinationType: Camera.DestinationType.DATA_URL,
      sourceType: Camera.PictureSourceType.CAMERA,
      allowEdit: false,
      encodingType: Camera.EncodingType.JPEG,
      targetWidth: 100,
      targetHeight: 100,
      popoverOptions: CameraPopoverOptions,
      saveToPhotoAlbum: false
    };
    $cordovaCamera.getPicture(options).then(function(imageData) {
      console.log(imageData);
      return blobService.uploadBlob(objectId,imageData);
    }, function(err) {
      // error
    }).then(function(res){
      console.log(JSON.stringify(res));
    });
  }; 

服务器js(blobService):

factory('blobService',function($q){
       return{
              uploadBlob:function(container,imgdata,option){
                     var q = $q.defer();
                     mobileServiceClient.invokeApi('blobstorage/upload',{
                           method:"post",
                           body:{
                                  container:container,
                                  imgdata:imgdata,
                                  option:{contentType:'image/jpeg'}
                           }
                     }).done(function(res){
                           console.log(JSON.stringify(res.result));
                           if(res.result.blob !== undefined){
                                  q.resolve(res.result.blob);
                           }
                           if(res.result.url !== undefined){
                                  q.resolve(res.result.url);
                           }
                     });                  
                     return q.promise;
              }
       }
})

关于node.js - 将图像、视频上传到 Node.js WebService 并存储在 Azure Blob 存储中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32394395/

相关文章:

python - 使用 blob 值时 mysql 数据库插入错误

node.js - 如果用户更改浏览器,为什么我的 React 应用程序会显示 "Cannot GET/route"?

javascript - 通过输入文件名获取目录路径

.net - Azure AD Microsoft 帐户客户端是公共(public)的,因此不应显示 'client_assertion' 和 'client_secret'

azure - 为本地环境设置 Azure Application Insights

Angular Testing : mock a HttpResponse containing a blob

javascript - 使用 XMLHttpRequest 和授权摘要部分上传文件

php - 关于带有 Web 套接字的 PHP 与与 Node.js 集成或 Node.JS 中的整个站点的思考

javascript - webpack browserify --ignore 等效项?

c# - Azure实例更改代码回滚