2015-09-04 148 views
1

我已经创建了一个Node.js Webservice,它将Json对象放在帖子正文中以及我需要传递图像/视频的相同对象中(不确定是否可能)媒体文件和相同的媒体文件需要上传到Azure Blob存储。将图像,视频上传到Node.js WebService并存储在Azure Blob存储中

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

该概念必须在Windows,Android和IOS平台上运行。

回答

0

也许你可能会考虑使用multipart/form-data而不是JSON,因为有一个好的库(expressjs/multer,假设你使用express)来处理node.js中的文件上传。

只要你从multer文件,其余的可以像下面很简单:

app.post('/profile', upload.single('avatar'), function (req, res, next) { 
    blobService.createBlockBlobFromLocalFile('avatars', req.file.originalname, req.file.path, function(error, result, response) { 
    }); 
}); 

对于iOS和Android,也有很多库,允许multipart/form-data要求如AFNetworking的在iOS中为OkHttp

+0

我试着上传图片和视频它的工作原理,但它可以同时发送媒体文件,并可以将数据可以是字符串格式,也可以直接在同一请求中使用json – Sharath

+0

您可能需要将它们编码为base64,这会花费额外的开发工作量,网络带宽和计算时间。 –

+0

我尝试使用下面显示的概念尝试了它在为数据和多个图像工作的小提琴手。所以使用它是好的.... --------------------------- acebdf13572468 Content-Disposition:form-data; NAME = “图像”; filename =“31 august 2015.png” Content-Type:image/png <@INCLUDE * C:\ 2015.png * @> ----------------- ---------- acebdf13572468 Content-Disposition:form-data; name =“jsondata” Content-Type:application/json {“name”:“some name”,“age”:24,“dob”:“15/April/1989”} ------ --------------------- acebdf13572468-- – Sharath

2

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

另外,这里还有另外两个用于快速处理上传文件的库。我想给你一些代码段来处理上传文件并投入Blob存储在expressjs这些库:

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

​​

如果您正在使用带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-科尔多瓦插件来处理照相机事件。 这里是控制器和服务器脚本片段。为了您的信息:

控制器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; 
       } 
     } 
})