web-dev-qa-db-ja.com

ASP.NET MVC 4 C#HttpPostedFileBase、ファイルを保存する方法

モデル

public partial class Assignment
{
    public Assignment()
    {
        this.CourseAvailables = new HashSet<CourseAvailable>();
    }

    public string AssignmentID { get; set; }
    public Nullable<System.DateTime> SubmissionDate { get; set; }
    public string Status { get; set; }
    public Nullable<decimal> Mark { get; set; }
    public string Comments { get; set; }
    public string FileLocation  { get; set; }
    public virtual ICollection<CourseAvailable> CourseAvailables { get; set; }
}}

コントローラ

 public ActionResult Create(Assignment assignment)
    {
        if (ModelState.IsValid)
        {


            db.Assignments.Add(assignment);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(assignment);
    }

ビュー

<div class="editor-field">
    <%: Html.TextBoxFor(model => model.FileLocation, new { type="file"})%>
    <%: Html.ValidationMessageFor(model => model.FileLocation) %>
</div>

ファイルをサーバー/パスフォルダーに保存し、データベースにパス名/文字列のみを保存したい場合、どのようにファイルを保存しますか?.

8
WeakTaenie

次のようにファイルをアップロードして、そのURLをデータベーステーブルに保存できます。

見る:

@using(Html.BeginForm("Create","Assignment",FormMethod.Post,new {enctype="multipart/form-data"}))
{
    ...
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.FileLocation, new { type="file"})%>
        <%: Html.ValidationMessageFor(model => model.FileLocation) %>
    </div>
    ...
}

アクション:

