Как обслуживать файл в 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");
}
При этом пользователь получит приглашение на загрузку из браузера.