【问题标题】:Azure Blob Storage - Node.JS - createReadStream() as file in POST Request FormAzure Blob 存储 - Node.JS - createReadStream() 作为 POST 请求表单中的文件
【发布时间】:2019-07-07 23:03:44
【问题描述】:

我一直在尝试使用请求模块和 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)
  }
});

【问题讨论】:

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


【解决方案1】:

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

这是我的代码作品。

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 2021-07-09
    • 2018-01-30
    • 2021-07-10
    • 2021-01-31
    • 2012-11-04
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多