[HttpPost]
public ActionResult Create(Assignment assignment)
{
    if (ModelState.IsValid)
    {
        if(Request.Files.Count > 0)
        {
            HttpPostedFileBase file = Request.Files[0];
            if (file.ContentLength > 0) 
            {
                var fileName = Path.GetFileName(file.FileName);
                assignment.FileLocation = Path.Combine(
                    Server.MapPath("~/App_Data/uploads"), fileName);
                file.SaveAs(assignment.FileLocation);
            }
            db.Assignments.Add(assignment);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }

    return View(assignment);
}

詳細:

よりよく理解するには、 この優れた記事ASP.NET MVCを使用したファイル(またはファイル)のアップロード を参照してください

19
Ehsan Sajjad
            List<Vozila> svaVozila = new List<Vozila>();
            using (StreamReader sr = new StreamReader(@"C:\proba\MvcApplication1\MvcApplication1\fajlovi\vozila.txt"))
            {
                while (sr.Peek() >= 0)
                {
                    string str;
                    string[] strArray;
                    str = sr.ReadLine();

                    strArray = str.Split('|');
                    Vozila auto = new Vozila();
                    auto.Registracija = strArray[0];
                    auto.Marka = strArray[1];
                    auto.GodinaProiz = strArray[2];
                    auto.Boja = strArray[3];

                    svaVozila.Add(auto);





                }
            }
            string registracija = Request.Form["registracija"];
            string datum = Request.Form["Datum"];
            string odM = Request["odMesta"];
            string doM = Request.Form["doMesta"];
            string kilometara = Request.Form["kilometara"];
            if (!String.IsNullOrEmpty(registracija))
            {
                using (StreamWriter wr = new StreamWriter(@"C:\proba\MvcApplication1\MvcApplication1\fajlovi\" + registracija + ".txt", true))
                {
                    wr.WriteLine(registracija + "|" + datum + "|" + odM + "|" + doM + "|" + kilometara);

                }
            }


            return View(svaVozila);
        }
        public ActionResult Prikaz()
        {

            List<Vozila> svaVozila = new List<Vozila>();
            using (StreamReader sr = new StreamReader(@"C:\proba\MvcApplication1\MvcApplication1\fajlovi\vozila.txt"))
            {
                while (sr.Peek() >= 0)
                {
                    string str;
                    string[] strArray;
                    str = sr.ReadLine();

                    strArray = str.Split('|');
                    Vozila auto = new Vozila();
                    auto.Registracija = strArray[0];
                    auto.Marka = strArray[1];
                    auto.GodinaProiz = strArray[2];
                    auto.Boja = strArray[3];

                    svaVozila.Add(auto);





                }
            }
            string reg = Request["reg"];
            string Marka = "";
            string godia = "";
            int kilometri = 0;
            for (int i = 0; i < svaVozila.Count; i++)
            {
                if (svaVozila[i].Registracija == reg)
                {
                    Marka = svaVozila[i].Marka;
                    godia = svaVozila[i].GodinaProiz;

                }

            }
            if (!String.IsNullOrEmpty(reg))
            {
                List<PredjeniPut> predj = new List<PredjeniPut>();
                using (StreamReader sr = new StreamReader(@"C:\proba\MvcApplication1\MvcApplication1\fajlovi\" + reg + ".txt"))
                {
                    while (sr.Peek() >= 0)
                    {
                        string str;
                        string[] strArray;
                        str = sr.ReadLine();

                        strArray = str.Split('|');
                        PredjeniPut put = new PredjeniPut();
                        put.Registracija = strArray[0];
                        put.Datum = strArray[1];
                        put.Odmesta = strArray[2];
                        put.Domesta = strArray[3];
                        put.Kilometara = Convert.ToInt32(strArray[4]);

                        predj.Add(put);





                    }



                }

                for (int i = 0; i < predj.Count; i++)
                {
                    kilometri += predj[i].Kilometara;

                }
            }
            ViewData["Kilometri"] = kilometri;
            ViewData["reg"] = reg;
            ViewData["Marka"] = Marka;
            ViewData["godina"] = godia;









            return View(svaVozila);
        }

    }
}
@*@model List<MvcApplication1.Models.Vozila>
@{
    
    ViewBag.Title = "Index";
    
    
}


<h2>Index</h2>
@using (Html.BeginForm("index,home"))
{
   
<select id="Select1" name="registracija">
    @foreach (var i in Model)
    {
  <option value="@i.Registracija">@i.Registracija</option>
        
    }
    </select>
    
    <br />   
    <label>Datum</label><input id="Text1" type="text"name ="datum" /> <br />
        <label>Od mesta</label><input id="Text1" type="text"name="odMesta" /><br />
       <label>Do mesta</label> <input id="Text1" type="text"name="doMesta" /><br />
       <label>Kilometara</label> <input id="Text1" type="text"name="kilometara" /><br />
 


<input id="Submit1" type="submit" value="Prosledi" />
}
  @Html.ActionLink("Prikaz","Prikaz","home");*@
@*@model List<MvcApplication1.Models.Vozila>
@{
    ViewBag.Title = "Prikaz";
}


<h2>Prikaz</h2>
@using (Html.BeginForm("Prikaz,home"))
{
<select id="Select1" name="reg">
    @foreach (var i in Model)
    {
  <option value="@i.Registracija">@i.Registracija</option>
        
    }
    </select>
<input id="Submit1" type="submit" value="Prikazi" />



    <table border="1">
        <tr>
            <th>Registracija</th>
            <th>GodinaProizvodnje</th>
            <th>Marka</th>
            <th>Kilometri</th>
            

        </tr>
        <tr>
            <td>@ViewData["reg"]</td>
            <td>@ViewData["Godina"]</td>
            <td>@ViewData["Marka"]</td>
            <td>@ViewData["Kilometri"]</td>


        </tr>


    </table>
    
    
    
}
*@
0
Marko

ここに私がそれをした方法があります:

View.cs

_<div class="row">

    @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <input type="file" name="FileUpload" id="FileUpload" runat="server" />
        <input type="submit" value="Save" class="btn btn-default" />
    }

</div>
_

私はHomeControllerを使用していたので、そこにUpload関数を作成しました。場所だけでなく、ファイルの内容をデータベースに保存する方法も含めています。以下のコードは、提供されたAssignmentモデルを使用していますが、保存方法も示します私の場合、テーブル用に作成したモデル_ITEM_ATCHMT_を使用してデータベースに追加します。

ページ上のFileUploadコントロールのみがあり、ビューにデータを入力していない場合は、モデルを渡してモデルに戻す必要はないので、この関数はそれを行わず、私のビューはモデルを使用しない-モデルが異なる場合があり、ビューで使用されている場合は、モデルが渡されて返されるようにすることができます。

一度に複数のオブジェクトをポストするように設定したので、_List<ViewDataUploadFilesResult>_がデータを受信し、各ファイルとそのメタデータをデータベースに保存するプロセスで繰り返し処理されました。ただし、一度に1つのファイルを保存するだけでも使用できるため、そのためのコードを追加し、複数のファイルの部分をコメント化しました。うまくいけば、誰も混乱させない-結局、同じことをするための2つの異なる方法。

HomeController.cs

_    [HttpPost]
    public ActionResult Upload()
    {
        //var r = new List<ViewDataUploadFilesResult>();
        var r = new ViewDataUploadFilesResult();
        Assignment a = new Assignment();

        if (ModelState.IsValid)
        {
            if (Request.Files.Count > 0)
            {
                HttpPostedFileBase file = Request.Files[0];
                if (file.ContentLength > 0)
                {
                    int fileSize = file.ContentLength;
                    var fileName = Path.GetFileName(file.FileName);

                    //You could do this to get the content -
                    //it would need a varbinary(max) field 
                    //Stream posted file into a byte array
                    byte[] fileByteArray = new byte[fileSize];
                    file.InputStream.Read(fileByteArray, 0, fileSize);

                    //Uploading properly formatted file to server.
                    string fileLocation = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    if (!Directory.Exists(Server.MapPath("~/App_Data/uploads")))
                        Directory.CreateDirectory(Server.MapPath("~/App_Data/uploads"));
                    file.SaveAs(fileLocation);

                    // I used a ViewModel to collect my file information
                    ViewDataUploadFilesResult r = new ViewDataUploadFilesResult();
                    r.Name = fileName;
                    r.FilePath = fileLocation;
                    r.Length = fileSize;
                    r.FileObj = file;
                    r.Content = fileByteArray;

                    // I provided a list so I could upload multiple files
                    // at once, but you might've just had the one item, above
                    //r.Add(new ViewDataUploadFilesResult()
                    //{
                    //    Name = fileName,
                    //    FilePath = fileLocation,
                    //    Length = fileSize,
                    //    FileObj = file,
                    //    Content = fileByteArray
                    //});

                    // Below is for singular ViewDataUploadFilesResult objects (uncomment the loop for multiple)
                    //for (int i = 0; i < r.Count; i++)
                    //{
                        //assignment.FileLocation = r[i].FilePath; //multiple objects need an index, [i]
                        assignment.FileLocation = r.FilePath;  //singular objects don't
                        assignment.Status = "Uploaded";
                        assignment.Comments = "Completed";
                    //}

                    // You also could've just not used ViewDataUploadFilesResult 
                    // at all, and just used assignment, only
                    // and just added fileSize, fileContents, etc. to it

                    EFModel db = new EFModel();  // this is your Entity Framework context
                    db.Assignments.Add(assignment);  //"Assignments" would be your table
                    db.SaveChanges();

                }

                return RedirectToAction("Index");
                //return View("Index", r);
            }
        }

        return View();
    }
_

追加モデル

ViewDataUploadFilesResult.cs

_public class ViewDataUploadFilesResult
{
    public string Name { get; set; }
    public string FilePath { get; set; }
    public int Length { get; set; }
    public HttpPostedFileBase FileObj { get; set; }
    public byte[] Content { get; set; }
}
_

私にとって、このViewModel全体を使用する代わりに、これはAttachmentsテーブルの実際のモデルです。

_public partial class ITEM_ATCHMT
{
    [Key]
    public Guid ATCHMT_ID { get; set; }

    public int ITEM_ID { get; set; }

    [ForeignKey("ITEM_ID")]
    public virtual ITEM item { get; set; }

    [Required]
    [StringLength(50)]
    public string USER_NAME_DESC { get; set; }

    [Required]
    [StringLength(250)]
    public string FILE_NAME_TXT { get; set; }

    [Required]
    public byte[] FILE_CNTNT_CD { get; set; }

    [Required]
    [StringLength(10)]
    public string FILE_TYPE_DESC { get; set; }

    public DateTime CREATED_DT { get; set; }
} 
_

そして、私はそれをこのアイテムに関連付けたかったと言います:

_public partial class ITEM
{
    [Key]
    public int ITEM_ID { get; set; }

    [Required]
    [StringLength(50)]
    public string NAME { get; set; }

}
_

Entity Frameworkを使用してデータを保存するには、そのモデルに入力して、コンテキストで.SaveChanges()を実行するだけです。

_EFModel db = new EFModel();  // this is my Entity Framework context
ITEM item = new ITEM();
item.NAME = "My Item";

db.ITEM.Add(item);  //"ITEM" is my table and name of an EF model, "item" is the object that represents my model
db.SaveChanges();
_

そして、_ITEM_ID_が自動インクリメントで設定されている場合:

_ITEM_ATCHMT atchmt_model = new ITEM_ATCHMT();
atchmt_model.ATCHMT_ID = Guid.NewGuid();
atchmt_model.ITEM_ID = item.ITEM_ID // <-- this should have the ID
atchmt_model.USER_NAME_DESC = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
atchmt_model.FILE_CNTNT_CD = r.Content;
atchmt_model.FILE_NAME_TXT = r.Name;
atchmt_model.FILE_TYPE_DESC = r.Name.Split('.')[1];
atchmt_model.CREATED_DT = DateTime.Now;

db.ITEM_ATCHMT.Add(atchmt_model);  //"ITEM_ATCHMT" is my table
db.SaveChanges();
_

enter image description here

0
vapcguy