| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System.Collections.Generic;
- using System.IO;
- using System.IO.Compression;
- using System.Net;
- using System.Security.Cryptography;
- using System.Text;
- using System.Text.RegularExpressions;
- using ICSharpCode.SharpZipLib.Zip;
- namespace Top.Api.Util
- {
- /// <summary>
- /// 异步API下载工具类。
- /// </summary>
- public abstract class AtsUtils
- {
- private const string CTYPE_OCTET = "application/octet-stream";
- private static Regex regex = new Regex("attachment;filename=\"([\\w\\-]+)\"", RegexOptions.Compiled);
- /// <summary>
- /// 通过HTTP GET方式下载文件到指定的目录。
- /// </summary>
- /// <param name="url">需要下载的URL</param>
- /// <param name="destDir">需要下载到的目录</param>
- /// <returns>下载后的文件</returns>
- public static string Download(string url, string destDir)
- {
- string file = null;
- try
- {
- WebUtils wu = new WebUtils();
- HttpWebRequest req = wu.GetWebRequest(url, "GET", null);
- HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
- if (CTYPE_OCTET.Equals(rsp.ContentType))
- {
- file = Path.Combine(destDir, GetFileName(rsp.Headers["Content-Disposition"]));
- using (System.IO.Stream rspStream = rsp.GetResponseStream())
- {
- int len = 0;
- byte[] buf = new byte[8192];
- using (FileStream fileStream = new FileStream(file, FileMode.OpenOrCreate))
- {
- while ((len = rspStream.Read(buf, 0, buf.Length)) > 0)
- {
- fileStream.Write(buf, 0, len);
- }
- }
- }
- }
- else
- {
- throw new TopException(wu.GetResponseAsString(rsp, Encoding.UTF8));
- }
- }
- catch (WebException e)
- {
- throw new TopException("isv.file-already-download", e.Message);
- }
- return file;
- }
- /// <summary>
- /// 解压gzip文件到指定的目录,目前只能解压gzip包里面只包含一个文件的压缩包。
- /// </summary>
- /// <param name="gzipFile">需要解压的gzip文件</param>
- /// <param name="destDir">需要解压到的目录(不能和压缩文件在同一个目录)</param>
- /// <returns>解压后的文件</returns>
- public static string Ungzip(string gzipFile, string destDir)
- {
- string destFile = Path.Combine(destDir, Path.GetFileName(gzipFile));
- using (System.IO.Stream output = File.Create(destFile))
- {
- using (System.IO.Stream input = new GZipStream(File.Open(gzipFile, FileMode.Open), CompressionMode.Decompress))
- {
- int size = 0;
- byte[] buf = new byte[8192];
- while ((size = input.Read(buf, 0, buf.Length)) > 0)
- {
- output.Write(buf, 0, size);
- }
- }
- }
- return destFile;
- }
- /// <summary>
- /// 解压zip文件到指定的目录。
- /// </summary>
- /// <param name="zipFile">需要解压的zip文件</param>
- /// <param name="destDir">需要解压到的目录</param>
- /// <returns>解压后的文件列表(不包含文件夹)</returns>
- public static List<string> Unzip(string zipFile, string destDir)
- {
- List<string> files = new List<string>();
- using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFile)))
- {
- ZipEntry theEntry;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- if (theEntry.IsDirectory)
- {
- Directory.CreateDirectory(Path.Combine(destDir, theEntry.Name));
- continue;
- }
- string fileName = Path.Combine(destDir, theEntry.Name);
- using (FileStream streamWriter = File.Create(fileName))
- {
- int size = 0;
- byte[] buf = new byte[8192];
- while ((size = s.Read(buf, 0, buf.Length)) > 0)
- {
- streamWriter.Write(buf, 0, size);
- }
- }
- files.Add(fileName);
- }
- }
- return files;
- }
- /// <summary>
- /// 检查指定文件的md5sum和指定的检验码是否一致。
- /// </summary>
- /// <param name="fileName">需要检验的文件</param>
- /// <param name="checkCode">已知的md5sum检验码</param>
- /// <returns>true/false</returns>
- public static bool CheckMd5sum(string fileName, string checkCode)
- {
- using (FileStream stream = new FileStream(fileName, FileMode.Open))
- {
- MD5 md5 = new MD5CryptoServiceProvider();
- byte[] retVal = md5.ComputeHash(stream);
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < retVal.Length; i++)
- {
- sb.Append(retVal[i].ToString("x2"));
- }
- return sb.ToString().Equals(checkCode);
- }
- }
- private static string GetFileName(string contentDisposition)
- {
- Match match = regex.Match(contentDisposition);
- if (match.Success)
- {
- return match.Groups[1].ToString();
- }
- else
- {
- throw new TopException("Invalid response header format!");
- }
- }
- }
- }
|