Mvc 3 Галерея изображений - PullRequest
14 голосов
/ 17 мая 2011

Я реализовал загрузку файлов для изображений, используя ASP.NET Mvc 3 и Microsoft.Web.Helpers NuGet пакет . Реализация довольно проста, так как позволяет вам искать файл и загружать его в указанный каталог.

Вот что у меня есть для решения по загрузке изображений с использованием ASP.NET MVC 3 и плагина Microsoft.Web.Helpers NuGet .

enter image description here

Теперь ViewModel код

 namespace MvcImageUpload.Models {
    public class ImageUploadViewModel {
        [UIHint("UploadedImage")]
        public string ImageUrl { get; set; }
        public string ImageAltText { get; set; }
    }    
}

Теперь для контроллера Я просто перенес это в контроллер Home, поскольку это всего лишь фиктивный проект, чтобы заставить его работать. Я только что добавил ActionResult, который принимает ImageUploadViewModel в качестве параметра.

      public ActionResult Upload(ImageUploadViewModel model) {
        var image = WebImage.GetImageFromRequest();

        if (image != null) {
            if (image.Width > 500) {
                image.Resize(500, ((500 * image.Height) / image.Width));
            }

            var filename = Path.GetFileName(image.FileName);
            image.Save(Path.Combine("../Uploads/Images", filename));
            filename = Path.Combine("~/Uploads/Images", filename);

                model.ImageUrl = Url.Content(filename);
                model.ImageAltText = image.FileName.Substring(0, image.FileName.Length - 4);

        }

        return View("Index", model);
    }

Мой взгляд на загрузку изображений прост, у него есть Html.BeginForm, который обрабатывает метод формы Post и имеет тип кодировки, равный «multipart / form-data».

Затем с помощью помощника Microsoft.Web.Helpers.FileUpload я запрашиваю изображение из сообщения HTTP, а затем отображаю его с помощью пользовательского шаблона DisplayFor, называемого ImageViewer.

 @model MvcImageUpload.Models.ImageUploadViewModel
    @using Microsoft.Web.Helpers;
    @{
        ViewBag.Title = "Index";
     }

    <h2>Image Uploader</h2>
    @using (Html.BeginForm("Upload", "Home", FormMethod.Post, 
        new { @encType = "multipart/form-data" })) {           
        @FileUpload.GetHtml(initialNumberOfFiles: 1, allowMoreFilesToBeAdded: false, 
            includeFormTag: false, addText: "Add Files", uploadText: "Upload File") <br />        

        <input type="submit" name="submit" 
               value="Upload Image" text="Upload Images" 
               style="font-size: .9em;" />
        @Html.DisplayFor(x => x, "ImageViewer")<br />
    }

Вот как выглядит пользовательский DisplayTemplate

    @model MvcImageUpload.Models.ImageUploadViewModel
@if (Model != null) { 
    <h4 style="color:Green;">Upload Success!</h4>           
    <p>
        Alt Text has been set to <strong>@Model.ImageAltText</strong>
    </p>
    <img  style="padding: 20px;" 
        src="@(String.IsNullOrEmpty(Model.ImageUrl) ? "" : Model.ImageUrl)" 
            id="uploadedImage"  alt="@Model.ImageAltText"/>
}

Это все работает, и изображение успешно загружено в /Uploads/Images/FileName.extension в сообщении формы.

Мой вопрос

Как теперь я могу иметь другое представление для отображения всех изображений в этом каталоге, разбито на страницы и иметь возможность выбирать, удалять и изображения из представления и каталога?

Также я знаю, что Microsoft.Web.Helpers.FileUpload поддерживает загрузку нескольких файлов, но я не могу найти, как реализовать это с моим текущим решением. Любая помощь будет высоко оценена.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2011

После того, как вы нажмете кнопку «Загрузить изображение», система должна вызвать метод, который использует Request для получения файла.

    [HttpPost]
    public ActionResult Upload()
    {
        if(Request.Files != null && Request.Files.Count > 0)
        {
                for (int i = 0; i < request.Files.Count; i++)
                {
                    var postFile = request.Files[i];
                    if (postFile != null && postFile.ContentLength > 0)
                    {
                        if (postFile.ContentLength < GetMaxRequestLength())  //10MB
                        {
                             var file = new ContractAttachment
                            {
                                Name = Path.GetFileName(postFile.FileName),
                                ContentType = postFile.ContentType,
                                FileLength = postFile.ContentLength,
                                FileData = GetStreamBuffer(postFile)
                            };
                            files.Add(file);
                        }

                    }
                }
          }

    }

Надеюсь, эта помощь.

1 голос
/ 17 мая 2011

то, что вы спрашиваете, выглядит скорее реализацией для меня, чем для любого запроса ....

для отображения: Получить все изображения из вашего каталога Uploads / Images через DirectoryInfo ... вы можете искать каталог на основе некоторого расширения, а затем он даст вам набор результатов, который вы можете повторить .....

Создайте представление, которое будет отображать все записи в виде ссылок на изображения и в контроллере извлекать набор результатов в это представление .... Свяжите эти записи так, как вы хотите, чтобы они отображались в вашем VIEW ...

System.IO.DirectoryInfo info = new System.IO.DirectoryInfo("your directory path");
               var filesinfo= info.GetFiles("*.jpg", System.IO.SearchOption.AllDirectories);
               var filenum= filesinfo.GetEnumerator();
               while (filenum.MoveNext())
               {
                   //populate some entity like in your case you have ImageUploadViewModel
               }

и вы можете реализовать свою логику удаления, используя Ajax или через post back, в зависимости от того, как вы этого хотите ....

Представления Asp.net MVC после этого урока, и оно позволит вам пройти через это ....

но опять же, то, что вы спрашиваете, больше похоже на реализацию кода, а не на проблему ...

0 голосов
/ 06 октября 2011

Подход, которым я следовал ранее, заключается в сохранении информации о файле в базе данных (или в любом другом подходящем). например путь, имя файла, тип контента, размер файла. Это дает вам наибольшую гибкость при редактировании (альтернативный текст, заголовок, описание, отношение к другим объектам). Загрузка / просмотр файлов может быть обработана в соответствии с условным обозначением пути путем создания контроллера ViewImage, который просто получает идентификатор изображения в качестве параметра. Затем вы можете создать URL-адрес из пути к файлу, и вам нужно только установить тип содержимого. IIS делает все остальное.

...