2016-08-27 8 views
3

誰かが私に助けてくれたらと思います。私はビュー内のフォームで入力ファイルコントロールを持っています。誰かが画像を選択してフォーム上の[送信]ボタンをクリックすると、そのファイルはアプリケーション内の/ Picturesフォルダに保存され、ファイルパスはSQLデータベースに保存する必要があります。文字列(例:/ Pictures/filename)。ASP.NET MVC - 画像をアップロードしてURLをデータベースに保存する方法

モデルクラスの一部:

[Table("Automobil")] 
public partial class Automobil 
{ ..... 
    [Required] 
    [StringLength(30)] 
    public string Fotografija{ get; set; } 
    ...... 

ビュー(作成)ファイルの一部:

@using (Html.BeginForm("Create", "Automobili", FormMethod.Post, new { enctype = "multipart/form-data" })) 

.... 
<div class="form-group"> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.Fotografija, new { type = "file" }) 
       @Html.ValidationMessageFor(model => model.Fotografija, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
.... 

コントローラー部分:私は写真を行う必要があり何

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "AutomobilID,Marka,Model,Godiste,Zapremina_motora,Snaga,Gorivo,Karoserija,Fotografija,Opis,Cena,Kontakt")] Automobil automobil) 
    { 
     if (ModelState.IsValid) 
     { 
       db.Automobils.Add(automobil); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
     } 

     return View(automobil); 
    } 

(Fotografija )はアプリケーションフォルダのPicturesやSQLベースのファイルパス(/ Pictures/filenameなど)に保存できますか?

初心者を助けてくれてありがとうございます。

+1

データベースに絶対パスを入れないでください。ファイル名を入力してください。この方法では、格納先のフォルダの名前を変更したり名前を変更したりする必要はありません。コードを一箇所で変更するだけです(コードを正しく構成していると仮定します)。 –

+0

上記のコードを使用すると、画像に30文字までの妥当性検査エラーを取得します。また、アプリケーション自体に画像自体は保存されません。 – Oggie

+0

'[StringLength(30)]'を削除してください – Oluwafemi

答えて

1

Fotografijaのように見えます。プロパティは、一意のファイル名を保存する文字列型です。このフィールドを使用してブラウザからファイルを取得する必要はありません。そのために別の入力フィールドを使用しましょう。今

@using (Html.BeginForm("Index", "Home", FormMethod.Post, 
                new { enctype = "multipart/form-data" })) 
{ 
    <div class="form-group"> 
     <div class="editor-field"> 
      @Html.TextBoxFor(model => model.Model) 
      @Html.ValidationMessageFor(model => model.Model) 
     </div> 
    </div> 
    <!-- TO DO : Add other form fields also --> 

    <div class="form-group"> 
     <div class="editor-field"> 
      <input type="file" name="productImg" /> 
     </div> 
    </div> 
    <input type="submit" /> 
} 

タイプHttpPostedFileBaseの1つの以上のパラメータを持っているあなたのHttpPostアクションメソッドを更新します。このパラメータの名前は、私たちが追加入力ファイルのフィールド名(productImg)

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "AutomobilID,Marka,Model,Godiste, 
      Zapremina_motora,Snaga,Gorivo,Karoserija,Opis,Cena,Kontakt")] Automobil automobil, 
              HttpPostedFileBase productImg) 
{ 
    if (ModelState.IsValid) 
    { 
     if(productImg!=null) 
     { 
      var fileName = Path.GetFileName(productImg.FileName); 
      var directoryToSave = Server.MapPath(Url.Content("~/Pictures")); 

      var pathToSave = Path.Combine(directoryToSave, fileName); 
      productImg.SaveAs(pathToSave); 
      automobil.Fotografija= fileName; 
     } 

     db.Automobils.Add(automobil); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(automobil); 
} 

と同じにする必要がありますが、任意の検証データ注釈装飾(例:[Required][MinLength]など)を除去する必要がありFotografijaフィールド上に。

保存する前に、fileNameを更新して、既存のファイルの衝突/上書きを避けるためにユニークなものにすることを強くお勧めします。あなたはそれが私がコントローラを持っている

+0

私を助けるために時間をとってくれてありがとうございました。私はそれを高く評価します。それは今働く。もう少し時間があるなら、Fotografijaプロパティのアノテーションなしで今何をすべきか教えてくれますか?代わりにproductImgの制限を設ける必要があります(どこに置くか)。どうもありがとう。 – Oggie

+0

'MaxLength'を保持してテーブルの列の長さを制御することができます。プロパティは、ファイル名の格納にのみ使用されます。 – Shyju

+0

もう一度ありがとうございます。良い日を。 – Oggie

0

コードは基本的なもので一意にするために(拡張子の前に)ファイル名に日時現在の値を追加することができます互換性があるようにそれを変更する方法

// GET: Automobili/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Automobil automobil = db.Automobils.Find(id); 
     if (automobil == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(automobil); 
    } 

    // POST: Automobili/Edit/5 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "AutomobilID,Marka,Model,Godiste,Zapremina_motora,Snaga,Gorivo,Karoserija,Fotografija,Opis,Cena,Kontakt")] Automobil automobil) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(automobil).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(automobil); 
    } 

上記のコードを作成しますか?

ありがとうございます。

関連する問題