2012-05-04 3 views
1

Мне нужно сохранить изображение, которое пользователь выбирает из управления загрузкой файла в файл на сайте, например Content/Images, и использует GUID для имени этого изображения и сохраняет этот GUID в базе данных. Я новичок в MVC, поэтому, пожалуйста, помогите мне с подробностями. Спасибо всем. Вот мой контроллер ...Как сохранить изображение в файле и сохранить имя изображения в базе данных с помощью MVC3?

[HttpPost] 
    public ActionResult Create(Product product,HttpPostedFileBase file) 
    { 
     if (file!=null&&file.ContentLength>0) 
     { 
      var FileName = string.Format("{0}.{1}",Guid.NewGuid(),file.ContentType); 
      var path = Path.Combine(Server.MapPath("~/Content/Images"), FileName); 
      file.SaveAs(path); 
     } 
     if (ModelState.IsValid) 
     { 
      db.Products.AddObject(product); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName", product.CategoryID); 
     return View(product); 
    } 

А вот мой взгляд ...

 @using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) 
     { 
      <input type="file" name="Uploader" /> 
     } 

Я не знаю, что случилось на всех ... , но нет ни одного случая HttpPostedFileBase так Оператор if не работает.

+1

Это звучит как домашнее задание ... и это звучит, как вы даже не попробовать себя до сих пор ... – themarcuz

+0

На самом деле я пытался каждую вещь, но я не могу найти answer.if вам теперь, как я могу сделайте это, пожалуйста, дайте мне знать, как вместо mocking.tnx 4 ваше внимание кстати. –

+0

Обычно вы должны показать код, который вы пробовали, и объяснить, какую ошибку вы получите или какую конкретную проблему у вас есть. Просить целое решение - это не способ переполнения стека. Так вы не получаете ответа – themarcuz

ответ

0

На ваш взгляд, <input type="file" /> должен иметь имя "file", так что блок Binder присваивает его параметру file в вашем действии.

Так в основном:

@using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
     <input type="file" name="file" /> 
    } 
+0

У вас также отсутствует второй параметр «Продукт продукта». Либо присвойте им значения по умолчанию в вашем контроллере. или добавить поле (скрытое или другое) на ваш взгляд. – Doomsknight

+0

Я установил имя, как указано выше, но он все еще не работает. Если утверждение if не выполняется, потому что экземпляр HttpPostedFileBase имеет значение null! –

0

Попробуйте переименовать HttpPostedFileBase параметр из файла в Uploader и тест снова

переход от общественного ActionResult СОЗДАТЬ (продукт продукта, HttpPostedFileBase файл) общественному ActionResult СОЗДАТЬ (продукт продукта, HttpPostedFileBase Uploader)

Я имею в виду имя тега html и имя параметра - то же самое.

0

Измените свое действие на это:

[HttpPost] 
public ActionResult Create(Product product) 
{ 
    var files = controllerContext.RequestContext.HttpContext.Request.Files; 

    foreach (string inputName in files) 
    { 
     file = files[inputName]; 

     if (file != null && file.ContentLength > 0) 
     { 
      var FileName = string.Format("{0}.{1}", Guid.NewGuid(), file.ContentType); 
      var path = Path.Combine(Server.MapPath("~/Content/Images"), FileName); 
      file.SaveAs(path); 
     } 

    } 

    ... do other stuff here ... 

} 
0

Вам необходимо некоторое условие, как показано ниже .. Значение CONTENTTYPE, как это изображение/PNG, изображение/GIF, изображение/JPEG так, когда вы объединяете его что-то вроде этого:

0f269598-0d66-4453-A3B5-a8f07254c531.image/PNG

Код здесь

string fileExt = "jpg"; 
if (Imagename.ContentType == "image/png") { fileExt = "png"; } 
else if (Imagename.ContentType == "image/gif") { fileExt = "gif"; } 
else if (Imagename.ContentType == "image/jpeg") { fileExt = "jpg"; } 
0

Используйте как это вместо того, сравнивая все типы изображений:

fileName = string.Format("{0}{1}", Guid.NewGuid(), 
Path.GetExtension(file.FileName)); 
0

почему бы вам не добавить «HttpPostedFileBase файл» в модели продукта, вместо отправки его отдельно, например: модель:

public HttpPostedFileBase File { get; set; } 

вид:

@Html.TextBoxFor(m => m.File, new { type = "file" }) 

это работало как очарование для меня !!

oh.by способом. Если вы используете базовую модель сущности базы данных. Вам нужно добавить это дополнительное поле через частичный класс, то есть.

public partial class Product      
    { 
     public HttpPostedFileBase File { get; set; } 
    } 
Смежные вопросы