Как скачать Azure BLOB-файл в папку загрузки, а не в браузер - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу поместить кнопку на странице, и когда пользователь нажимает кнопку, я хочу загрузить azure blob в папку загрузки.

  1. Я создаю URL ссылки на BLOB-объект:

    var downloadLink = blobService.getUrl ('mycontainer', 'myblob', 'SAS_TOKEN');

  2. Как только я получу этот URL, я использую это решение для загрузки:

    var link = document.createElement("a");
    link.download = name;
    link.href = url;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    

Я использовал то же самое в S3, файл можно загрузить в тот же браузер и в папку загрузки, но для Azure, когда я использую это решение, он просто открывает новую вкладку и отображает содержимое в браузере.

Может кто-нибудь помочь понять, почему это? Как загрузить файл вместо отображения содержимого в браузере?

Сгенерированный URL-адрес:

https://myBucket.blob.core.windows.net/mycontainer/1000/rawEvents.json?se=2022-04-20T23%3A59%3A59Z&sp=rwdlacup&sv=2018-03-28&ss=b&srt=sco&sig=EzsjwqKfYmwwUo2n1ySkCBAsTfW35ic8M8F6tfuXEPo%3D

Если при нажатии на этот URL-адрес , он также может читать содержимое.

1 Ответ

2 голосов
/ 12 апреля 2020

Вы должны убедиться, что заголовки Content-Type и Content-Disposition имеют значения, которые инициируют загрузку файлов вашим браузером. Особенно важно Content-Disposition.

Content-Type: application/octet-stream
Content-Disposition: attachment

Вы можете установить расположение контента на самом BLOB-объекте

        var blob = container.GetBlobReference(userFileName);
        blob.Properties.ContentDisposition = "attachment";
        blob.SetProperties();

или добавить его в свой Маркер SAS (см. Также соответствующий пост в блоге ).

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("videos");
        string userFileName = service.FirstName + service.LastName + "Video.mp4";
        CloudBlockBlob blob = container.GetBlockBlobReference(userFileName);
        SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy()
        {
            Permissions = SharedAccessBlobPermissions.Read,
            SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
        };
        SharedAccessBlobHeaders blobHeaders = new SharedAccessBlobHeaders()
        {
            ContentDisposition = "attachment; filename=" + userFileName
        };
        string sasToken = blob.GetSharedAccessSignature(policy, blobHeaders);
        var sasUrl = blob.Uri.AbsoluteUri + sasToken;//This is the URL you will use. It will force the user to download the video.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...