2012-05-04 22 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パラメーターに割り当てます。

だから、基本的には:公共のActionResultに

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

両方とも、第2のパラメータ '製品の製品'がありません。コントローラにデフォルト値を割り当ててください。またはあなたのビューに(隠されたかそうでない)フィールドを追加します。 – Doomsknight

+0

上記のようにNameを設定しましたが、HttpPostedFileBaseインスタンスがnullであるため、if文も失敗します。 –

0

は、(製品の製品、HttpPostedFileBaseファイル)を作成し、公共のActionResultからHttpPostedFileBaseファイルからアップローダへのパラメータとテスト再び

変更の名前を変更してみ は、(製品の製品を作成し、 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"; } 
代わりに、すべての画像タイプの比較のこのような3210
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あなたがデータベースの最初のエンティティモデルを使用しています。あなたは部分的なクラスieを使ってその余分なフィールドを追加する必要があります。

public partial class Product      
    { 
     public HttpPostedFileBase File { get; set; } 
    } 
関連する問題