我想通过Base64表格上传从网络应用和移动应用发送的用户的个人资料图片。
在POST
请求中,他们需要在看起来像这样的正文上发送JSON
。
{
"name":"profile-pic-123.jpg",
"file":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxQTEhIUEhIUFBUV…K9rk8hCAEkjFMUYiEAI+nHIpsQh0AkisDYRTOiCAbWVtgCtI6IlkHh7LDTQXLH0EIQBj//2Q==" // the base64 image
}
现在在服务器端使用Node
和Express
,我使用了这个名为azure-storage
的npm模块,它提供了一种使用Web服务将文件上传到azure blob存储的好方法。
但是有些东西我无法理解。这是我的控制器代码的一部分。我成功地创建了所有必要的连接和密钥,以及创建工作blobService
:
controllers.upload = function(req, res, next){
// ...
// generated some sastoken up here
// etc.
// ...
var uploadOptions = {
container: 'mycontainer',
blob: req.body.name, // im not sure about this
path: req.body.file // im not sure about this either
}
sharedBlobService.createBlockBlobFromLocalFile(uploadOptions.container, uploadOptions.blob, uploadOptions.path, function(error, result, response) {
if (error) {
res.send(error);
}
console.log("result", result);
console.log("response", response);
});
}
我收到此错误:
{
"errno": 34,
"code": "ENOENT",
"path": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAAB..."
}
答案 0 :(得分:2)
如果使用javascript sdk v12,则可以使用此示例代码。就这么简单。我已经在一个函数中实现了它,当我需要它来触发HTTP事件时,它会很好用。
index.js
const file = await require('./file')();
uploadOptions = {
container: 'mycontainer',
blob: req.body.name,
text: req.body.file
}
const fileUploader = await file(uploadOptions.text, uploadOptions.blob,
uploadOptions.container);
您可以为逻辑使用单独的模块,并从上面的index.js调用此模块
file.js
const { BlobServiceClient } = require("@azure/storage-blob");
const blobServiceClient = BlobServiceClient.fromConnectionString(process.env.AZURE_STORAGE_CONNECTION_STRING);
const Promise = require('bluebird');
module.exports = Promise.method(async function() {
return async function (data, fileName, container) {
const containerClient = await blobServiceClient.getContainerClient(container);
const blockBlobClient = containerClient.getBlockBlobClient(fileName);
const matches = data.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/);
const buffer = new Buffer(matches[2], 'base64');
return await blockBlobClient.upload(buffer, buffer.byteLength );
};
});
答案 1 :(得分:1)
在这种情况下,您不应使用ss
。相反,您应该使用createBlockBlobFromLocalFile
,因为您没有上传本地文件,而是请求正文中的内容。
以下是代码:
createBlockBlobFromText
var uploadOptions = {
container: 'mycontainer',
blob: req.body.name,
text: req.body.file
}
sharedBlobService.createBlockBlobFromText(uploadOptions.container,
uploadOptions.blob,
uploadOptions.text,
{
contentType: 'image/jpeg',
contentEncoding: 'base64'
},
function(error, result, response) {
if (error) {
res.send(error);
}
console.log("result", result);
console.log("response", response);
});
只是文件名,在这种情况下是“profile-pic-123.jpg”,blob
是文件的本地路径。由于您没有在服务器端本地存储文件,path
在这种情况下毫无意义。