文件下載(服務器和客戶端)


通過接口下載文件(服務器和客戶端)

客戶端:

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM