using System;
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Web.UI;

namespace Pub.Class
{
    /// <summary>
    /// 网络操作类
    /// </summary>
    public class Net
    {
        private static object lockHelper = new object();

        #region DownFile/ResponseFile/GetHttpFile
        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="fileFile">文件路径(绝对路径)</param>
        /// <returns >返回文件是否存在,存在下载成功</returns>
        public static bool DownFile(string fileFile)
        {
            if (System.IO.File.Exists(fileFile)) {
                FileInfo _DownloadFile = new FileInfo(fileFile);
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.ClearHeaders();
                HttpContext.Current.Response.Buffer = false;
                HttpContext.Current.Response.ContentType = "application/octet-stream";
                HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_DownloadFile.FullName, System.Text.Encoding.UTF8));
                HttpContext.Current.Response.AppendHeader("Content-Length", _DownloadFile.Length.ToString());
                HttpContext.Current.Response.WriteFile(_DownloadFile.FullName);
                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.End();
                return true;
            }

            return false;
        }
        public static string DownFile(string url,string fileName) {
            WebClient wc = new WebClient();
            try {
                wc.DownloadFile(url,fileName);
            } catch {
                fileName = "";
            } finally {
                wc.Dispose();
            }
            return fileName;
        }
        /// <summary>
  /// 以指定的ContentType输出指定文件文件
  /// </summary>
  /// <param name="filepath">文件路径</param>
  /// <param name="filename">输出的文件名</param>
  /// <param name="filetype">将文件输出时设置的ContentType</param>
  public static void ResponseFile(string filepath, string  filename, string filetype)
  {
  Stream iStream = null;
  // 缓冲区为10k
  byte[] buffer = new Byte[10000];
  // 文件长度
  int length;
  // 需要读的数据长度
  long dataToRead;
  try {
    // 打开文件
    iStream = new FileStream(filepath, FileMode.Open, FileAccess.Read,FileShare.Read);
    // 需要读的数据长度
    dataToRead = iStream.Length;
    HttpContext.Current.Response.ContentType = filetype;
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename.Trim().UrlEncode().Replace("+", " "));
    while (dataToRead > 0) {
    // 检查客户端是否还处于连接状态
    if (HttpContext.Current.Response.IsClientConnected) {
      length = iStream.Read(buffer, 0, 10000);
      HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
      HttpContext.Current.Response.Flush();
      buffer = new Byte[10000];
      dataToRead = dataToRead - length;
    } else {
      // 如果不再连接则跳出死循环
      dataToRead = -1;
    }
    }
  } catch (Exception ex) {
    HttpContext.Current.Response.Write("Error : " + ex.Message);
  } finally {
    if (iStream != null) iStream.Close();// 关闭文件
  }
  HttpContext.Current.Response.End();
  }
        /// <summary>
        /// 下载远程的文件
        /// </summary>
        /// <param name="sUrl">URL</param>
        /// <param name="sSavePath">保存到</param>
        /// <returns>成功否</returns>
        /// <example>
        /// <code>
        /// TimeSpan oStartTime=DateTime.Now.TimeOfDay;
        /// Response.Write(GetHttpFile("http://www.spbdev.com/download/DotNetInfo1.0.rar",Request.MapPath("RecievedFile.rar")));
        /// Response.Write("<br><br>\r\n执行时间:" + DateTime.Now.TimeOfDay.Subtract(oStartTime).TotalMilliseconds.ToString() + " 毫秒");
        /// </code>
        /// </example>
        public bool GetHttpFile(string sUrl,string sSavePath) {
            string sException=null;
            bool bRslt=false;
            WebResponse oWebRps=null;
            WebRequest oWebRqst=WebRequest.Create(sUrl);
            oWebRqst.Timeout=50000;
            try{
                oWebRps=oWebRqst.GetResponse();
            } catch(WebException e){
                sException=e.Message.ToString();
            } catch(Exception e){
                sException=e.ToString();
            } finally {
                if(oWebRps!=null){
                    BinaryReader oBnyRd=new BinaryReader(oWebRps.GetResponseStream(),System.Text.Encoding.GetEncoding("GB2312"));
                    int iLen=Convert.ToInt32(oWebRps.ContentLength);
                    FileStream oFileStream;
                    try{
                        if(File.Exists( HttpContext.Current.Request.MapPath("RecievedData.tmp")))
                            oFileStream=File.OpenWrite(sSavePath);
                        else
                            oFileStream=File.Create(sSavePath);
                        oFileStream.SetLength((Int64)iLen);
                        oFileStream.Write(oBnyRd.ReadBytes(iLen),0,iLen);
                        oFileStream.Close();
                    } finally {
                        oBnyRd.Close();
                        oWebRps.Close();
                    }
                    bRslt=true;
                }
            }
            return bRslt;
        }
        #endregion

        #region GetRemoteHtmlCode/GetRemoteHtmlCode2/GetRemoteHtmlCode3
        /// <summary>
        /// 获取远程文件源代码 GetRemoteHtmlCode(@"http://www.baidu.com");
        /// </summary>
        /// <param name="Url">远程url</param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode2(string Url) {
            return GetRemoteHtmlCode2(Url, Encoding.Default);
        }
        /// <summary>
        /// 获取远程文件源代码
        /// </summary>
        /// <param name="Url"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode2(string Url, System.Text.Encoding encoding) { 
            lock (lockHelper) {
                Url += (Url.IndexOf("?") >= 0 ? "&time=" : "?time=") + Rand.RndDateStr();
                string s = ""; HttpWebResponse response = null; StreamReader stream = null;
                try {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    response = (HttpWebResponse) request.GetResponse();
                    stream = new StreamReader(response.GetResponseStream(),encoding);
                    s = stream.ReadToEnd();
                } catch {} finally {
                    if (stream != null) stream.Close();
                    if (response != null) response.Close();
                }
                return s;
            }
        }
        /// <summary>
        /// 获取远程文件源代码 GetRemoteHtmlCode(@"http://www.baidu.com");
        /// </summary>
        /// <param name="strUrl">远程url</param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode3(string strUrl) {
            return GetRemoteHtmlCode3(strUrl, Encoding.Default);
        }
        /// <summary>
        /// 获取远程文件源代码
        /// </summary>
        /// <param name="strUrl"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode3(string strUrl, System.Text.Encoding encoding) 
        { 
            lock (lockHelper) {
                strUrl += (strUrl.IndexOf("?") >= 0 ? "&time=" : "?time=") + Rand.RndDateStr();
                StringBuilder Html = new StringBuilder(); 
                HttpWebResponse myRp = null; StreamReader sr = null; Stream mystr = null; 
                try { 
                    HttpWebRequest myRq = (HttpWebRequest)HttpWebRequest.Create(strUrl); 
                    myRq.AllowAutoRedirect = true; 
                    myRq.Timeout = 1000*60*3; 
                    myRq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; 
                    myRq.Referer=strUrl; 
                    myRp = (HttpWebResponse)myRq.GetResponse(); 
                    mystr = myRp.GetResponseStream(); 
                    sr = new StreamReader(mystr,encoding); 
                    while(sr.Peek()!=-1) { Html.Append(sr.ReadToEnd()); } 
                } catch { 
                    return "-1"; 
                }  finally {
                    if (sr!=null) sr.Close(); 
                    if (mystr!=null) mystr.Close(); 
                    if (myRp!=null) myRp.Close(); 
                }
                return Html.ToString();
            }
        } 
        /// <summary>
        /// 获取远程文件源代码 GetRemoteHtmlCode(@"http://www.baidu.com");
        /// </summary>
        /// <param name="strUrl">远程url</param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode4(string strUrl) {
            return GetRemoteHtmlCode4(strUrl, Encoding.Default);
        }
        /// <summary>
        /// 获取远程文件源代码
        /// </summary>
        /// <param name="Url"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode4(string Url, System.Text.Encoding encoding) 
        {
            lock (lockHelper) {
                Url += (Url.IndexOf("?") >= 0 ? "&time=" : "?time=") + Rand.RndDateStr();
                WebClient wc = new WebClient(); 
                wc.Credentials = CredentialCache.DefaultCredentials; 
                Byte[] pageData = wc.DownloadData(Url); 
                string content = encoding.GetString(pageData);
                wc.Dispose();
                return content;
            }
        }
        /// <summary>
        /// 获取远程文件源代码 GetRemoteHtmlCode(@"http://www.baidu.com");
        /// </summary>
        /// <param name="strUrl">远程url</param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode5(string strUrl) {
            return GetRemoteHtmlCode5(strUrl, Encoding.Default);
        }
        /// <summary>
        /// 获取远程文件源代码
        /// </summary>
        /// <param name="Url"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string GetRemoteHtmlCode5(string Url, System.Text.Encoding encoding) 
        {
            lock (lockHelper) {
                Url += (Url.IndexOf("?") >= 0 ? "&time=" : "?time=") + Rand.RndDateStr();
                string postString = "";
                WebClient webClient = new WebClient();
                webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                byte[] postData = Encoding.ASCII.GetBytes(postString);
                byte[] responseData = webClient.UploadData(Url, "POST", postData);
                string srcString = encoding.GetString(responseData);
                webClient.Dispose();
                return srcString;
            }
        }
        #endregion

        #region TransHtml
        /// <summary>
  /// 转换为静态html
  /// </summary>
        public static void TransHtml(string path, string outpath,System.Text.Encoding encoding) {
            lock (lockHelper) {
                FileStream stream = null;
                StringWriter writer = new StringWriter();
                try {
                    Page page = new Page();
                    page.Server.Execute(path, writer);
                    if (File.Exists(outpath)) {
                        File.Delete(outpath);
                        stream = File.Create(outpath);
                    } else {
                        stream = File.Create(outpath);
                    }
                    byte[] bytes = encoding.GetBytes(writer.ToString());
                    stream.Write(bytes, 0, bytes.Length);
                } catch {} finally{
                    if (writer != null) { writer.Close(); writer.Dispose(); }
                    if (stream != null) { stream.Close(); stream.Dispose(); }
                }
            }
        }
        #endregion
    }
} 
posted on 2010-12-28 01:45  rooly  阅读(331)  评论(0)    收藏  举报