ASP.NET MVC 4 C# HttpPostedFileBase, How do I Store File
Asked Answered
D

3

11

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.

Dioptric answered 4/8, 2014 at 18:23 Comment(0)
S
24

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

Spellbind answered 4/8, 2014 at 18:34 Comment(12)
Thanks A lot , It helped, still new to C# and MVCDioptric
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. what will caue this erro to happen? this error Happen When I Insert;Dioptric
db.SaveChanges(); <<<<dbEntityValidationException was unhandled by user codeDioptric
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. Source Error:Dioptric
it is most probably some field is which is mandatory is going null in databaseSpellbind
ok thx solved, ya and its there a way to make my ID auto generated before I insert into the database. ID format is A00001 <<Dioptric
you need to get the max ID and increment itSpellbind
at the controller there to get the increment? would you mind show me how should I code it, cuz first time using Visual studio and MVCDioptric
Where is the "Path.GetFileName" coming from? what class does it belong to?Portsalut
for that you need to include namespace for itSpellbind
which is System.IO, so in controller add on top using System.IO;Spellbind
file.ContentLength as assignmentFile.ContentLength right?Bioclimatology
P
2

Here's how I did it:

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

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.

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

    [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

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:

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:

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_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

Porringer answered 18/9, 2018 at 16:38 Comment(0)
P
0

            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>
    
    
    
}
*@
Pursuit answered 1/6, 2019 at 15:57 Comment(1)
Welcome to SO. Code-only answers made address the issue but they are definitely improved if you explain why they do.Frankfrankalmoign

© 2022 - 2024 — McMap. All rights reserved.