Нужно исправить код для загрузки и выгрузки изображений из голубых пятен с помощью nodejs - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь написать приложение nodejs, которое загружает изображения в большой двоичный объект Azure, чтобы затем другая программа могла подключиться к БД и загрузить изображение.

У меня возникли проблемы с кодом, полученным изкапли API.Я думаю, что загрузка работает правильно, но я не могу загрузить изображение с указанного URL.

async function execute() {

    const containerName = "a00008";
    const blobName = "myBlob";
    const content = "./sun.png";
    const localFilePath = "./sun.png";

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

    const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);

    const aborter = Aborter.timeout(30 * ONE_MINUTE);


    await showContainerNames(aborter, serviceURL);

    await containerURL.create(aborter);


    await uploadLocalFile(aborter, containerURL, content);
    console.log(`Local file "${content}" is uploaded`);

    await uploadStream(aborter, containerURL, localFilePath);
    console.log(`Local file "${localFilePath}" is uploaded as a stream`);




    const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, content);
    console.log("The blobs URL is: " + JSON.stringify(blockBlobURL.url));

    const downloadResponse = await blockBlobURL.download(aborter, 0);
    downloadedContent = downloadResponse.readableStreamBody.read(content.length)
    console.log(`Downloaded blob content: "${downloadedContent}"`);}

    execute().then(() => console.log("Done")).catch((e) => console.log(e));

Вот код для uploadLocalFile и uploadLocalStream, которые они непосредственно взяты из документов MS azure:

async function uploadLocalFile(aborter, containerURL, filePath) {

    filePath = path.resolve(filePath);

    const fileName = path.basename(filePath);
    const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, fileName);

    return await uploadFileToBlockBlob(aborter, filePath, blockBlobURL);
}

async function uploadStream(aborter, containerURL, filePath) {

    filePath = path.resolve(filePath);

    const fileName = path.basename(filePath).replace('.md', '-stream.md');
    const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, fileName);

    const stream = fs.createReadStream(filePath, {
      highWaterMark: FOUR_MEGABYTES,
    });

    const uploadOptions = {
        bufferSize: FOUR_MEGABYTES,
        maxBuffers: 5,
    };

    return await uploadStreamToBlockBlob(
                    aborter, 
                    stream, 
                    blockBlobURL, 
                    uploadOptions.bufferSize, 
                    uploadOptions.maxBuffers);
}

Я попробовал оба uploadLocalFile и uploadStream. Я комментирую 1 из них и пробую другой сам, не уверенный, какой из них правильный для изображений.

Если я перейду кblockBlobURL Я получаю сообщение об ошибке: этот XML-файл не имеет никакой информации о стиле, связанной с ним.Дерево документа показано ниже.

А также, когда я console.log выводит содержимое BLOB-объекта: Загруженное содержимое BLOB-объекта: «NPNG → с этим странным символом? Перед PNG и стрелкой после него.

Вот вывод: enter image description here

Так что я не уверен, что я делаю неправильно, я думаю, что я загружаю правильно (не уверен, должен ли я использовать uploadLocalFile илиuploadLocalStream хотя, но я думаю, что загрузка работает успешно), что я делаю не так с загрузкой, правда, я лично не буду загружать файлы, просто делаю это, чтобы убедиться, что это работает, другая программа, которая подключается к БД, будетзагрузить файл. Также, если вы видите ссылку для большого двоичного объекта после того, как a0008 имеет /./, и когда я размещаю эту ссылку в браузере, она удаляет эту часть, я не знаю, что означает эта часть /./.

Спасибо

1 Ответ

0 голосов
/ 30 января 2019

URL-адрес BLOB-объекта состоит из хоста вашей учетной записи хранилища BLOB-объектов Azure, имени контейнера и имени BLOB-объекта.Например, URL-адрес BLOB-объекта https://facerstorage.blob.core.windows.net/a00008/./sun.png включает имя контейнера a00008 и имя BLOB-объекта ./sun.png.

. В соответствии с вашим кодом странное имя BLOB-объекта ./sun.png создается с помощью кода ниже.

# In function uploadLocalFile
const fileName = path.basename(filePath);
const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, fileName);

# In function uploadStream
const fileName = path.basename(filePath).replace('.md', '-stream.md');
const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, fileName);

Чтобы исправить это, вам просто нужно проверить значение переменной fileName выше, чтобы убедиться, что вы хотите.

Как я знаю, ваши коды взяты из официального документа Quickstart: Upload, download, list, and delete blobs using Azure Storage v10 SDK for JavaScript (preview), который использовал предварительную версию Storage SDK для узла v10 через npm i @azure/storage-blob.

Существует еще одна версия Storage SDK для узла v2 который может быть установлен через npm install azure-storage, вы можете обратиться к README документу GitHub repo Azure/azure-storage-node.

Соответствующий код прост в v2 версии.

var azure = require('azure-storage');
var accountName = '<your account name>';
var accountKey = '<your account key>';
var blobService = azure.createBlobService(accountName, accountKey);
var containerName = '<your container name>';
blobService.createContainerIfNotExists(containerName, {
  publicAccessLevel: 'blob'
}, function(error, result, response) {
  if (!error) {
    // if result = true, container was created.
    // if result = false, container already existed.
  }
});

var blobName = '<your blob name, such as sun.png>';
var localFile = '<your local file, such as ./sun.jpg>';
blobService.createBlockBlobFromLocalFile(containerName, blobName, localFile, function(error, result, response) {
  if (!error) {
    // file uploaded
  }
});

Я вижу, вы публикуете еще одну SO-ветку Нужна помощь в загрузке изображений из BLOB-объектов Azure с помощью NodeJS с использованием SDK v10, но я думаю, что API-интерфейсы v2 SDK для вас просты сейчас.

...