服务端实现
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文件下载实现
原文地址:https://www.cnblogs.com/badprogrammer/p/9583422.html