2012-05-04 186 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我怎樣才能那麼請讓我知道如何,而不是嘲笑你的方式。 –

+0

通常,您應該顯示一些您嘗試過的代碼,並解釋您遇到的錯誤或您遇到的具體問題。詢問整個解決方案不是堆棧溢出的方式。這就是你沒有得到任何答案 – themarcuz

回答

0

在您的看法中,<input type="file" />應該使用名稱"file",以便模型活頁夾將其分配給您的動作中的file參數。

所以基本上:

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

你也錯過了第二個參數'Product product'。在控制器中分配它們的默認值。或在視圖中添加一個字段(隱藏或其他)。 – Doomsknight

+0

我如上設置名稱,但它仍然無法正常工作。if語句失敗,因爲HttpPostedFileBase實例爲空! –

0

嘗試重命名HttpPostedFileBase從文件參數上傳和測試公共的ActionResult創建(Product產品,HttpPostedFileBase文件) 公衆的ActionResult創建(產品產品再次

變化, HttpPostedFileBase上傳器)

我的意思是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 way.if你正在使用數據庫的第一個實體模型..你需要通過部分類即增加額外的領域。

public partial class Product      
    { 
     public HttpPostedFileBase File { get; set; } 
    }