azure блоб скачать через SAS - PullRequest
0 голосов
/ 15 апреля 2020

Все,

У меня есть контейнер BLOB-объектов с вложенными именами файлов (имитация папки).

Можно ли загружать через код (в обход веб-сервера) через SAS URI группу файлов, начинающихся с префикса? Прямо сейчас я архивирую эти файлы и отправляю их в поток ниже ..

  CloudBlobContainer container = GetRootContainer();
  CloudBlockBlob caseBlob = container.GetBlockBlobReference(folderPrefix);
  await caseBlob.DownloadToStreamAsync(zipStream);

Это работает, и я могу загрузить набор файлов, начиная с этого префикса, на клиентский компьютер. Однако это зависит от скорости веб-сервера и его сравнительно медленной скорости.

Есть ли пример того, как загрузить с помощью SAS, предоставив URI для папки? Вот пример, который я нашел в другом сообщении в stackoverflow

var sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5);
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10);
sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

return blob.Uri + sasBlobToken;
//Here can the URI point to the prefix??

Могу ли я использовать что-то подобное?

Спасибо!

1 Ответ

0 голосов
/ 15 апреля 2020

Это, безусловно, выполнимо, однако это не будет одношаговый процесс.

Во-первых, у вас не может быть токена SAS для виртуальной папки. Вам потребуется получить токен SAS для контейнера больших двоичных объектов с разрешениями List (для просмотра больших двоичных объектов) и Read (для загрузки больших двоичных объектов).

Далее вы перечислите большие двоичные объекты в виртуальной папке внутри. контейнер BLOB-объектов. Для этого вам необходимо указать путь к виртуальной папке в качестве префикса. Это даст вам список BLOB-объектов внутри этой виртуальной папки. Убедитесь, что вы указали пустую строку в качестве разделителя, чтобы в ней содержались все большие двоичные объекты в этих виртуальных папках.

После того, как у вас есть список больших двоичных объектов, вам нужно будет прочитать (загрузить) большие двоичные объекты и где-то сохранить их содержимое. в браузере.

После того, как вы прочитали содержимое блоба, вы можете использовать zip-библиотеку на основе JS для динамического создания содержимого zip-файла, и как только все капли будут добавлены в zip-файл, вы можете принудительно загрузить из этого почтового файла. Быстрый поиск zip-библиотеки на основе JS привел меня сюда: https://stuk.github.io/jszip/. Когда я реализовал эту функциональность в продукте, который я создал, я использовал библиотеку Zip JS, но, к сожалению, я не могу найти ее в Интернете, хотя сейчас.

Биты и кусочки кода, которые я написал много лет назад go (это было частью гораздо большего приложения +, когда я написал его, JS Storage SDK не было, поэтому извиняюсь, если код не имеет большого смысла для вас. Пожалуйста, используйте его только для общего руководства).

    zip.workerScriptsPath = '/Scripts/ZipJS/';
    zipWriter = new zip.BlobWriter();
    zip.createWriter(zipWriter, function (zipWriter) {
        startZippingFiles(zipWriter);
    }, function () {

    }, true);


function startZippingFiles(writer) {
    if (downloadedContent.length > 0) {//downloadedContent is an array containing downloaded blobs
        var downloadedContentItem = downloadedContent.shift();//read first item
        var cloudBlob = downloadedContentItem.Blob;//get the cloud blob object
        var blobContents = downloadedContentItem.Content;//get the blob's content
        var status = downloadedContentItem.Status;//status to track blob's download status
        if (status === 'Completed') {
            writer.add(cloudBlob.name,
                new zip.BlobReader(new Blob([blobContents], { type: cloudBlob.properties.contentType })), function () {
                    console.log(cloudBlob.name + ' added to zip...')
                    downloadedBlobsCount += 1;
                    startZippingFiles(writer);
                }, function (o) {
                    console.log('Adding ' + cloudBlob.name + ' to zip file. ' + parseFloat((o * 100) / cloudBlob.size).toFixed(2) + '% done...');
                });
        }
    } else {
        writer.close(function (blob) {//Finally save the zipped data as download.zip
            saveAs(blob, "download.zip");
            zipWriter = null;
        });
        console.log("Download successful!");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...