Загрузка нескольких изображений + текстовые поля в ASP.NET MVC - PullRequest
5 голосов
/ 03 марта 2009

Я очень плохо знаком с ASP.net MVC, поэтому, пожалуйста, будьте как можно более информативны в своем ответе:)

Позвольте мне упростить то, что я пытаюсь сделать. Представьте, что у меня есть форма, в которую вы хотите ввести некоторую информацию об автомобиле. Поля могут быть следующими: Марка, Модель, Год, Изображение1, Изображение2.

В нижней части формы находится кнопка «Сохранить». Связанный метод Controller сохранит Image1 и Image2 на диск, получит их имена и свяжет их с моделью автомобиля, которая затем будет сохранена в базе данных.

Есть идеи?

Спасибо, ребята!

Редактировать

winob0t дал мне большую часть пути туда. Единственная нерешенная проблема заключается в следующем: поля Image1 и Image2 не являются обязательными, поэтому теперь я могу сохранить 0,1 или 2 изображения; но если пользователь загружает только 1 изображение, у меня нет возможности узнать, пришло ли оно из imageUpload1 или imageUpload2.

Опять же, любая помощь приветствуется!

Ответы [ 2 ]

7 голосов
/ 03 марта 2009

В вашем контроллере вы можете получить доступ к загруженным файлам как:

    if(Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) {
        HttpPostedFileBase postFile = Request.Files.Get(0);
        string filename = GenerateUniqueFileName(postFile.FileName);
        postFile.SaveAs(server.MapPath(FileDirectoryPath + filename));
    }

protected virtual string GenerateUniqueFileName(string filename) {

    // get the extension
    string ext = Path.GetExtension(filename);
    string newFileName = "";

    // generate filename, until it's a unique filename
    bool unique = false;

    do {
        Random r = new Random();
        newFileName = Path.GetFileNameWithoutExtension(filename) + "_" + r.Next().ToString() + ext;
        unique = !File.Exists(FileDirectoryPath + newFileName);
    } while(!unique);
    return newFileName;
}

Текстовые поля поступят на действие вашего контроллера, как обычно, т.е. Request.Form [...]. Обратите внимание, что вам также нужно установить enctype в форме «multipart / form-data». Похоже, вы понимаете достаточно о ASP.NET MVC, чтобы сделать все остальное. Также обратите внимание, что вы можете объявить свой тег формы в представлении aspx следующим образом, хотя вы можете использовать более традиционный подход, если хотите.

<% using(Html.BeginForm<FooController>(c => c.Submit(), FormMethod.Post, new { enctype = "multipart/form-data", @id = formId, @class = "submitItem" })) { %> 

<% } %>
1 голос
/ 30 июля 2012

Вот мое решение, приведенный выше ответ не совсем подходит для моей ситуации. Он не заботится об особенностях формы и допускает несколько загрузок.

    for (int i = (Request.Files.Count - 1); i >= 0; i--)
    {
          if (Request.Files != null && Request.Files[i].ContentLength > 0)
          {
               string path = this.Server.MapPath("~/Content/images/");
               string filename = Path.GetFileName(Request.Files[i].FileName);
               string fullpath = Path.Combine(path, filename);
               Request.Files[i].SaveAs(fullpath);
           }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...