Установить свойство src в отношении URL-адреса вне проекта MVC3
Я пытаюсь создать приложение, которое будет отображать изображения, которые хранятся локально на веб-сервере. Вот что я имею в виду, обратите внимание, что "запись" - это абсолютные адреса, такие как "C:\Images\Image1.jpg"
. Однако, когда я запускаю его, я получаю "Not allowed to load local resource: file:///C:/Images/ImageName.jpg"
в журнале консоли. Возможно, он пытается получить доступ к изображению на клиенте. Как сообщить моему представлению о доступе к пути локального веб-сервера и не искать источник изображения на клиенте? Обратите внимание, что перемещение изображений в каталог проекта не является вариантом, поскольку изображения хранятся на другом диске на веб-сервере.
<!-- language: c# -->
@model List<String>
<div style="height: 500px; overflow:scroll;">
<h2>
ScreenShots for testMachine</h2>
@foreach (var entry in Model)
{
<div class="nailthumb-container square-thumb">
<img alt="screenshot" src="@Url.Content(entry)" />
</div>
}
</div>
Ответы
Ответ 1
Вы не можете напрямую обслуживать изображения вне вашего приложения ASP.NET MVC 3 для клиента. Это было бы большой уязвимостью безопасности, если бы клиент мог получить доступ к произвольным файлам на вашем сервере.
Вам нужно будет написать действие контроллера, которое вернет их, а затем укажите ваше свойство src
ваших тегов <img>
на это действие контроллера.
public class ImagesController: Controller
{
public ActionResult SomeImage()
{
return File(@"C:\Images\foo.jpg", "image/jpeg");
}
}
и внутри вашего представления:
<img src="@Url.Action("SomeImage", "Images")" alt="" />
Вы также можете передать имя изображения в качестве параметра для действия контроллера:
public class ImagesController: Controller
{
public ActionResult SomeImage(string imageName)
{
var root = @"C:\Images\";
var path = Path.Combine(root, imageName);
path = Path.GetFullPath(path);
if (!path.StartsWith(root))
{
// Ensure that we are serving file only inside the root folder
// and block requests outside like "../web.config"
throw new HttpException(403, "Forbidden");
}
return File(path, "image/jpeg");
}
}
и на ваш взгляд:
<img src="@Url.Action("SomeImage", "Images", new { image = "foo.jpg" })" alt="" />
Ответ 2
Приведенный выше код был полезен для меня, с таким изменением
System.Web.UI.Page page = new System.Web.UI.Page();
string filePath = page.Server.MapPath("~/Log/" + fileName);
if (!filePath.StartsWith(filePath))
{
throw new HttpException(403, "Forbidden");
}
return File(filePath, "Content-Disposition", "attachment;filename=TableImportLog.csv");
}
файл, брошенный пользователю, имеет имя файла, подобное этому "attachment; filename = TableImportLog.csv", но я хочу, чтобы имя файла было "TableErrorLog.csv",
нужна помощь для того же!