Asp.NetMVCファイルのダウンロードの4つの方法とZIPファイルのダウンロードの1つの方法

6020 ワード

前言:
ここ数日、サーバー側からファイルをダウンロードする機能を作り、自分のコードとネット上のコードをまとめました.サービス側でダウンロードすると、一般ブラウザは自動的にダウンロードのパスをデフォルト化し、一般的にはCディスクのダウンロードフォルダに保存されます.クライアントの固定フォルダにダウンロードしたいのですが、この機能は考えていませんので、後で時間があれば見てみましょう.
直接コードを言わないでください.
/// 
        ///    
        /// 
        /// 
        public FileStreamResult Down()
        {
            string fileName = "aaa.xlsx";//         
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//  
            return File(new FileStream(filePath, FileMode.Open), "text/plain",
            fileName);
            //  :“text/plain”   MIME  

        }
/// 
        ///    
        /// 
        /// 
        public FileResult Down1()
        {
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//  
            return File(filePath, "text/plain", "welcome.xlsx"); //welcome.txt         
        }
 /// 
        ///    
        /// 
        public void Down2()
        {
            string fileName = "aaa.xlsx";//         
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//  
            FileInfo fileinfo = new FileInfo(filePath);
            Response.Clear();         //              
            Response.ClearContent();  //              
            Response.ClearHeaders();  //           
            Response.Buffer = true;   //          ,                
            Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            Response.AddHeader("Content-Length", fileinfo.Length.ToString());
            Response.AddHeader("Content-Transfer-Encoding", "binary");
            Response.ContentType = "application/unknow";  //          HTTP MIME   
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); //          HTTP    
            Response.TransmitFile(filePath);
            Response.End();
        }
/// 
        ///    
        /// 
        public void Down3()
        {
            string fileName = "aaa.xlsx";//         
            string filePath = Server.MapPath("~/DownFile/test.xlsx");//  
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
            if (fileInfo.Exists == true)
            {
                const long ChunkSize = 102400;//100K       ,   100K,            
                byte[] buffer = new byte[ChunkSize];
                
               Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;//          
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
                while (dataLengthToRead > 0 && Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//     
                    Response.OutputStream.Write(buffer, 0, lengthRead);
                    Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                Response.Close();
            }
        }
//  Zip  
public void DownLoadZipFile()
        {
            string fileName = Request["fileName"];
            string path = Server.MapPath("/ExportZip/" + fileName + ".zip");
            //     
            long chunkSize = 204800;
            //    200K    
            byte[] buffer = new byte[chunkSize];
            //      
            long dataToRead = 0;

            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "application/octet-stream";
            string encodeFileName = Path.GetFileName(path);
            if (Request.UserAgent.ToLower().IndexOf("msie") > -1)
                encodeFileName = HttpUtility.UrlPathEncode(encodeFileName);
            if (Request.UserAgent.ToLower().IndexOf("firefox") > -1)
                encodeFileName = "\"" + encodeFileName + "\"";
            else
                encodeFileName = HttpUtility.UrlEncode(encodeFileName, System.Text.Encoding.UTF8);
            try
            {
                using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    dataToRead = stream.Length;
                    Response.AddHeader("Content-Disposition", "attachement;filename=" + encodeFileName);
                    Response.AddHeader("Content-Transfer-Encoding", "binary");
                    Response.AddHeader("Content-Length", dataToRead.ToString());
                    while (dataToRead > 0)
                    {
                        if (Response.IsClientConnected)
                        {
                            int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                            Response.OutputStream.Write(buffer, 0, length);
                            Response.Flush();
                            buffer = new Byte[chunkSize];
                            dataToRead = dataToRead - length;
                        }
                        else
                            dataToRead = -1;
                    }
                }
            }
            catch (Exception)
            {
                Response.Write("alert('    ,   ')");
            }
            finally
            {
                //context.Response.Close();
            }
        }

終了:
上のコードはすべて私の実际のテストを経て、完全に机能を実现することができて、みんなは安心して使って、あなた达の需要によってファイル名とファイルの経路を変えるだけでいいです