[ASP.NET]How to implement file upload and download in ASP.NET MVC


[ASP.NET]How to implement file upload and download in ASP.NET MVC


 


File upload/download is very useful functionality in web application. Here is a simple implementation of file upload/download in ASP.NET MVC 1.0. The sample use a “FileManager” controller to handle file download and file upload requests. And for download, I created a custom ActionResult class to stream out the binary file content.


 


FileManager Controller






namespace MVCFileWeb.Controllers


{


    /// <summary>


    /// MVC Controller class for file upload and download


    /// </summary>


    public class FileManagerController : Controller


    {


        /// <summary>


        /// default Action


        /// </summary>


        public ActionResult Index()


        {


            var files = from f in System.IO.Directory.GetFiles(


                                   Server.MapPath(“~/App_Data/download/”),


                                   “*.*”,


                                   SearchOption.TopDirectoryOnly)


                             select System.IO.Path.GetFileName(f);


 


            return View(files.ToList());


        }


 


        /// <summary>


        /// action for file download


        /// </summary>


        public ActionResult Download(string fn)


        {


            string pfn = Server.MapPath(“~/App_Data/download/” + fn);


            if (!System.IO.File.Exists(pfn))


            {


                throw new ArgumentException(“Invalid file name or file not exists!”);


            }


 


            return new BinaryContentResult(){


                         FileName = fn,


                        ContentType=“application/octet-stream”,


                      Content=  System.IO.File.ReadAllBytes(pfn)


            };


                           


        }


 


        /// <summary>


        /// Action for file upload


        /// </summary>


        [AcceptVerbs(HttpVerbs.Post)]


        public ActionResult Upload()


        {


            string upload_dir = Server.MapPath(“~/app_data/upload/”);


 


         


            foreach (string f in Request.Files.Keys)


            {


                if (Request.Files[f].ContentLength > 0)


                    Request.Files[f].SaveAs(upload_dir + System.IO.Path.GetFileName(Request.Files[f].FileName));


            }


 


            return RedirectToRoute(new { Action = “Index”, Controller = “FileManager” });


        }


    }


}


 


 


Custom ActionResult for file download(as binary stream):






namespace MVCFileWeb


{


    public class BinaryContentResult: ActionResult


    {


            public BinaryContentResult()


            {}


 


            public string ContentType { get; set; }


            public string FileName { get; set; }


            public byte[] Content { get; set; }


 


            public override void ExecuteResult(ControllerContext context)


            {


              


                context.HttpContext.Response.ClearContent();


                context.HttpContext.Response.ContentType = ContentType;


                  


                context.HttpContext.Response.AddHeader(“content-disposition”,


                


                “attachment; filename=” + FileName);


 


                context.HttpContext.Response.BinaryWrite(Content);


                context.HttpContext.Response.End();


            }


    }


}


 


Index view of FileManager Controller:






<%@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage<List<String>>” %>


 


<asp:Content ID=”Content1″ ContentPlaceHolderID=”TitleContent” runat=”server”>


       Index


</asp:Content>


 


<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>


 


    <h2>Files for download</h2>


 


    <%foreach (string file in Model)


      {%>


    <br /><%= Html.ActionLink(file,“Download”,new {Action=“Download”, fn=file})  %>


   


    <%} %>


<hr />


    <h2>Upload new file</h2>


   


    <% using (Html.BeginForm(“Upload”, “FileManager”, FormMethod.Post, new { enctype = “multipart/form-data” }))


       {%>


       <br />File1:<input type=”file” name=”file1″ id=”file1″ />


       <br />File2:<input type=”file” name=”file2″ id=”file2″ />


   


       <br /><input type=”submit” value=”submit” />


    <% } %>


</asp:Content>


 


 


You can also get the complete solution in attachment.


 

MVCFileWeb.zip

Comments (7)

  1. Upload e download di file con ASP .NET MVC

  2. In questo post viene mostrato come realizzare un controller per ASP .NET MVC in grado di gestire l&#39;upload

  3. Tdar says:

    Using Vs 2010, and convert application , everything is fine. but you cannot upload a file 🙁

  4. Kevin says:

    Tdar, make sure that if you are using Master Pages that you set the enctype in the master form tag.

  5. Gera says:

    Kevin, what do you mean? Pls elaborate

  6. Sheen says:

    Hi Steven,

    I need some help on how to view the uploaded file to the data grid. Let us say, we uploaded an excel file containing columns lastname, firstname, middlename and birthdate.

    Thanks.

Skip to main content