MVC4での画像のアップロード/表示


83

Entity Frameworkを使用してデータベースから画像をアップロード/表示する方法に関するステップバイステップのチュートリアルを知っている人はいますか?コードスニペットをチェックアウトしましたが、それがどのように機能するかはまだわかりません。アップロードフォームを書く以外に迷子になっているので、コードはありません。どんな(そして私はどんな)助けも大歓迎です。

ちなみに、このトピックを扱っている本がないのはなぜですか?私はProASP.NET MVC4とProfessionalMVC4の両方を持っていますが、彼らはそれについて言及していません。


6
あなたが従うならばPro ASP MVC 4SportsStore Tutorialこれをカバーしますpage 292
Komengem 2013

あなたが正しい。気づかなかった。その章を探していました。ありがとう
rogerthat 2013

2
これがMVC4用であることはわかっていますが、MVC 5を探しているときに、この質問が引き続き表示されます。-MikesDotNettingmikesdotnettingでEF6を使用して、データベースへのアップロードとMvc5のファイルサーバーへのアップロードの両方をカバーするすばらしいチュートリアルを見つけました。 com / article / 259 /…
Vahx 2016

この本の章では、データベースへの画像のアップロードについて説明しています。ほとんどの人は、データベースへのパスと画像をフォルダに保存したいと考えています。
2016年

回答:


142

以下をご覧ください

@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, 
                            new { enctype = "multipart/form-data" }))
{  
    <label for="file">Upload Image:</label> 
    <input type="file" name="file" id="file" style="width: 100%;" /> 
    <input type="submit" value="Upload" class="submit" /> 
}

コントローラには、受け入れるアクションメソッドが必要HttpPostedFileBaseです。

 public ActionResult FileUpload(HttpPostedFileBase file)
    {
        if (file != null)
        {
            string pic = System.IO.Path.GetFileName(file.FileName);
            string path = System.IO.Path.Combine(
                                   Server.MapPath("~/images/profile"), pic); 
            // file is uploaded
            file.SaveAs(path);

            // save the image path path to the database or you can send image 
            // directly to database
            // in-case if you want to store byte[] ie. for DB
            using (MemoryStream ms = new MemoryStream()) 
            {
                 file.InputStream.CopyTo(ms);
                 byte[] array = ms.GetBuffer();
            }

        }
        // after successfully uploading redirect the user
        return RedirectToAction("actionname", "controller name");
    }

アップデート1

jQueryを非同期で使用してファイルをアップロードする場合は、この記事を試してください

サーバー側(複数アップロードの場合)を処理するコードは次のとおりです。

 try
    {
        HttpFileCollection hfc = HttpContext.Current.Request.Files;
        string path = "/content/files/contact/";

        for (int i = 0; i < hfc.Count; i++)
        {
            HttpPostedFile hpf = hfc[i];
            if (hpf.ContentLength > 0)
            {
                string fileName = "";
                if (Request.Browser.Browser == "IE")
                {
                    fileName = Path.GetFileName(hpf.FileName);
                }
                else
                {
                    fileName = hpf.FileName;
                }
                string fullPathWithFileName = path + fileName;
                hpf.SaveAs(Server.MapPath(fullPathWithFileName));
            }
        }

    }
    catch (Exception ex)
    {
        throw ex;
    }

このコントロールは、(javascriptコールバックで)画像名も返します。これを使用して、DOMに画像を表示できます。

更新2

または、MVC4で非同期ファイルアップロードを試すこともできます。


ワオ。ありがとう。やってみます。あなたが考えることができる、この主題に関する私の知識をさらに深めるために読むことができるリソースはありますか?何も見つかりません。
rogerthat 2013

1
実行した後file.SaveAs(path)、そのパスからファイルを削除するにはどうすればよいですか?
J86 2015年

サーバ側にhtmlファイルの種類の画像を送信するためにangularjsを使用することで、より簡単ですstackoverflow.com/a/26409100/900284
フランクMyat木

