Как загрузить изображение в хранилище BLOB-объектов Azure - PullRequest
0 голосов
/ 25 сентября 2019

Я прочитал и обнаружил, что лучший способ загрузки изображений - использование хранилища больших двоичных объектов.Я хочу использовать его с node.js.Как я могу загрузить, например, изображение в блоб, используя код node.js?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Вы можете использовать перечисленные ниже SDK

https://github.com/Azure/azure-storage-node#microsoft-azure-storage-sdk-for-nodejs-and-javascript-for-browsers enter image description here

Если вы не изменяете существующий код и не пишете с нуля, вы лучшеиспользуйте первый (Storage SDK v10 для javascript).Вы можете сослаться на мой код ниже:

const {
    Aborter, BlobURL,
    BlockBlobURL, ContainerURL,
    ServiceURL,
    StorageURL,
    SharedKeyCredential,
    generateBlobSASQueryParameters,
    uploadStreamToBlockBlob,
    BlobSASPermissions,
    SASProtocol,
    AnonymousCredential,
} = require("@azure/storage-blob");

const STORAGE_ACCOUNT_NAME = process.env.STORAGE_ACCOUNT;
const ACCOUNT_ACCESS_KEY = process.env.STORAGE_KEY;
const AS = {};    // Azure Storage
console.log(STORAGE_ACCOUNT_NAME);
/*
const ONE_MEGABYTE = 1024 * 1024;
const FOUR_MEGABYTES = 4 * ONE_MEGABYTE;
const ONE_MINUTE = 60 * 1000;
By default, credential is always the last element of pipeline factories
const factories = serviceURL.pipeline.factories;
const sharedKeyCredential = factories[factories.length - 1];
*/

AS.getServiceUrl = () => {
    const credentials = new SharedKeyCredential(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
    const pipeline = StorageURL.newPipeline(credentials);
    const serviceURL = new ServiceURL(`https://${STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, pipeline);
    return serviceURL;
}

AS.createBlockBlobSASToken = (blobName, containerName, options) => {
    const now = new Date();
    now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server
    const tmr = new Date();
    tmr.setDate(tmr.getDate() + 1);
    const credentials = new SharedKeyCredential(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
    const blobSAS = generateBlobSASQueryParameters(
        {
            blobName,
            containerName,
            expiryTime: tmr,
            permissions: BlobSASPermissions.parse("racwd").toString(),
            protocol: SASProtocol.HTTPSandHTTP,
            startTime: now,
        },
        credentials
    );
    //const sasURL = `${blobURL.url}?${blobSAS}`;
    return blobSAS
}


AS.createContainerSASToken = (containerName, options) => {
    const now = new Date();
    now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server
    const tmr = new Date();
    tmr.setDate(tmr.getDate() + 1);
    const credentials = new SharedKeyCredential(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
    const containerSAS = generateBlobSASQueryParameters(
        {
            containerName,
            expiryTime: tmr,
            permissions: ContainerSASPermissions.parse("racwdl").toString(),
            protocol: SASProtocol.HTTPSandHTTP,
            startTime: now,
            version: "2016-05-31"
        },
        credentials
    );
    // const sasURL = `${containerURL.url}?${containerSAS}`;
    return containerSAS;
}

AS.createBlockBlobSASURL = (blobName, containerName) => {
    let blockBlobURL = getBlockBlobUrl(blobName, containerName);
    let blobSAS = createBlockBlobSASToken(blobName, containerName);
    const sasURL = `${blockBlobURL.url}?${blobSAS}`;
    return sasURL;
}

AS.createContainer = (containerName) => {
    const serviceURL = getServiceUrl();
    const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
    return containerURL.create(Aborter.none);
}

AS.getBlockBlobUrl = (blobName, containerName) => {
    const serviceURL = getServiceUrl();
    const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
    const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName);
    return blockBlobURL;
}

AS.uploadToBlockBlobFromStream = (blobName, containerName, readableStream, fileSizeInBytes) => {
    const blockBlobURL = getBlockBlobUrl(blobName, containerName);
    return uploadStreamToBlockBlob(Aborter.none,
        readableStream,
        blockBlobURL,
        256 * 1024,
        2,
        {
            progress: function (ev) {
                console.log((ev.loadedBytes / fileSizeInBytes) * 100);
            }
        }
    )
}

// const uploadFileFromBuffer = (blobName, containerName,buffer, fileSizeInBytes) =>{


// }

AS.uploadBlockBlobWithSAS = (blobName, containerName, readableStream, fileSizeInBytes) => {
    const blockBlobSasUrl = createBlockBlobSASURL(blobName, containerName);
    let blockBlobURL = new BlockBlobURL(blockBlobSasUrl, StorageURL.newPipeline(new AnonymousCredential()))
    return uploadStreamToBlockBlob(Aborter.none,
        readableStream,
        blockBlobURL,
        4 * 1024 * 1024,
        2,
        {
            progress: function (ev) {
                console.log((ev.loadedBytes / fileSizeInBytes) * 100);
            }
        }
    )
}

AS.deleteBlockBlob = (blobName, containerName) => {
    const blockBlobURL = getBlockBlobUrl(blobName, containerName);
    return blockBlobURL.delete(Aborter.none)

}

AS.downloadBlob = async (blobName, containerName) => {
    const blockBlobURL =  await getBlockBlobUrl(blobName, containerName);
    const downloadStream = await blockBlobURL.download(aborter, 0);
    return downloadStream;
}

module.exports = AS;
0 голосов
/ 26 сентября 2019

Если вы хотите использовать Blob с nodejs, существует пакет выпуска для его реализации.Это пакет Node.js и совместимая с браузером клиентская библиотека JavaScript, которая упрощает использование и управление службами хранения Microsoft Azure.

Более подробную информацию можно найти на этой странице github: Azure Storage SDK для Node.js .И вы можете загрузить локальный файл в BLOB-файл напрямую с помощью createBlockBlobFromLocalFile.

Также вы можете загрузить файл в поток для создания BLOB-объекта.Если вам нужен пример, вы можете обратиться к приведенному ниже коду.

var azure = require('azure-storage');
var blobService = azure.createBlobService("connection string");
blobService.createBlockBlobFromLocalFile('mycontainer', 'taskblob', 'task1-upload.txt', function(error, result, response) {
  if (!error) {
    // file uploaded
  }
});

Помимо этого, вы можете обратиться к официальному руководству по узлу BLOB-объекта Azure: с использованием клиентской библиотеки для Node.js .

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