Установить свойство 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", нужна помощь для того же!