Как обслуживать файл в MVC, не раскрывая URL-адрес?

У меня есть средство просмотра дерева, которое позволяет пользователю просматривать файлы и подкаталоги, когда пользователь достигает файла, веб-сайт переходит на https://website.com/path/subpath/file.pdf. Предполагая, что я могу определить, что пользователь просматривает файл, произойдет следующее:

  • Контроллер создаст ключ SAS для извлечения файла из Azure.
  • Контроллер получит URL: https://myaccount.files.core.windows.net/path/?=accesskey

Хотя у пользователя нет проблем с просмотром этого ключа доступа, срок его действия в конечном итоге истечет, и чтобы пользователь добавил страницу в закладки, я бы хотел, чтобы пользователь не был перенаправлен на путь Azure, а для ASP.NET для вывода файла, как если бы пользователь все еще находился в https://website.com/path/subpath/file.pdf

Итак, последний вопрос в основном:

Как я могу вывести файл без принудительной загрузки и без отображения пути / URL-адреса файла?


person devSparkle    schedule 24.12.2015    source источник


Ответы (1)


Вы можете попытаться прочитать файл из вашего хранилища как массив байтов и использовать метод File, чтобы вернуть его из метода действия.

public ActionResult View(int id)
{
  // id is a unique id for the file. Use that to get the file from your storage.
  byte[] byteArrayOfFile=GetFileInByteArrayFormatFromId(id);
  return File(byteArrayOfFile,"application/pdf");
}

Предположим, что GetFileInByteArrayFormatFromId возвращает версию файла в виде массива байтов после чтения из хранилища/лазури. Вы можете рассмотреть возможность кэширования некоторых файлов в своей среде, чтобы вам не приходилось обращаться к Azure для получения их по каждому запросу.

Если вы можете прочитать файл как файловый поток, метод File имеет перегрузку, которая также принимает это.

public ActionResult View(int id)
{
  // id is a unique id for the file. Use that to get the file from your storage.
  FileStream fileStream = GetFileStreamFromId(id);;
  return File(fileStream, "application/pdf","Myfile.pdf");
}

И если у вас есть файл, доступный на вашем сервере (кешированные файлы), вы можете использовать другую перегрузку метода File, где вы будете передавать путь вместо массива байтов.

public ActionResult View(int id)
{
  var f = Server.MapPath("~/Content/Downloads/sampleFile.pdf");
  return File(f,"application/pdf");
}

Если браузер поддерживает отображение типа содержимого ответа, ответ будет отображаться в браузере. Большинство основных браузеров поддерживает рендеринг файлов PDF.

Существует еще одна перегрузка метода File, которая принимает имя загружаемого файла, которое будет использоваться в диалоговом окне сохранения/загрузки браузера, чтобы пользователь мог сохранить его на своем локальном компьютере и/или открыть.

public ActionResult View(int id)
{
    var pathToTheFile=Server.MapPath("~/Content/Downloads/sampleFile.pdf");
    return File(pathToTheFile, MimeMapping.GetMimeMapping(pathToTheFile),"Myfile.pdf");
}
public ActionResult ViewFromByteArray(int id)
{
    byte[] byteArrayOfFile=GetFileInByteArrayFormatFromId(id);
    return File(byteArrayOfFile, "application/pdf","Myfile.pdf");
}

При этом пользователь получит запрос на загрузку из браузера.

person Shyju    schedule 24.12.2015
comment
Azure позволяет прямую загрузку в виде массива байтов с помощью file.DownloadToByteArray() - person devSparkle; 24.12.2015