#reactjs #azure-blob-storage #azure-webapps
Вопрос:
Я пытаюсь загрузить файлы в хранилище больших двоичных объектов в azure из веб-приложения react, но у меня возникли проблемы с подписью в заголовке авторизации.
Вот как выглядит sasToken в моем коде
const sasToken = `sv=2020-08-04amp;ss=bfqtamp;srt=scoamp;sp=rwdlacupxamp;se=2021-09-22T00:41:33Zamp;st=2021-09-20T16:41:33Zamp;spr=httpsamp;sig=svP/ecNOoteE%2**************=`;
const containerName = `containername`;
const storageAccountName = "acountname";
Вот как это выглядит при выполнении запросов GET и PUT getBlobsInContainer и createBlobinContainer.
sv=2020-08-04amp;ss=bfqtamp;srt=scoamp;sp=ghosteryamp;se=2021-09-22T00:41:33Zamp;st=2021-09-20T16:41:33Zamp;spr=httpsamp;sig=svP/FecNOoteE/**************=
Это каким-то образом перезаписывает параметр разрешения в токене.
https://accountname.blob.core.windows.net/containername?SASamp;comp=список и тип данных=контейнерamp;_=1632199288178
3 функции, с которыми мне приходится иметь дело.
// return list of blobs in container to display
const getBlobsInContainer = async (containerClient) => {
const returnedBlobUrls = [];
// get list of blobs in container
// eslint-disable-next-line
for await (const blob of containerClient.listBlobsFlat()) {
// if image is public, just construct URL
returnedBlobUrls.push(
`https://${storageAccountName}.blob.core.windows.net/${containerName}/${blob.name}`
);
}
return returnedBlobUrls;
};
const createBlobInContainer = async (containerClient, file) => {
console.log(`initialising blobclient for ${file.name}`);
// create blobClient for container
const blobClient = containerClient.getBlockBlobClient(file.name);
console.log("blobclient generated");
// set mimetype as determined from browser with file upload control
const options = { blobHTTPHeaders: { blobContentType: file.type } };
// upload file
await blobClient.uploadBrowserData(file, options);
console.log("Adding Metadata");
await blobClient.setMetadata({UserName : 'Reynolds'});
};
const uploadFileToBlob = async (file) => {
if (!file) return [];
// get BlobService = notice `?` is pulled out of sasToken - if created in Azure portal
const blobService = new BlobServiceClient(
`https://${storageAccountName}.blob.core.windows.net?${sasToken}`
);
console.log(`blobservice: https://${storageAccountName}.blob.core.windows.net/?${sasToken}`);
// get Container - full public read access
const containerClient = blobService.getContainerClient(containerName);
// upload file
await createBlobInContainer(containerClient, file);
// // get list of blobs in container
return getBlobsInContainer(containerClient);
};
Я в основном пытаюсь понять, почему это происходит и как это предотвратить/избежать. Код выполняется до тех console.log(`blobservice: https://${storageAccountName}.blob.core.windows.net/?${sasToken}`);
пор, пока не будет нарушен из-за ошибки 403 из-за недопустимой подписи.
Комментарии:
1. Это может быть связано с некоторым форматированием URL-адреса
2. @SaGaR да, я предполагаю, что это проблема с тем, как blob-сервис-клиент добавляет ключ SAS в контейнерный клиент или что-то в этом роде, но я не знаю, как решить эту проблему
3. Оказывается, на самом деле firefox делает с ним что-то странное. Я бы хотел, чтобы он мог работать в этом браузере, но, похоже, не хочет. Отлично работает на chrome и edge.
4. Приятно это слышать.
Ответ №1:
Спасибо @SaGaR за предложение, я превращаю это в ответ, который может помочь другим членам сообщества:
Итак, у firefox может быть какой-то сбой, и после проверки того же в браузерах chrome и edge, надеюсь, это сработало для вас.