文件下载(服务器和客户端)

通过接口下载文件(服务器和客户端)

客户端:

/// <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" /

  

posted @ 2020-04-03 15:58  谁说程序猿很猥琐  阅读(728)  评论(0编辑  收藏  举报