简体   繁体   English

ASP.NET MVC 4 C#HttpPostedFileBase,如何存储文件

[英]ASP.NET MVC 4 C# HttpPostedFileBase, How do I Store File

Model 模型

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; }
}}

Controller 控制者

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


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

        return View(assignment);
    }

View 视图

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

How do I store a file if I wanted to store the file into the server/path folder and in the database I only want to store the Path name/string. 如果要将文件存储到服务器/路径文件夹中,并且仅在数据库中存储路径名/字符串,如何存储文件。

you can upload file and save its url in the database table like this: 您可以上传文件并将其网址保存在数据库表中,如下所示:

View: 视图:

@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>
    ...
}

Action: 行动:

[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);
}

Details: 细节:

For better understanding refer this good article Uploading a File (Or Files) With ASP.NET MVC 为了更好地理解,请参考这篇出色的文章,使用ASP.NET MVC上传文件(或多个文件)

Here's how I did it: 这是我的操作方式:

View.cs 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>

I was using HomeController , so you create the Upload function there. 我使用的是HomeController ,所以您在此处创建Upload函数。 I'm also including how you might store the file contents in the database, not just the location, and the code below makes use of the Assignment model that was provided, but I'll also show how I saved it to the database in my case with a model I created for my table, ITEM_ATCHMT . 我还介绍了如何将文件内容存储在数据库中,而不仅仅是位置,下面的代码利用了提供的Assignment模型,但是我还将展示如何将文件保存到数据库中。我为表创建的模型ITEM_ATCHMT

You shouldn't have to pass in a model & pass it back if all you have is a FileUpload control on the page and aren't populating data on the view with it, so this function doesn't do that, and my View doesn't use a model - yours may be different and you may want to keep your model being passed in, returned, if used on your view. 如果您仅有的是页面上的FileUpload控件,并且不必在模型中填充数据,则不必传递模型并将其传递回去,因此此功能不会这样做,而我的View不会这样做不使用模型-您的模型可能会有所不同,并且如果要在视图中使用模型,则可能希望保持传递模型,返回模型。

I set mine up for multiple objects to be posted at one time, so I had a List<ViewDataUploadFilesResult> that received their data and would get iterated through in the process of saving each of the files and their metadata to the database. 我设置了一次同时发布多个对象的方式,所以我有了一个List<ViewDataUploadFilesResult>来接收它们的数据,并在将每个文件及其元数据保存到数据库的过程中进行迭代。 You could use it to simply save one file at a time, though, so I've added the code for that and commented out the parts for the multiple files. 但是,您可以使用它来一次仅保存一个文件,因此我添加了该代码并注释了多个文件的各个部分。 Hopefully it doesn't confuse anyone - just 2 different ways of doing the same thing, in the end. 希望它不会让任何人感到困惑-最终,只有两种不同的方式来做同一件事。

HomeController.cs 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();
    }

Additional Model 附加型号

ViewDataUploadFilesResult.cs 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; }
}

For me, instead of using this whole ViewModel, this is an actual model for my Attachments table: 对我来说,这不是使用整个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; }
} 

And say I wanted to associate it with this item: 并说我想将其与此项目相关联:

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

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

}

To save any data using Entity Framework, you just need to fill that model, then do a .SaveChanges() on your context: 要使用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();

And if ITEM_ID is set up with auto-incrementing: 如果将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();

在此处输入图片说明

  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> } *@ 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM