Download file of any type in Asp.Net MVC using FileResult?

后端 未结 9 1690
没有蜡笔的小新
没有蜡笔的小新 2020-11-22 05:05

I\'ve had it suggested to me that I should use FileResult to allow users to download files from my Asp.Net MVC application. But the only examples of this I can find always h

相关标签:
9条回答
  • 2020-11-22 05:13

    its simple just give your physical path in directoryPath with file name

    public FilePathResult GetFileFromDisk(string fileName)
    {
        return File(directoryPath, "multipart/form-data", fileName);
    }
    
    0 讨论(0)
  • 2020-11-22 05:16

    if (string.IsNullOrWhiteSpace(fileName)) return Content("filename not present");

            var path = Path.Combine(your path, your filename);
    
            var stream = new FileStream(path, FileMode.Open);
    
            return File(stream, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
    
    0 讨论(0)
  • 2020-11-22 05:17

    If you're using .NET Framework 4.5 then you use use the MimeMapping.GetMimeMapping(string FileName) to get the MIME-Type for your file. This is how I've used it in my action.

    return File(Path.Combine(@"c:\path", fileFromDB.FileNameOnDisk), MimeMapping.GetMimeMapping(fileFromDB.FileName), fileFromDB.FileName);
    
    0 讨论(0)
  • 2020-11-22 05:19

    You can just specify the generic octet-stream MIME type:

    public FileResult Download()
    {
        byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext");
        string fileName = "myfile.ext";
        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
    }
    
    0 讨论(0)
  • 2020-11-22 05:20

    Phil Haack has a nice article where he created a Custom File Download Action Result class. You only need to specify the virtual path of the file and the name to be saved as.

    I used it once and here's my code.

            [AcceptVerbs(HttpVerbs.Get)]
            public ActionResult Download(int fileID)
            {
                Data.LinqToSql.File file = _fileService.GetByID(fileID);
    
                return new DownloadResult { VirtualPath = GetVirtualPath(file.Path),
                                            FileDownloadName = file.Name };
            }
    

    In my example i was storing the physical path of the files so i used this helper method -that i found somewhere i can't remember- to convert it to a virtual path

            private string GetVirtualPath(string physicalPath)
            {
                string rootpath = Server.MapPath("~/");
    
                physicalPath = physicalPath.Replace(rootpath, "");
                physicalPath = physicalPath.Replace("\\", "/");
    
                return "~/" + physicalPath;
            }
    

    Here's the full class as taken from Phill Haack's article

    public class DownloadResult : ActionResult {
    
        public DownloadResult() {}
    
        public DownloadResult(string virtualPath) {
            this.VirtualPath = virtualPath;
        }
    
        public string VirtualPath {
            get;
            set;
        }
    
        public string FileDownloadName {
            get;
            set;
        }
    
        public override void ExecuteResult(ControllerContext context) {
            if (!String.IsNullOrEmpty(FileDownloadName)) {
                context.HttpContext.Response.AddHeader("content-disposition", 
                "attachment; filename=" + this.FileDownloadName)
            }
    
            string filePath = context.HttpContext.Server.MapPath(this.VirtualPath);
            context.HttpContext.Response.TransmitFile(filePath);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 05:20
       public ActionResult Download()
            {
                var document = //Obtain document from database context
        var cd = new System.Net.Mime.ContentDisposition
        {
            FileName = document.FileName,
            Inline = false,
        };
                Response.AppendHeader("Content-Disposition", cd.ToString());
                return File(document.Data, document.ContentType);
            }
    
    0 讨论(0)
提交回复
热议问题