通过接口下载文件(服务器和客户端) 客户端: /// <summary> /// 下载文件 /// </summary> /// <param name="URL">下载文件地址</param> /// <param name="Filename">下载后的文件目录(全路径)</param> private string DownloadFile(string URL, string filename) { try { string fName = "site" + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".zip"; System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); System.IO.Stream st = myrp.GetResponseStream(); System.IO.Stream so = new System.IO.FileStream(filename + "\" + fName, System.IO.FileMode.Create); byte[] by = new byte[1024]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { so.Write(by, 0, osize); osize = st.Read(by, 0, (int)by.Length); } so.Close(); st.Close(); myrp.Close(); Myrq.Abort(); return fName; } catch (Exception ex) { MessageBox.Show("下载错误!" + ex.Message); return null; } } 服务器端: using FundMgmt.SH.WebApi.Providers; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Web.Http; public class FileDownloadController : BaseApi { /// <summary> /// 下载网站发布文件 /// </summary> /// <returns></returns> [HttpGet] [Route("g")] public HttpResponseMessage DownFiles() { FileProvider = new FileProvider("SiteDownloadDir"); System.IO.FileInfo []fis=FileProvider.FindFile(); if (fis != null) { string fileName = fis[0].Name; long fileLength = FileProvider.GetLength(fileName); var fileInfo = GetFileInfoFromRequest(this.Request, fileLength); //获取剩余部分文件流 var stream = new PartialContentFileStream(FileProvider.Open(fileName), fileInfo.From, fileInfo.To); var response = new HttpResponseMessage(); response.Content = new StreamContent(stream, BufferSize); SetResponseHeaders(response, fileInfo, fileLength, fileName); return response; } else { throw new HttpResponseException(HttpStatusCode.NotFound); } } } 以下为服务器上的文件帮助类 : using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Web; using System.Web.Hosting; namespace FundMgmt.SH.WebApi.Providers { /// <summary> /// 文件操作 /// </summary> public class FileProvider { private readonly string _filesDirectory; private const string AppSettingsKey = "SiteDownloadDir"; public FileProvider() { } /// <summary> /// 获取文件的物理路径,在接口文件夹 /// </summary> /// <param name="dir"></param> public FileProvider(string dir) { var fileLocation = ConfigurationManager.AppSettings[dir]; if (!String.IsNullOrWhiteSpace(fileLocation)) { _filesDirectory = HostingEnvironment.MapPath(fileLocation); } } /// <summary> /// 判断文件是否存在 /// </summary> /// <param name="name"></param> /// <returns></returns> public bool Exists(string name) { string file = Directory.GetFiles(_filesDirectory, name, SearchOption.TopDirectoryOnly) .FirstOrDefault(); return true; } /// <summary> /// 获取文件夹里的文件 /// </summary> /// <returns></returns> public FileInfo[] FindFile() { DirectoryInfo di=new DirectoryInfo(_filesDirectory); FileInfo[] fis = di.GetFiles(); return fis; } /// <summary> /// 打开文件 /// </summary> /// <param name="name"></param> /// <returns></returns> public FileStream Open(string name) { var fullFilePath = Path.Combine(_filesDirectory, name); return File.Open(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); } /// <summary> /// 获取文件长度 /// </summary> /// <param name="name"></param> /// <returns></returns> public long GetLength(string name) { var fullFilePath = Path.Combine(_filesDirectory, name); return new System.IO.FileInfo(fullFilePath).Length; } ///<summary> /// 清空指定的文件夹,但不删除文件夹 /// </summary> /// <param name="dir"></param> public void DeleteFolder(string dir) { foreach (string d in Directory.GetFileSystemEntries(dir)) { if (File.Exists(d)) { FileInfo fi = new FileInfo(d); if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1) fi.Attributes = FileAttributes.Normal; File.Delete(d);//直接删除其中的文件 } else { DirectoryInfo d1 = new DirectoryInfo(d); if (d1.GetFiles().Length != 0) { DeleteFolder(d1.FullName);////递归删除子文件夹 } Directory.Delete(d); } } } /// <summary> /// 删除文件夹及其内容 /// </summary> /// <param name="dir"></param> public void DeleteFolder1(string dir) { foreach (string d in Directory.GetFileSystemEntries(dir)) { if (File.Exists(d)) { FileInfo fi = new FileInfo(d); if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1) fi.Attributes = FileAttributes.Normal; File.Delete(d);//直接删除其中的文件 } else DeleteFolder(d);////递归删除子文件夹 Directory.Delete(d); } } /// <summary> /// 清空文件夹 /// </summary> /// <param name="dir"></param> public void ClearFolder() { foreach (string d in Directory.GetFileSystemEntries(_filesDirectory)) { if (File.Exists(d)) { FileInfo fi = new FileInfo(d); if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1) fi.Attributes = FileAttributes.Normal; File.Delete(d);//直接删除其中的文件 } } } } } /// <summary> /// 根据请求信息赋予封装的文件信息类 /// </summary> /// <param name="request"></param> /// <param name="entityLength"></param> /// <returns></returns> private FileInfo GetFileInfoFromRequest(HttpRequestMessage request, long entityLength) { var fileInfo = new FileInfo { From = 0, To = entityLength - 1, IsPartial = false, Length = entityLength }; var rangeHeader = request.Headers.Range; if (rangeHeader != null && rangeHeader.Ranges.Count != 0) { if (rangeHeader.Ranges.Count > 1) { throw new HttpResponseException(HttpStatusCode.RequestedRangeNotSatisfiable); } RangeItemHeaderValue range = rangeHeader.Ranges.First(); if (range.From.HasValue && range.From < 0 || range.To.HasValue && range.To > entityLength - 1) { throw new HttpResponseException(HttpStatusCode.RequestedRangeNotSatisfiable); } fileInfo.From = range.From ?? 0; fileInfo.To = range.To ?? entityLength - 1; fileInfo.IsPartial = true; fileInfo.Length = entityLength; if (range.From.HasValue && range.To.HasValue) { fileInfo.Length = range.To.Value - range.From.Value + 1; } else if (range.From.HasValue) { fileInfo.Length = entityLength - range.From.Value + 1; } else if (range.To.HasValue) { fileInfo.Length = range.To.Value + 1; } } return fileInfo; } /// <summary> /// 设置响应头信息 /// </summary> /// <param name="response"></param> /// <param name="fileInfo"></param> /// <param name="fileLength"></param> /// <param name="fileName"></param> private void SetResponseHeaders(HttpResponseMessage response, FileInfo fileInfo, long fileLength, string fileName) { response.Headers.AcceptRanges.Add("bytes"); response.StatusCode = fileInfo.IsPartial ? HttpStatusCode.PartialContent : HttpStatusCode.OK; response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); response.Content.Headers.ContentDisposition.FileName = fileName; response.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeType); response.Content.Headers.ContentLength = fileInfo.Length; if (fileInfo.IsPartial) { response.Content.Headers.ContentRange = new ContentRangeHeaderValue(fileInfo.From, fileInfo.To, fileLength); } } //下载的文件信息 public class FileInfo { public long From; public long To; public bool IsPartial; public long Length; } 在config中配置文件的文件的路径 add key="SiteDownloadDir" value="~/Files/Site" / add key="SqlDownloadDir" value="~/Files/Sql" /