Nodejs使用.createBlockBlobFromLocalFile()将base64图像上传到azure blob存储

时间:2016-03-18 08:18:55

标签: node.js azure azure-storage azure-storage-blobs azure-blob-storage

我想通过Base64表格上传从网络应用和移动应用发送的用户的个人资料图片。

POST请求中,他们需要在看起来像这样的正文上发送JSON

{
    "name":"profile-pic-123.jpg",
    "file":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxQTEhIUEhIUFBUV…K9rk8hCAEkjFMUYiEAI+nHIpsQh0AkisDYRTOiCAbWVtgCtI6IlkHh7LDTQXLH0EIQBj//2Q==" // the base64 image
}

现在在服务器端使用NodeExpress,我使用了这个名为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..."
}

2 个答案:

答案 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在这种情况下毫无意义。

如果您需要有关存储的更多信息,请参阅thisthis