@FrankMyatThuは画像のアップロードにのみAngularを使用していますか?それは少し奇妙に聞こえませんか?
Idrees Khan 2016

1
現時点では、いくつかのではなく、重要な情報が暴露する上で詳細なエラーログが...そこだと私はできるだけ早くあなたのウェブサイトをチェックアウトしたい@DotNetDreamer
ガレス

46

これが短いチュートリアルです:

モデル:

namespace ImageUploadApp.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Image
    {
        public int ID { get; set; }
        public string ImagePath { get; set; }
    }
}

見る:

  1. 作成:

    @model ImageUploadApp.Models.Image
    @{
        ViewBag.Title = "Create";
    }
    <h2>Create</h2>
    @using (Html.BeginForm("Create", "Image", null, FormMethod.Post, 
                                  new { enctype = "multipart/form-data" })) {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Image</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.ImagePath)
            </div>
            <div class="editor-field">
                <input id="ImagePath" title="Upload a product image" 
                                      type="file" name="file" />
            </div>
            <p><input type="submit" value="Create" /></p>
        </fieldset>
    }
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
    
  2. インデックス(表示用):

    @model IEnumerable<ImageUploadApp.Models.Image>
    
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.ImagePath)
            </th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.ImagePath)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Ajax.ActionLink("Delete", "Delete", new {id = item.ID} })
            </td>
        </tr>
    }
    
    </table>
    
  3. コントローラ(作成)

    public ActionResult Create(Image img, HttpPostedFileBase file)
    {
        if (ModelState.IsValid)
        {
            if (file != null)
            {
                file.SaveAs(HttpContext.Server.MapPath("~/Images/") 
                                                      + file.FileName);
                img.ImagePath = file.FileName;
            }  
            db.Image.Add(img);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(img);
    }
    

これがお役に立てば幸いです:)


うわー、どうもありがとうございました。画像をjpegに制限したい場合はどうすればよいですか?
カラJ

@KalaJアップロードされる画像をjpgのみに制限する場合は、accept属性を追加できます(Html5はChromeでのみ機能し、FFはIEでは機能しません)。または、filename.LastIndexOf(".")そのようなコントローラーで拡張機能を確認することもできます。これがお役に立て
ば幸いです

@ JordyvanEijk、accept属性を使用しましたが、Chromeでのみ機能します。FFやIEでは動作しません。他の形式の検証が必要です。
カラJ

1
@KalaJ Majbe Html5ファイルApiで何かを行うことができますチュートリアルが必要な場合ここにあります
Jordy van Eijk 2013年

2
ハッカーは、サーバー側の検証なしで悪意のあるファイルをアップロードする可能性があります。
arao6 2014

-16
        <input type="file" id="picfile" name="picf" />
       <input type="text" id="txtName" style="width: 144px;" />
 $("#btncatsave").click(function () {
var Name = $("#txtName").val();
var formData = new FormData();
var totalFiles = document.getElementById("picfile").files.length;

                    var file = document.getElementById("picfile").files[0];
                    formData.append("FileUpload", file);
                    formData.append("Name", Name);

$.ajax({
                    type: "POST",
                    url: '/Category_Subcategory/Save_Category',
                    data: formData,
                    dataType: 'json',
                    contentType: false,
                    processData: false,
                    success: function (msg) {

                                 alert(msg);

                    },
                    error: function (error) {
                        alert("errror");
                    }
                });

});

 [HttpPost]
    public ActionResult Save_Category()
    {
      string Name=Request.Form[1]; 
      if (Request.Files.Count > 0)
        {
            HttpPostedFileBase file = Request.Files[0];
         }


    }

では、「msg」を画像としてimgにどのように表示しますか?
eaglei22 2017年

この回答を削除して、レピュテーションポイントを取り戻す必要があります。
noobprogrammer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.