Загрузите файл Excel из BLOB-объекта Azure и обработайте его данные, не сохраняя файл в локальном каталоге. - PullRequest
1 голос
/ 31 мая 2019

Я хочу загрузить файл Excel из BLOB-объекта Azure и обработать его данные с помощью модуля npm 'xlsx'. Я достиг этого, сохранив файл в локальном каталоге на моем сервере node.js.

Но я должен реализовать это без необходимости сохранять файл локально на сервере .

Как мне этого добиться?

Ниже приведен мой файл js с помощью метода загрузки в локальный каталог.

const xlsx = require('xlsx');

  const azureStorageConfig = {
  accountName: "",
  accountKey: "",
  blobURL: "",
  containerName: "test-container"
};

let fileName = "test_blob.xlsx";

const downloadBlob = async (blobName, downloadFilePath) => {
  return new Promise((resolve, reject) => {
    const name = path.basename(blobName);
    const blobService = azureStorage.createBlobService(azureStorageConfig.accountName,azureStorageConfig.accountKey); 
    blobService.getBlobToLocalFile(azureStorageConfig.containerName,blobName,`${downloadFilePath}${name}`, function(error, serverBlob) {
        if (error) {
            reject(error);
        } else {
            resolve(downloadFilePath);
        }
    });
  });
};

downloadBlob(fileName,'./local_dir/').then((downloadFilePath)=>{
  parseExcel(downloadFilePath + fileName);
});

const parseExcel = function(downloaded_file_path){
  let workbook = xlsx.readFile(downloaded_file_path);
  // Parse further
}

Как изменится этот код при выполнении процесса, который не требует сохранения файла в локальном каталоге?

1 Ответ

1 голос
/ 05 июня 2019

Для справки, вот моя идея с примером кода для ваших нужд, как показано ниже.

  1. Создание URL-адреса BLOB-объекта с токеном SAS

    var azure = require('azure-storage');
    var accountName = '<your account name>';
    var accountKey = '<your account key>';
    var blobService = azure.createBlobService(accountName, accountKey);
    
    var containerName = 'test-container';
    var blobName = 'test_blob.xlsx';
    
    var startDate = new Date();
    var expiryDate = new Date(startDate);
    expiryDate.setMinutes(startDate.getMinutes() + 100);
    startDate.setMinutes(startDate.getMinutes() - 100);
    
    var sharedAccessPolicy = {
      AccessPolicy: {
        Permissions: azure.BlobUtilities.SharedAccessPermissions.READ,
        Start: startDate,
        Expiry: expiryDate
      }
    };
    
    var token = blobService.generateSharedAccessSignature(containerName, blobName, sharedAccessPolicy);
    var sasUrl = blobService.getUrl(containerName, blobName, token);
    
  2. Считать байты тела двоичного объекта с помощью request, а затем использовать XLSX.read(data, read_opts) для анализа тела двоичного объекта как Uint8Array.

    var request = require('request');
    var XLSX = require('xlsx');
    request(sasUrl, {encoding: null}, function (error, response, body) {
      var workbook = XLSX.read(body, {type:"buffer"});
      console.log(workbook.Sheets.Sheet1);
    });
    

Надеюсь, это поможет.

...