gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:58 24 4
gpt4 key购买 nike

我创建了一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com