最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Azure Blob存储

IT培训 admin 6浏览 0评论

Azure Blob存储

我一直在尝试使用请求模块和Azure存储模块异步将Blob映像发送到REST Api。我不想将Blob下载到本地文件,然后从本地文件创建可读流,因为它不具备性能。这是我尝试过的,但它抛出错误“MIME多部分流的意外结束.MIME多部分消息未完成。”从请求文档中,在表单数据中发送文件需要您传递可读流。似乎Azure存储客户端的可读流与请求模块的格式不兼容。任何想法如何让这个工作?

const request = require('request');
const storage = require('azure-storage');

const blobService = storage.createBlobService(process.env.AzureWebJobsStorage);

let stream = blobService.createReadStream(
    containerName,
    blobName,
    function(err, res) {
 });

let formData = {
  rootMessageId: messageId,
  file: stream
};

request.post({
    url:'https://host-name/Api/comment', 
    headers: {'Authorization': `Token ${authToken}`}, 
    formData: formData
  }, (err, res, body) => {
    console.log(res)
  }
});
回答如下:

我试图使用你的代码将图像blob上传到我的所有者本地url http://localhost/upload,然后我发现你的fileformData属性中缺少一些属性。

这是我的代码作品。

const request = require('request');
const storage = require('azure-storage');

var accountName = '<your storage account name>';
var accountKey = '<your storage account name>';
var blobService = storage.createBlobService(accountName, accountKey);

let stream = blobService.createReadStream(containerName, blobName, function(err, res){
    formdata.file.options.contentType = res.contentSettings.contentType;
    console.log(formdata);
});

var formdata = {
    rootMessageId: messageId,
    file: {  // missing some properties
        value: stream,
        options: {
            filename: function(blobName) {
                var elems = blobName.split('/');
                return elems[elems.length-1];
            }(blobName),
            knownLength: stream // a required property of `file` is `knownLength` which will cause server error if be missed.
        },
    }
}

request.post({
    url: 'https://host-name/Api/comment', // I used my url `http://localhost/upload` at here
    headers: {'Authorization': `Token ${authToken}`}, // I used a empty {} as header at here
    formData: formdata
  }, (err, res, body) => {
    console.log(res)
  }
});

考虑到上面的代码,它必须将下载流传输到上传流,并且所有数据也需要流经您的webapp机器。根据我的经验,我认为您可以生成blob的SAS URL以发布到REST API,然后如果您可以更改REST应用程序服务器的代码,则通过REST服务器下载blob。

Azure Blob存储

我一直在尝试使用请求模块和Azure存储模块异步将Blob映像发送到REST Api。我不想将Blob下载到本地文件,然后从本地文件创建可读流,因为它不具备性能。这是我尝试过的,但它抛出错误“MIME多部分流的意外结束.MIME多部分消息未完成。”从请求文档中,在表单数据中发送文件需要您传递可读流。似乎Azure存储客户端的可读流与请求模块的格式不兼容。任何想法如何让这个工作?

const request = require('request');
const storage = require('azure-storage');

const blobService = storage.createBlobService(process.env.AzureWebJobsStorage);

let stream = blobService.createReadStream(
    containerName,
    blobName,
    function(err, res) {
 });

let formData = {
  rootMessageId: messageId,
  file: stream
};

request.post({
    url:'https://host-name/Api/comment', 
    headers: {'Authorization': `Token ${authToken}`}, 
    formData: formData
  }, (err, res, body) => {
    console.log(res)
  }
});
回答如下:

我试图使用你的代码将图像blob上传到我的所有者本地url http://localhost/upload,然后我发现你的fileformData属性中缺少一些属性。

这是我的代码作品。

const request = require('request');
const storage = require('azure-storage');

var accountName = '<your storage account name>';
var accountKey = '<your storage account name>';
var blobService = storage.createBlobService(accountName, accountKey);

let stream = blobService.createReadStream(containerName, blobName, function(err, res){
    formdata.file.options.contentType = res.contentSettings.contentType;
    console.log(formdata);
});

var formdata = {
    rootMessageId: messageId,
    file: {  // missing some properties
        value: stream,
        options: {
            filename: function(blobName) {
                var elems = blobName.split('/');
                return elems[elems.length-1];
            }(blobName),
            knownLength: stream // a required property of `file` is `knownLength` which will cause server error if be missed.
        },
    }
}

request.post({
    url: 'https://host-name/Api/comment', // I used my url `http://localhost/upload` at here
    headers: {'Authorization': `Token ${authToken}`}, // I used a empty {} as header at here
    formData: formdata
  }, (err, res, body) => {
    console.log(res)
  }
});

考虑到上面的代码,它必须将下载流传输到上传流,并且所有数据也需要流经您的webapp机器。根据我的经验,我认为您可以生成blob的SAS URL以发布到REST API,然后如果您可以更改REST应用程序服务器的代码,则通过REST服务器下载blob。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论