1、引入動態庫ICSharpCode.SharpZipLib.Zip
2、代碼 實現:
public class DownFileHelper
{
/// <summary>
/// Http方式下載文件
/// </summary>
/// <param name="url">http地址</param>
/// <param name="localfile">本地文件</param>
/// <returns></returns>
public bool Download(string url, string localfile,out string message)
{
message = string.Empty;
bool flag = false;
long startPosition = 0; // 上次下載的文件起始位置
FileStream writeStream; // 寫入本地文件流對象
string remoteFileLength = GetInfo(url);
if (Convert.ToDouble(remoteFileLength) <= 0 || remoteFileLength == "無法檢測")
{
message = "遠程文件不存在";
return false;
}
//long remoteFileLength = GetHttpLength(url); // 取得遠程文件長度
//Console.WriteLine("remoteFileLength=" + remoteFileLength);
//if (remoteFileLength == 745)
//{
// message="遠程文件不存在";
// return false;
//}
//判斷要下載的文件夾是否存在
if (File.Exists(localfile))
{
File.Delete(localfile);
writeStream = new FileStream(localfile, FileMode.Create); // 文件不保存創建一個文件
startPosition = 0;
}
else
{
writeStream = new FileStream(localfile, FileMode.Create); // 文件不保存創建一個文件
startPosition = 0;
}
try
{
HttpWebRequest myRequest = (HttpWebRequest) WebRequest.Create(url); // 打開網絡連接
if (startPosition > 0)
{
myRequest.AddRange((int) startPosition); // 設置Range值,與上面的writeStream.Seek用意相同,是爲了定義遠程文件讀取位置
}
Stream readStream = myRequest.GetResponse().GetResponseStream(); // 向服務器請求,獲得服務器的迴應數據流
byte[] btArray = new byte[512]; // 定義一個字節數據,用來向readStream讀取內容和向writeStream寫入內容
int contentSize = readStream.Read(btArray, 0, btArray.Length); // 向遠程文件讀第一次
while (contentSize > 0) // 如果讀取長度大於零則繼續讀
{
writeStream.Write(btArray, 0, contentSize); // 寫入本地文件
contentSize = readStream.Read(btArray, 0, btArray.Length); // 繼續向遠程文件讀取
}
writeStream.Close();
readStream.Close();
flag = true; //返回true下載成功
}
catch (Exception exception)
{
writeStream.Close();
Trace.Write($"Http方式下載文件失敗:{exception.Message}");
message = $"下載數據文件失敗:{exception.Message}";
flag = false; //返回false下載失敗
}
return flag;
}
public string GetInfo(string URL)
{
string Results = "";
long ContentL = 0;
if (URL.ToLower().StartsWith("https://"))
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.MaximumAutomaticRedirections = 4;
request.MaximumResponseHeadersLength = 4;
request.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
ContentL = response.ContentLength;
response.Close();
Results += GetSize(ContentL);
}
else if (URL.ToLower().StartsWith("ftp://"))
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(URL);
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.UseBinary = true;
FtpWebResponse response = null;
response = (FtpWebResponse)request.GetResponse();
Stream Fs = response.GetResponseStream();
ContentL = response.ContentLength;
Fs.Close();
response.Close();
Results += GetSize(ContentL);
}
else
{
Results += "無法檢測";
}
return Results;
}
//大小轉化
public string GetSize(long L)
{
float result;
//string re = "";
if (L >= 1073741824)
{
result = L / 1073741824.00F;
//re = "GB";
}
else if (L >= 1048576)
{
result = L / 1048576.00F;
//re = "MB";
}
else
{
result = L / 1024.00F;
//re = "KB";
}
string File_Size = result.ToString("0.00");
return File_Size;
}
/// <summary>
/// 從文件頭得到遠程文件的長度
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private long GetHttpLength(string url)
{
long length = 0;
try
{
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
HttpWebResponse rsp = (HttpWebResponse) req.GetResponse();
if (rsp.StatusCode == HttpStatusCode.OK)
{
length = rsp.ContentLength;
}
rsp.Close();
return length;
}
catch (Exception ex)
{
Trace.Write("從文件頭得到遠程文件的長度出現錯誤:" + ex.Message);
return length;
}
}
/// <summary>
/// 解壓文件
/// </summary>
/// <param name="zipName">解壓文件路徑</param>
/// <param name="fileDirName">解壓到文件夾的名稱</param>
/// <returns></returns>
public bool ZipToFile(string zipName, string fileDirName,out string message)
{
message = string.Empty;
try
{
//讀取壓縮文件(zip文件),準備解壓縮
ZipInputStream s = new ZipInputStream(File.Open(zipName.Trim(), FileMode.Open, FileAccess.Read));
ZipEntry theEntry;
string rootDir = " ";
while ((theEntry = s.GetNextEntry()) != null)
{
string path = fileDirName;
//獲取該文件在zip中目錄
rootDir = Path.GetDirectoryName(theEntry.Name);
//獲取文件名稱
string fileName = Path.GetFileName(theEntry.Name);
if (string.IsNullOrEmpty(fileName))
{
continue;
}
//判斷是否爲頂層文件,是,將文件直接放在fileDirName下,否,創建目錄
if (string.IsNullOrEmpty(rootDir))
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
else
{
path += "\\" + rootDir;
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
//將文件流寫入對應目錄下的文件中
if (fileName != string.Empty)
{
FileStream streamWriter = File.Create(path + "\\" + fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
if (theEntry.Size == 0)
{
break;
}
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception ex)
{
Trace.Write("解壓過程出現異常:" + ex.Message);
message = "解壓過程出現異常:" + ex.Message;
return false;
}
}
}
3、 調用
DownFileHelper downFileHelper = new DownFileHelper();
if (downFileHelper.Download(result.Data.ToString(), CommonUtil.GetCurrentDirectory() + @"temp.zip", out string message))
{
if (!downFileHelper.ZipToFile(CommonUtil.GetCurrentDirectory() + @"temp.zip", CommonUtil.GetCurrentDirectory(), out message))
{
DialogHelper.ShowInfo("提示", "解壓打印數據失敗:" + message, "確定");
Trace.Write("解壓打印數據失敗:" + message);
return;
}
}
else
{
DialogHelper.ShowInfo("提示", "下載打印數據失敗:" + message, "確定");
Trace.Write("下載打印數據失敗:" + message);
return;
}