Загрузка нескольких изображений + текстовых полей в ASP.NET MVC
-
03-07-2019 - |
Вопрос
Я очень новичок в ASP.net MVC, поэтому, пожалуйста, будьте как можно более описательны в своем ответе :)
Позвольте мне упростить то, что я пытаюсь сделать.Представьте, что у меня есть форма, в которой вы хотите ввести некоторую информацию об автомобиле.Поля могут быть:Марка, Модель, Год выпуска, Изображение1, Изображение2.
В нижней части формы есть кнопка "Сохранить".Метод связанного контроллера сохранит Image1 и Image2 на диск, получит их имена файлов и свяжет их с моделью автомобиля, которая затем будет сохранена в базе данных.
Есть какие-нибудь идеи?
Спасибо, ребята!
Редактировать
winob0t помог мне проделать большую часть пути туда.Единственной нерешенной проблемой является следующее:Image1 и Image2 не являются обязательными полями, поэтому теперь я могу сохранить 0,1 или 2 изображения;но если пользователь загружает только 1 изображение, у меня нет способа узнать, пришло ли оно из imageUpload1 или imageUpload2.
Опять же, любая помощь приветствуется!
Решение
В вашем контроллере вы можете получить доступ к загруженным файлам следующим образом:
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;
}
Текстовые поля будут поступать к вашему действию контроллера как обычно, т.е.Запрос.Форма [...].Обратите внимание, что вам также нужно будет установить 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" })) { %>
<% } %>
Другие советы
Вот мое решение, приведенный выше ответ не совсем сработал в моей ситуации.Он не заботится о специфике формы и допускает многократную загрузку.
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);
}
}