ASP.NET MVC и связанные фотографии в общей папке - PullRequest
1 голос
/ 21 января 2010

Я пишу веб-приложение asp.net mvc, которое использует большое количество файлов .jpg, которые находятся в общей папке за пределами веб-сервера и недоступны по протоколу http.
Как разместить путь к изображению внутри img tag?

Ответы [ 2 ]

6 голосов
/ 21 января 2010

Не помещайте путь изображения внутри тега изображения в качестве параметра для сценария. Это называется прямой ссылкой на объект и является плохой вещью. Рассмотрим наивную реализацию такого скрипта / страницы / контроллера, который выглядит как /image/?resource=\server\path\img.jpg.

Что произойдет, если кто-нибудь загрузит / image / resource /? Resource = c: \ windows \ system32 \ config \ SAM? Ваша база паролей будет отправлена.

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

string filename = Path.GetFileName(userInputtedFilename);
FileInfo file = new FileInfo(Server.Path.Combine("\\Server\share\", filename)));

Это, по крайней мере, безопасно, но, конечно, пользователи могут просматривать все изображения, если они имеют подходящие названия. Еще безопаснее иметь косвенную ссылку на объект, таблицу сопоставления где-нибудь, которая сопоставляет что-то вроде GUID с фактическим именем файла и использует это в качестве параметра для вашего сценария обслуживания.

Для обслуживания файла вы возвращаете FileContentResult с вашего контроллера,

public FileContentResult GetFile(Guid indirectReference)
{
  byte[] fileContents = // Resolve the file and read it from the indirect reference      
  mimeType = // Suitable MIME type
  return File(fileContent, mimeType, fileName);
}
0 голосов
/ 21 января 2010

Если веб-сервер имеет регулярный сетевой доступ к этой общей папке и может читать файлы изображений, вы можете создать новый контроллер MVC Image с действием по умолчанию Index, которое принимает один строковый параметр с именем fn. Действие создаст новый FileResult из параметра. Затем, когда вы сгенерируете тег <img>, установите для URL что-то вроде /image/?fn=\\share\image.png. (Конечно, не забудьте добавить правильный маршрут для него)

Если веб-сервер не имеет доступа к этому общему ресурсу, но у пользователя страницы есть доступ, вы можете попробовать установить тег <img> на URL-адрес file:// для изображения. Однако это будет хрупким и может работать, а может и не работать, в зависимости от ОС пользователя и конфигурации браузера.

Обновление: Прочтите о безопасности @blowdart, упомянутой в его ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...