码迷,mamicode.com
首页 > Web开发 > 详细

web文件下载实现

时间:2018-09-04 13:48:50      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:timeout   stream   ring   position   .text   false   int   request   ret   

 

服务端实现

 public HttpResponseMessage GetFile(string fileName,string folder,long expires=0)
        {
            try
            {
                string filePath = UpdateController.BaseDir + folder + "\\" + fileName;
                if (File.Exists(filePath) == false)
                {
                    ServerLogger.Error("get file failed,cannot find file:"+ filePath);
                    HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.InternalServerError)
                    {
                        Content = new StringContent("get file failed,cannot find file:"+ filePath, System.Text.Encoding.UTF8, "text/plain")
                    };
                    return message;
                }
                var fs =  File.OpenRead(filePath);
                MemoryStream stream = new MemoryStream();
                fs.CopyTo(stream);
                HttpResponseMessage response = new HttpResponseMessage();
                response.Content = new ByteArrayContent(stream.GetBuffer(), 0, (int)stream.Length);
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentDisposition.FileName = fileName;
                stream.Dispose();
                return response;
            }
            catch(Exception ex)
            {
                ServerLogger.Error("Get update file exception,fileName:"+ fileName + ",folder:"+ folder, ex);
                HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent("GetFile failed,exception occured,fileName:"+fileName, System.Text.Encoding.UTF8, "text/plain")
                };
                return message;
            }
        }

 

前端实现

                    var webRequest = (HttpWebRequest)WebRequest.Create(fileUrl);
                    webRequest.Timeout = 1000 * 120; 
                    webRequest.Method = HttpMethod.Get.ToString().ToUpperInvariant();

                    var response = webRequest.GetResponse() as HttpWebResponse;
                    if (response != null && response.StatusCode == HttpStatusCode.OK)//如果成功
                    {
                        string fileinfo = response.Headers["Content-Disposition"];
                        string fileName = fileinfo.Substring(fileinfo.LastIndexOf("filename="));
                        fileName = fileName.Replace("filename=", "");
                        string filePath = folder+ fileName;                   

                        var fs = new FileStream(filePath, FileMode.CreateNew);
                        //var ms = new MemoryStream();//输出的stream
                        WriteTo(response.GetResponseStream(), fs);//写到ms中
                        fs.Seek(0, SeekOrigin.Begin);
                        fs.Close();
                    }


其中WriteTo为:

        void WriteTo(Stream src, Stream dest)
        {
            int bufferSize = 4 * 1024;
            var buffer = new byte[bufferSize];
            int bytesRead;
            while ((bytesRead = src.Read(buffer, 0, buffer.Length)) > 0)
            {
                dest.Write(buffer, 0, bytesRead);
            }
            dest.Flush();
            src.Close();
        }

 

web文件下载实现

标签:timeout   stream   ring   position   .text   false   int   request   ret   

原文地址:https://www.cnblogs.com/badprogrammer/p/9583422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!