BlobClient#generateSasUrl автоматически %-кодирует путь к большому двоичному объекту

const { BlockBlobClient, BlobSASPermissions } = require("@azure/storage-blob");

const blobClient = new BlockBlobClient(
  "DefaultEndpointsProtocol=https;AccountName=yyyy;AccountKey=xxxx;EndpointSuffix=core.windows.net",
  "test",
  "hoge/huga/baz.txt"
);

const expiresOn = new Date();
expiresOn.setMinutes(expiresOn.getMinutes() + 5);
const h = blobClient.generateSasUrl({ expiresOn, permissions: BlobSASPermissions.from({ read: true })}).then((res) => {
  console.info(res);
});

Выполнение этого сценария, использующего Azure JavaScript SDK, выводит https://yyyy.blob.core.windows.net/test/hoge%2Fhuga%2Fbaz.txt?sv=2024-05-04&se=2024-07-09T03%3A38%3A03Z&sr=b&sp=r&sig=wHPR6FOUyvXWdQafJ%2F8deC1lVH%2Fl0%2Fu4ZGqqLcsJDmU%3D.

Это ожидаемое поведение? Как мне сделать так, чтобы путь был /test/hoge/huga/baz.txt?

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это ожидаемое поведение? Как мне сделать так, чтобы путь был /test/hoge/huga/baz.txt?

Да, это ожидаемое поведение, вы можете изменить ожидаемый (декодированный) путь, используя приведенный ниже код.

Код:

const { BlockBlobClient, BlobSASPermissions } = require("@azure/storage-blob");

const blobClient = new BlockBlobClient(
  "DefaultEndpointsProtocol=https;AccountName=venkat891;AccountKey=r4kv43+pifLxxxxxx;EndpointSuffix=core.windows.net",
  "sample",
  "data/store/001.csv"
);

const expiresOn = new Date();
expiresOn.setMinutes(expiresOn.getMinutes() + 5);

blobClient.generateSasUrl({ expiresOn, permissions: BlobSASPermissions.from({ read: true })})
  .then((res) => {
    console.info('Encoded URL:', res);

    const url = new URL(res);
    const encodedPath = url.pathname;
    const decodedPath = decodeURIComponent(encodedPath);
    const decodedUrl = url.origin + decodedPath + url.search;

    console.info('Decoded URL:', decodedUrl);
  });

Выход:

PS C:\Users\xxxvexxkat\xxx> node example.js
Encoded URL: https://venkat891.blob.core.windows.net/sample/data%2Fstore%2F001.csv?sv=2024-05-04&se=2024-07-09T04%3A15%3A24Z&sr=b&sp=r&sig=zBG%2Bxe90xxxxxxxx
Decoded URL: https://venkat891.blob.core.windows.net/sample/data/store/001.csv?sv=2024-05-04&se=2024-07-09T04%3A15%3A24Z&sr=b&sp=r&sig=zBGxxxxx

Я также проверил, что URL-адрес большого двоичного объекта работает нормально.

Мой коллега продолжил расследование по этому поводу. Обоснование этой конструкции объясняется в https://github.com/Azure/azure-sdk-for-js/issues/6886#issuecomment-572852591.

Согласно https://github.com/Azure/azure-sdk-for-js/pull/23461, исправление заключается в использовании ContainerClient#getBlobClient.

const client = new ContainerClient(
  "DefaultEndpointsProtocol=https;AccountName=yyyy;AccountKey=xxxx;EndpointSuffix=core.windows.net",
  "test"
).getBlobClient("hoge/huga/baz.txt");

const expiresOn = new Date();
expiresOn.setMinutes(expiresOn.getMinutes() + 5);

client
  .generateSasUrl({
    expiresOn,
    permissions: BlobSASPermissions.from({ read: true }),
  })
  .then((res) => {
    console.info(res);
  });

Другие вопросы по теме

Ошибка авторизации при отправке большого двоичного объекта с управляемой идентификацией
Можем ли мы предоставить участнику данных BLOB-объектов хранилища разрешение на регистрацию приложения Azure?
Azure Blob: как автоматизировать преобразование архивного хранилища Azure в холодный/горячий уровень, отправить ссылку для загрузки, как только она станет доступна, и повторно заархивировать через 72 часа?
AddDataProtection().PersistKeysToAzureBlobStorage().ProtectKeysWithAzureKeyVault() получает ошибку httpVerb при доступе к хранилищу BLOB-объектов
Синхронизация файлов Azure с хранилищем BLOB-объектов
Проблема syncfusion_flutter_pdfviewer: не показывает PDF-файл на веб-сайте
Если контейнер хранилища BLOB-объектов является частным, нужно ли функциям Azure использовать токены sas для доступа?
Как создать zip-архив из нескольких файлов BLOB-объектов Azure?
Как отображать документы PDF/изображения, хранящиеся в хранилище Azure, с помощью Flask + Flutter
Внутренняя функция как обратный вызов не вызывается