Хранилище BLOB-объектов Azure - Node.JS - createReadStream () в виде файла в форме запроса POST - PullRequest
0 голосов
/ 14 февраля 2019

Я пытался асинхронно отправить изображение Blob в REST Api, используя модуль запроса и модуль хранилища Azure.Я не хочу загружать 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)
  }
});

1 Ответ

0 голосов
/ 15 февраля 2019

Я попытался использовать ваш код для загрузки блоба изображения на локальный URL моего владельца http://localhost/upload, затем обнаружил, что в свойстве file вашего formData.

отсутствуют некоторые свойства.мой код работает.

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)
  }
});

Думая о приведенном выше коде, он должен передавать поток загрузки в поток загрузки, и все данные также должны проходить через ваш веб-приложение.Исходя из моего опыта, я думаю, что вы можете сгенерировать URL-адрес большого двоичного объекта SAS для публикации в вашем REST API, а затем загрузить большой двоичный объект через сервер REST, если вы можете изменить код своего сервера приложений REST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...