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
?
Это ожидаемое поведение? Как мне сделать так, чтобы путь был
/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);
});