Как обслуживать файл в 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?

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");
}

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

Другие вопросы по тегам