Как загрузить CSV-файл в хранилище BLOB-объектов, используя axios / fetch (nodejs) - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь автоматизировать (для автоматизации тестирования) выгрузку / загрузку / проверку данных файла csv для приложения, размещенного в облаке Azure и следящего за статьей:

https://medium.com/@fakiolinho/handle-blobs-requests-with-axios-the-right-way-bb905bdb1c04

И попытался реализовать его в соответствии с указаниями, однако не смог найти ' actionTypes ' в следующем (action.js):

import * as types from './actionTypes'; и потерял немного для запускаокончен.

[Error: Cannot find module './actionTypes']


Основываясь на моем обучении, я считаю, что для выполнения задачи можно использовать axios или fetch (я предпочитаю axios), и мне нужна помощь, чтобы записатьвниз решение или помощь в правильном направлении для выполнения задачи.

Я понимаю, что есть похожие вопросы, которые были заданы, связанные с этим сценарием, однако, либо ни один из них не был решен до сих пор, или они принадлежатк различным инструментам и техническому стеку.

Пожалуйста, предложите лучший подход, инструмент или пример.

Пример ссылки на хранилище BLOB-объектов:

https://portal.azure.com/#blade/Microsoft_Azure_Storage/ContainerMenuBlade/overview/storageAccountId/%2Fsubscriptions%2F0d2c6-7dba6272e3a1%2FresourceGroup%2Fpre-prod-net%2Fproviders%2FMicrosoft.Storage%2FstorageAccounts%2Fapistorage/path/input-folder/etag/%210x8D6B31B54E2%22

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Попробуйте это с помощью axios:

var axios = require('axios').default;
var fs = require('fs');
var crypto =  require('crypto');

var storageKey = "<your storage key>"
var accountName = "<your storage account name>"
var containerName="<your container name>"
var fileName="<file name>"
var filePath = "<file path ,including file name>"


var fileLength= fs.statSync(filePath).size
var fileStream = fs.createReadStream(filePath);

var blobType ="BlockBlob"
var date = new Date().toUTCString()
var blobServiceVersion = "2014-02-14"

var storageBlobEndpoint = "https://"+ accountName +".blob.core.windows.net"
var requestURL = storageBlobEndpoint + "/" + containerName + "/" + fileName
var requestMethod = "PUT"


var canonicalizedHeaders = "x-ms-blob-type:"+ blobType +"\nx-ms-date:"+ date +"\nx-ms-version:" + blobServiceVersion;
console.log("headers :"+canonicalizedHeaders);
var canonicalizedResource = accountName + "/" + containerName + "/" +  fileName

var stringToSign = requestMethod+"\n\n\n"+fileLength+"\n\napplication/x-www-form-urlencoded\n\n\n\n\n\n\n" + canonicalizedHeaders + "\n/" + canonicalizedResource

var signature = crypto.createHmac('sha256', Buffer.from(storageKey, 'base64')).update(stringToSign, 'utf-8').digest('base64');

var authorizationHeader = "SharedKey "+accountName + ":" + signature


  const result = axios({
        baseURL: requestURL,
        method: requestMethod,
        data:fileStream,
        headers: {
            'Content-Length':fileLength,
            'x-ms-blob-type': blobType,
            'x-ms-date':date,
            'x-ms-version':blobServiceVersion,
            'Authorization' : authorizationHeader
            }
        }).then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  })
  .finally(function () {
    //add finally function here if needed 
  });  

Использование остальных API-интерфейсов для загрузки файлов в хранилище довольно сложно. Использование SDK будет намного проще. Надеюсь, это поможет.

0 голосов
/ 06 ноября 2019

Альтернатива подходу Axios, в качестве простого решения может быть использовано следующее:

https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-nodejs-v10

...