Отображение загруженного изображения в MVC 3 Razor - PullRequest
9 голосов
/ 06 сентября 2011

Ну, этот новичок делает что-то не так при отображении изображений, загруженных на сервер:

модель:

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string ImageUrl { get; set; }
}   

контроллер (загрузка - вызывается [HttpPost] public ActionResult Create):

public void Upload(Person person)
{
    var image = WebImage.GetImageFromRequest();
    var filename = Path.GetFileName(image.FileName);
    var path = Path.Combine(Server.MapPath("~/App_Data/Uploads/Fotos"), filename);
    image.Save(path);
    person.ImageUrl = Url.Content(Path.Combine("~/App_Data/Uploads/Fotos", filename));
}

создать вид:

...
@using (Html.BeginForm("Create", "Person", FormMethod.Post, new { @encType = "multipart/form-data" }))
{
    ...
    @FileUpload.GetHtml(initialNumberOfFiles: 1, allowMoreFilesToBeAdded: false, includeFormTag: false, uploadText: "image")
    ...
    <div>
        <input type="submit" value="Create" /> |
        @Html.ActionLink("Back", "Index")
    </div> 
}

Пока все хорошо, изображение загружается в папку и URL сохраняется

Теперь я хочу увидеть его в подробном представлении

подробный вид:

<div class="display-foto">
    <img src="@Url.Content(Server.MapPath(Model.ImageUrl))" alt="IMAGE" />                         
</div>

Просмотр сгенерированного кода, все в порядке:

<img src="D:\Users\x\Documents\Visual Studio 2010\Projects\CMI_AD\CMI_AD\App_Data\Uploads\Fotos\_nofoto.jpg" alt="IMAGE" />

Но дело в том, что на экране ничего не появляется, кроме текста «ИЗОБРАЖЕНИЕ».

Что я делаю не так?

P.S. Я пробовал без Server.MapPath, используя относительный адрес "~ \ App_Data \ Uploads \ Fotos_nofoto.jpg" и результат тот же.

--- РЕДАКТИРОВАТЬ ---

@ kmcc049: я попробовал ваше предложение создать помощника

public static class MyHelpers
{
    public static IHtmlString MyImage(this HtmlHelper htmlHelper, string url)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var img = new TagBuilder("img");
        img.Attributes["alt"] = "[IMAGE]";
        img.Attributes["src"] = UrlHelper.GenerateContentUrl(url, htmlHelper.ViewContext.HttpContext);
        return MvcHtmlString.Create(img.ToString(TagRenderMode.SelfClosing));
    }
}

вызов в виде:

@Html.MyImage(Model.ImageUrl)

сгенерированный код

<img alt="[IMAGE]" src="/App_Data/Uploads/Fotos/_nofoto.jpg" />

но результат тот же: нет изображения: (

--- решено ---

Очевидно, что App_Data не является подходящим местом для сохранения загруженных файлов, потому что доступ к ним приведет к ошибке 403 - запрещено. Я перемещаю файлы в ~ / Uploads / Fotos, и это работает.

1 Ответ

3 голосов
/ 06 сентября 2011

Это неверный путь HTTP.Это путь к папке на вашем компьютере.

попробуйте метод UrlHelper.GenerateContentUrl() вместо http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.generatecontenturl.aspx

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