BLOB-объект Azure DownloadToStream указывает имя локального файла - PullRequest
0 голосов
/ 08 апреля 2019

Я загружаю pdf-файл из хранилища BLOB-объектов Azure и указываю имя и расширение локального файла.

Он хорошо загружается в каталог загрузок, но с именем Microsoft.WidowsAzure.Storage.Blob имя файла и без расширения.

Я хочу указать имя файла, а не каталог, который подходит.

    MemoryStream memStream = new MemoryStream();
    blockBlob.DownloadToStream(memStream);
    HttpContext.Current.Response.ContentType = blockBlob.Properties.ContentType.ToString();
    // Response.AddHeader("Content-Disposition", "Attachment; filename=" + blobName.ToString());    
    HttpContext.Current.Response.AddHeader("Content-Disposition", "Attachment; filename=" + blockBlob.ToString());
    HttpContext.Current.Response.AddHeader("Content-Length", blockBlob.Properties.Length.ToString());
    HttpContext.Current.Response.BinaryWrite(memStream.ToArray());
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();

1 Ответ

0 голосов
/ 08 апреля 2019

Метод .ToString() по умолчанию для любого класса, если он не переопределен этим классом, напечатает полное имя класса (как это происходит в вашем случае).Вместо этого вам нужно использовать свойство BLOB .Name, чтобы получить ключ.Получив ключ, вы можете сократить его до части имени файла:

string fileName = Path.GetFileName(blob.Name);
HttpContext.Current.Response.AddHeader("Content-Disposition", "Attachment; filename=" + fileName);

В целях безопасности (с точки зрения использования плохих символов в имени файла) вы можете рассмотреть возможность использования filename*=, как описано в RFC6266 с соответствующей кодировкой:

string encodedFileName = Server.UrlEncode(Path.GetFileName(blob.Name), Encoding.UTF8);
HttpContext.Current.Response.AddHeader("Content-Disposition", "Attachment; filename*=UTF-8''" + fileName);

Подробнее см. Этот вопрос .

...