• winform 上传文件 (多种)


    方案一:

    注意:要开启虚拟目录的“写入”权限,要不然就报 403 错误

    工作中用到winform上传文件(-_-!,很少用winform,搞了半天)
    碰到一点问题,解决如下
    1、501 为实现错误
    解决方法:
    先把IISWEB服务扩展中的WebDev打开
    然后
    IIS站点添加MIME  txt类型 常见的MIME类型如下
    超文本标记语言文本 .html,.html text/html
    普通文本 .txt text/plain
    RTF文本 .rtf application/rtf
    GIF图形 .gif image/gif
    JPEG图形 .ipeg,.jpg image/jpeg
    au声音文件 .au audio/basic
    MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
    RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
    MPEG文件 .mpg,.mpeg video/mpeg
    AVI文件 .avi video/x-msvideo
    GZIP文件 .gz application/x-gzip
    TAR文件 .tar application/x-tar
    再然后
    设置目标文件夹的可写性

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.IO;

    namespace Common
    {
        
    /// <summary>
        
    /// winform形式的文件传输类
        
    /// </summary>

        public class WinFileTransporter
        
    {
            
    /// <summary>
            
    /// WebClient上传文件至服务器,默认不自动改名
            
    /// </summary>
            
    /// <param name="fileNamePath">文件名,全路径格式</param>
            
    /// <param name="uriString">服务器文件夹路径</param>

            public void UpLoadFile(string fileNamePath, string uriString)
            
    {
                UpLoadFile(fileNamePath, uriString, 
    false);
            }

            
    /// <summary>
            
    /// WebClient上传文件至服务器
            
    /// </summary>
            
    /// <param name="fileNamePath">文件名,全路径格式</param>
            
    /// <param name="uriString">服务器文件夹路径</param>
            
    /// <param name="IsAutoRename">是否自动按照时间重命名</param>

            public void UpLoadFile(string fileNamePath, string uriString, bool IsAutoRename)
            
    {
                
    string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\"+ 1);
                
    string NewFileName = fileName;
                
    if (IsAutoRename)
                
    {
                    NewFileName 
    = DateTime.Now.ToString("yyMMddhhmmss"+ DateTime.Now.Millisecond.ToString() + fileNamePath.Substring(fileNamePath.LastIndexOf("."));
                }


                
    string fileNameExt = fileName.Substring(fileName.LastIndexOf("."+ 1);
                
    if (uriString.EndsWith("/"== false) uriString = uriString + "/";

                uriString 
    = uriString + NewFileName;
                Utility.LogWriter log 
    = new Utility.LogWriter();
                
    //log.AddLog(uriString, "Log");
                
    //log.AddLog(fileNamePath, "Log");
                /**/
                
    /// 创建WebClient实例
                WebClient myWebClient = new WebClient();
                myWebClient.Credentials 
    = CredentialCache.DefaultCredentials;
                
    // 要上传的文件
                FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
                
    //FileStream fs = OpenFile();
                BinaryReader r = new BinaryReader(fs);
                
    byte[] postArray = r.ReadBytes((int)fs.Length);
                Stream postStream 
    = myWebClient.OpenWrite(uriString, "PUT");


                
    try
                
    {

                    
    //使用UploadFile方法可以用下面的格式
                    
    //myWebClient.UploadFile(uriString,"PUT",fileNamePath);


                    
    if (postStream.CanWrite)
                    
    {
                        postStream.Write(postArray, 
    0, postArray.Length);
                        postStream.Close();
                        fs.Dispose();
                        log.AddLog(
    "上传日志文件成功!""Log");
                    }

                    
    else
                    
    {
                        postStream.Close();
                        fs.Dispose();
                        log.AddLog(
    "上传日志文件失败,文件不可写!""Log");
                    }


                }

                
    catch (Exception err)
                
    {
                    postStream.Close();
                    fs.Dispose();
                    
    //Utility.LogWriter log = new Utility.LogWriter();
                    log.AddLog(err, "上传日志文件异常!""Log");
                    
    throw err;
                }

                
    finally
                
    {
                    postStream.Close();
                    fs.Dispose();
                }

            }



            
    /**/
            
    /// <summary>
            
    /// 下载服务器文件至客户端

            
    /// </summary>
            
    /// <param name="URL">被下载的文件地址,绝对路径</param>
            
    /// <param name="Dir">另存放的目录</param>

            public void Download(string URL, string Dir)
            
    {
                WebClient client 
    = new WebClient();
                
    string fileName = URL.Substring(URL.LastIndexOf("\\"+ 1);  //被下载的文件名

                
    string Path = Dir + fileName;   //另存为的绝对路径+文件名
                Utility.LogWriter log = new Utility.LogWriter();
                
    try
                
    {
                    WebRequest myre 
    = WebRequest.Create(URL);
                }

                
    catch (Exception err)
                
    {
                    
    //MessageBox.Show(exp.Message,"Error"); 
                    log.AddLog(err, "下载日志文件异常!""Log");
                }


                
    try
                
    {
                    client.DownloadFile(URL, fileName);
                    FileStream fs 
    = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                    BinaryReader r 
    = new BinaryReader(fs);
                    
    byte[] mbyte = r.ReadBytes((int)fs.Length);

                    FileStream fstr 
    = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write);

                    fstr.Write(mbyte, 
    0, (int)fs.Length);
                    fstr.Close();

                }

                
    catch (Exception err)
                
    {
                    
    //MessageBox.Show(exp.Message,"Error");
                    log.AddLog(err, "下载日志文件异常!""Log");
                }

            }


        }

    }

    方案二:

    转:http://blog.csdn.net/walkinhill/archive/2004/08/28/87656.aspx

    相信用ASP.NET写一个上传文件的网页,大家都会写,但是有没有人想过通过在WinForm中通过HTTP协议上传文件呢?

    有些人说要向服务器端上传文件,用FTP协议不是很简单吗?效率又高,为什么还要使用HTTP协议那么麻烦呢?这里面有几个原因:

    (1)FTP服务器的部署相对麻烦,还要设置权限,权限设置不对,还会惹来一系列的安全问题。

    (2)如果双方都还有防火墙,又不想开发FTP相关的一些端口时,HTTP就会大派用场,就像WEB Services能穿透防火墙一样。

    (3)其他的...,还在想呢...

    但是使用HTTP也有他的一些问题,例如不能断点续传,大文件上传很难,速度很慢,所以HTTP协议上传的文件大小不应该太大。

    说了这么多,原归正传,一般来说,在Winform里通过HTTP上传文件有几种可选的方法:

    (1)前面提到的Web Services,就是一种很好的方法,通过编写一个WebMethod,包含有 byte[] 类型的参数,然后调用Web Services的方法,文件内容就会以Base64编码传到服务器上,然后重新保存即可。

    [WebMethod]
    public void UploadFile(byte[] content,string filename){
               Stream sw = new StreamWriter(...);
               sw.Close();
    }
    当然,这种通过Base64编码的方法效率比较低,那么可以采用WSE,支持附件,并以2进制形式传送,效率会更高。
    (2)除了通过WebService,另外一种更简单的方法就是通过WebClient或者HttpWebRequest来模拟HTTP的POST动作来实现。这时候首先需要编写一个asp.net web form来响应上传,代码如下:
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="UploadFileWeb.WebForm1" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <html>
     <head>
      <title>WebForm1</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
     </head>
     <body>
      <form id="Form1" method="post" runat="server">
      </form>
     </body>
    </html>

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    namespace UploadFileWeb
    {
     /// <summary>
     /// WebForm1 的摘要说明。
     /// </summary>
     public class WebForm1 : System.Web.UI.Page
     {
      private void Page_Load(object sender, System.EventArgs e)
      {
       // 在此处放置用户代码以初始化页面
       foreach( string f in Request.Files.AllKeys)
       {
        HttpPostedFile file = Request.Files[f];
        file.SaveAs(@"D:\Temp\" + file.FileName);
       }
       if( Request.Params["testKey"] != null )
       {
        Response.Write(Request.Params["testKey"]);
       }
      }

      #region Web 窗体设计器生成的代码
      override protected void OnInit(EventArgs e)
      {
       //
       // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
       //
       InitializeComponent();
       base.OnInit(e);
      }
      
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {   
       this.Load += new System.EventHandler(this.Page_Load);
      }
      #endregion
     }
    }

    其实这个页面跟我们平常写的asp.net上传文件代码是一样的,在Web 页的Request对象中包含有Files这个对象,里面就包含了通过POST方式上传的所有文件的信息,这时所需要做的就是调用 Request.Files[i].SaveAs方法。

    但是怎么让才能在WinForm里面模拟想Web Form POST 数据呢?System.Net命名空间里面提供了两个非常有用的类,一个是WebClient,另外一个是HttpWebRequest类。如果我们不需要通过代理服务器来上传文件,那么非常简单,只需要简单的调用WebClient.UploadFile方法就能实现上传文件:

    private void button1_Click(object sender, System.EventArgs e)
      {
       WebClient myWebClient = new WebClient();
       
       myWebClient.UploadFile("
    http://localhost/UploadFileWeb/WebForm1.aspx","POST",@"D:\Temp\Java\JavaStart\JavaStart2.exe");
           }

    是不是觉得很简单呢?确实就这么简单。

    但是如果要通过代理服务器上传又怎么办呢?那就需要使用到HttpWebRequest,但是该类没有Upload方法,但是幸运的是我们通过Reflector反编译了WebClient.UploadFile方法后,我们发现其内部也是通过WebRequest来实现的,代码如下:www.elivn.com
    public byte[] UploadFile(string address, string method, string fileName)
    {
          string text1;
          string text2;
          WebRequest request1;
          string text3;
          byte[] buffer1;
          byte[] buffer2;
          long num1;
          byte[] buffer3;
          int num2;
          WebResponse response1;
          byte[] buffer4;
          DateTime time1;
          long num3;
          string[] textArray1;
          FileStream stream1 = null;
          try
          {
                fileName = Path.GetFullPath(fileName);
                time1 = DateTime.Now;
                num3 = time1.Ticks;
                text1 = "---------------------" + num3.ToString("x");
                if (this.m_headers == null)
                {
                      this.m_headers = new WebHeaderCollection();
                }
                text2 = this.m_headers["Content-Type"];
                if (text2 != null)
                {
                      if (text2.ToLower(CultureInfo.InvariantCulture).StartsWith("multipart/"))
                      {
                            throw new WebException(SR.GetString("net_webclient_Multipart"));
                      }
                }
                else
                {
                      text2 = "application/octet-stream";
                }
                this.m_headers["Content-Type"] = "multipart/form-data; boundary=" + text1;
                this.m_responseHeaders = null;
                stream1 = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                request1 = WebRequest.Create(this.GetUri(address));
                request1.Credentials = this.Credentials;
                this.CopyHeadersTo(request1);
                request1.Method = method;
                textArray1 = new string[7];
                textArray1[0] = "--";
                textArray1[1] = text1;
                textArray1[2] = "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"";
                textArray1[3] = Path.GetFileName(fileName);
                textArray1[4] = "\"\r\nContent-Type: ";
                textArray1[5] = text2;
                textArray1[6] = "\r\n\r\n";
                text3 = string.Concat(textArray1);
                buffer1 = Encoding.UTF8.GetBytes(text3);
                buffer2 = Encoding.ASCII.GetBytes("\r\n--" + text1 + "\r\n");
                num1 = 9223372036854775807;
                try
                {
                      num1 = stream1.Length;
                      request1.ContentLength = ((num1 + ((long) buffer1.Length)) + ((long) buffer2.Length));
                }
                catch
                {
                }
                buffer3 = new byte[Math.Min(((int) 8192), ((int) num1))];
                using (Stream stream2 = request1.GetRequestStream())
                {
                      stream2.Write(buffer1, 0, buffer1.Length);
                      do
                      {
                            num2 = stream1.Read(buffer3, 0, buffer3.Length);
                            if (num2 != 0)
                            {
                                  stream2.Write(buffer3, 0, num2);
                            }
                      }
                      while ((num2 != 0));
                      stream2.Write(buffer2, 0, buffer2.Length);
                }
                stream1.Close();
                stream1 = null;
                response1 = request1.GetResponse();
                this.m_responseHeaders = response1.Headers;
                return this.ResponseAsBytes(response1);
          }
          catch (Exception exception1)
          {
                if (stream1 != null)
                {
                      stream1.Close();
                      stream1 = null;
                }
                if ((exception1 is WebException) || (exception1 is SecurityException))
                {
                      throw;
                }
                throw new WebException(SR.GetString("net_webclient"), exception1);
          }
          return buffer4;
    }

     
    在这段代码里面其实最关键的就是如何模拟POST请求,通过分析代码和监视HTTP,我们可以发现模拟的POST格式如下:

    -----------------------8c64f47716481f0  //时间戳

    Content-Disposition: form-data; name="file"; filename="a.txt"  //文件名

    Content-Type: application/octet-stream

    //文件的内容

    -----------------------8c64f47716481f0

    这时候,我们只需自己编码来模拟这么一组数据就行(我们还可以好好借鉴MS的代码呢),以下就是代码(声明一下,我是借用了别人的代码)
    public class wwHttp
     {

      /// <summary>
      /// Fires progress events when using GetUrlEvents() to retrieve a URL.
      /// </summary>
      public event OnReceiveDataHandler OnReceiveData;

      /// <summary>
      /// Determines how data is POSTed when cPostBuffer is set.
      /// 1 - UrlEncoded
      /// 2 - Multi-Part form vars
      /// 4 - XML (raw buffer content type: text/xml)
      /// </summary>
      public int PostMode
      {
       get { return this.nPostMode; }
       set { this.nPostMode = value; }
      }

      /// <summary>
      ///  User name used for Authentication.
      ///  To use the currently logged in user when accessing an NTLM resource you can use "AUTOLOGIN".
      /// </summary>
      public string Username
      {
       get { return this.cUsername; }
       set { cUsername = value; }
      }

      /// <summary>
      /// Password for Authentication.
      /// </summary>
      public string Password
      {
       get {return this.cPassword;}
       set {this.cPassword = value;}
      }

      /// <summary>
      /// Address of the Proxy Server to be used.
      /// Use optional DEFAULTPROXY value to specify that you want to IE's Proxy Settings
      /// </summary>
      public string ProxyAddress  
      {
       get {return this.cProxyAddress;}
       set {this.cProxyAddress = value;}
      }

      /// <summary>
      /// Semicolon separated Address list of the servers the proxy is not used for.
      /// </summary>
      public string ProxyBypass
      {
       get {return this.cProxyBypass;}
       set {this.cProxyBypass = value;}
      }

      /// <summary>
      /// Username for a password validating Proxy. Only used if the proxy info is set.
      /// </summary>
      public string ProxyUsername
      {
       get {return this.cProxyUsername;}
       set {this.cProxyUsername = value;}
      }
      /// <summary>
      /// Password for a password validating Proxy. Only used if the proxy info is set.
      /// </summary>
      public string ProxyPassword
      {
       get {return this.cProxyPassword;}
       set {this.cProxyPassword = value;}
      }

      /// <summary>
      /// Timeout for the Web request in seconds. Times out on connection, read and send operations.
      /// Default is 30 seconds.
      /// </summary>
      public int Timeout
      {
       get {return this.nConnectTimeout; }
       set {this.nConnectTimeout = value; }
      }

      /// <summary>
      /// Error Message if the Error Flag is set or an error value is returned from a method.
      /// </summary>
      public string ErrorMsg
      {
       get { return this.cErrorMsg; }
       set { this.cErrorMsg = value; }
      }
      
      /// <summary>
      /// Error flag if an error occurred.
      /// </summary>
      public bool Error
      {
       get { return this.bError; }
       set { this.bError = value; }
      }

      /// <summary>
      /// Determines whether errors cause exceptions to be thrown. By default errors
      /// are handled in the class and the Error property is set for error conditions.
      /// (not implemented at this time).
      /// </summary>
      public bool ThrowExceptions
      {
       get { return bThrowExceptions; }
       set { this.bThrowExceptions = value;}
      }

      /// <summary>
      /// If set to a non-zero value will automatically track cookies. The number assigned is the cookie count.
      /// </summary>
      public bool HandleCookies
      {
       get { return this.bHandleCookies; }
       set { this.bHandleCookies = value; }
      }
      public CookieCollection Cookies {
       get { return this.oCookies; }
       set { this.Cookies = value; }
      }
      public HttpWebResponse WebResponse  {
       get { return this.oWebResponse;}
       set { this.oWebResponse = value; }
      }
      public HttpWebRequest WebRequest  {
       get { return this.oWebRequest; }
       set { this.oWebRequest = value; }
      }

      // *** member properties
      //string cPostBuffer = "";
      MemoryStream oPostStream;
      BinaryWriter oPostData;

      int nPostMode = 1;

      int nConnectTimeout = 30;
      string cUserAgent = "West Wind HTTP .NET";

      string cUsername = "";
      string cPassword = "";

      string cProxyAddress = "";
      string cProxyBypass = "";
      string cProxyUsername = "";
      string cProxyPassword = "";

      bool bThrowExceptions = false;
      bool bHandleCookies = false;
      
      string cErrorMsg = "";
      bool bError = false;
      
      HttpWebResponse oWebResponse;
      HttpWebRequest oWebRequest;
      CookieCollection oCookies;

      string cMultiPartBoundary = "-----------------------------7cf2a327f01ae";

      public void wwHTTP()
      {
       //
       // TODO: Add constructor logic here
       //

      }

      /// <summary>
      /// Adds POST form variables to the request buffer.
      /// HttpPostMode determines how parms are handled.
      /// 1 - UrlEncoded Form Variables. Uses key and value pairs (ie. "Name","Rick") to create URLEncoded content
      /// 2 - Multi-Part Forms - not supported
      /// 4 - XML block - Post a single XML block. Pass in as Key (1st Parm)
      /// other - raw content buffer. Just assign to Key.
      /// </summary>
      /// <param name="Key">Key value or raw buffer depending on post type</param>
      /// <param name="Value">Value to store. Used only in key/value pair modes</param>
      public void AddPostKey(string Key, byte[] Value)
      {
       
       if (this.oPostData == null)
       {
        this.oPostStream = new MemoryStream();
        this.oPostData = new BinaryWriter(this.oPostStream);
       }
       
       if (Key == "RESET")
       {
        this.oPostStream = new MemoryStream();
        this.oPostData = new BinaryWriter(this.oPostStream);
       }

       switch(this.nPostMode)
       {
        case 1:
         this.oPostData.Write(Encoding.GetEncoding(1252).GetBytes(
              Key + "=" + System.Web.HttpUtility.UrlEncode(Value) + "&"));
         break;
        case 2:
         this.oPostData.Write( Encoding.GetEncoding(1252).GetBytes(
          "--" + this.cMultiPartBoundary + "\r\n" +
          "Content-Disposition: form-data; name=\"" +Key+"\"\r\n\r\n") );
         
         this.oPostData.Write( Value );

         this.oPostData.Write( Encoding.GetEncoding(1252).GetBytes("\r\n") );
         break;
        default:
         this.oPostData.Write( Value );
         break;
       }
      }

      public void AddPostKey(string Key, string Value)
      {
       this.AddPostKey(Key,Encoding.GetEncoding(1252).GetBytes(Value));
      }

      /// <summary>
      /// Adds a fully self contained POST buffer to the request.
      /// Works for XML or previously encoded content.
      /// </summary>
      /// <param name="PostBuffer"></param>
      public void AddPostKey(string FullPostBuffer)
      {
       this.oPostData.Write( Encoding.GetEncoding(1252).GetBytes(FullPostBuffer) );
      }

      public bool AddPostFile(string Key,string FileName)
      {
       byte[] lcFile; 

       if (this.nPostMode != 2) {
        this.cErrorMsg = "File upload allowed only with Multi-part forms";
        this.bError = true;
        return false;
       }

       try
       {   
        FileStream loFile = new FileStream(FileName,System.IO.FileMode.Open,System.IO.FileAccess.Read);

        lcFile = new byte[loFile.Length];
        loFile.Read(lcFile,0,(int) loFile.Length);
        loFile.Close();
       }
       catch(Exception e)
       {
        this.cErrorMsg = e.Message;
        this.bError = true;
        return false;
       }

       this.oPostData.Write( Encoding.GetEncoding(1252).GetBytes(
         "--" + this.cMultiPartBoundary + "\r\n"  +
         "Content-Disposition: form-data; name=\"" + Key + "\" filename=\"" +
         new FileInfo(FileName).Name + "\"\r\n\r\n") );

       this.oPostData.Write( lcFile );

       this.oPostData.Write( Encoding.GetEncoding(1252).GetBytes("\r\n")) ;

       return true;
      }


      /// <summary>
      /// Return a the result from an HTTP Url into a StreamReader.
      /// Client code should call Close() on the returned object when done reading.
      /// </summary>
      /// <param name="Url">Url to retrieve.</param>
      /// <param name="WebRequest">An HttpWebRequest object that can be passed in with properties preset.</param>
      /// <returns></returns>
      protected StreamReader GetUrlStream(string Url,HttpWebRequest Request)
      {
       try
       {
        this.bError = false;
        this.cErrorMsg = "";


        if (Request == null)
        {
         Request =  (HttpWebRequest) System.Net.WebRequest.Create(Url);
        }
        
        Request.UserAgent = this.cUserAgent;
        Request.Timeout = this.nConnectTimeout * 1000;

        // *** Save for external access
        this.oWebRequest = Request;

        // *** Handle Security for the request
        if (this.cUsername.Length > 0)
        {
         if (this.cUsername=="AUTOLOGIN")
          Request.Credentials = CredentialCache.DefaultCredentials;
         else
          Request.Credentials = new NetworkCredential(this.cUsername,this.cPassword);
        }

       
        // *** Handle Proxy Server configuration
        if (this.cProxyAddress.Length > 0)
        {
         if (this.cProxyAddress == "DEFAULTPROXY")
         {
          Request.Proxy = new WebProxy();
          Request.Proxy = WebProxy.GetDefaultProxy();
         }
         else
         {
          WebProxy loProxy = new WebProxy(this.cProxyAddress,true);
          if (this.cProxyBypass.Length > 0)
          {
           loProxy.BypassList = this.cProxyBypass.Split(';');
          }

          if (this.cProxyUsername.Length > 0)
           loProxy.Credentials = new NetworkCredential(this.cProxyUsername,this.cProxyPassword);

          Request.Proxy = loProxy;
         }
        }
        
        // *** Handle cookies - automatically re-assign
        if (this.bHandleCookies)
        {
         Request.CookieContainer = new CookieContainer();
         if (this.oCookies != null && this.oCookies.Count > 0)
         {
          Request.CookieContainer.Add(this.oCookies);
         }
        }

        // *** Deal with the POST buffer if any
        if (this.oPostData != null)
        {
         Request.Method = "POST";
         switch (this.nPostMode)
         {
          case 1:
           Request.ContentType = "application/x-www-form-urlencoded";
           // strip off any trailing & which can cause problems with some
           // http servers
    //       if (this.cPostBuffer.EndsWith("&"))
    //        this.cPostBuffer = this.cPostBuffer.Substring(0,this.cPostBuffer.Length-1);
           break;
          case 2:
           Request.ContentType = "multipart/form-data; boundary=" + this.cMultiPartBoundary;
           this.oPostData.Write( Encoding.GetEncoding(1252).GetBytes( "--" + this.cMultiPartBoundary + "\r\n" ) );
           break;
          case 4:
           Request.ContentType = "text/xml";
           break;
          default:
           goto case 1;
         }
         

         Stream loPostData = Request.GetRequestStream();
         //loPostData.Write(lcPostData,0,lcPostData.Length);
         this.oPostStream.WriteTo(loPostData);   
         
         byte[] buffer = new byte[this.oPostStream.Length];
         buffer = this.oPostStream.ToArray();
         Console.Write(Encoding.GetEncoding(1252).GetString(buffer,0,buffer.Length));

         //*** Close the memory stream
         this.oPostStream.Close();
         this.oPostStream = null;

         
         //*** Close the Binary Writer
         this.oPostData.Close();
         this.oPostData = null;

         //*** Close Request Stream
         loPostData.Close();

         // *** clear the POST buffer
         //this.cPostBuffer = "";
        }
      
      
        // *** Retrieve the response headers
        HttpWebResponse Response = (HttpWebResponse) Request.GetResponse();

        // ** Save cookies the server sends
        if (this.bHandleCookies) 
        {
         if (Response.Cookies.Count > 0) 
         {
          if (this.oCookies == null) 
          {
           this.oCookies = Response.Cookies;
          }
          else
          {
           // ** If we already have cookies update the list
           foreach (Cookie oRespCookie in Response.Cookies) 
           {
            bool bMatch = false;
            foreach(Cookie oReqCookie in this.oCookies) 
            {
             if (oReqCookie.Name == oRespCookie.Name) 
             {
              oReqCookie.Value = oRespCookie.Name;
              bMatch = true;
              break; //
             }
            } // for each ReqCookies
            if (!bMatch)
             this.oCookies.Add(oRespCookie);
           } // for each Response.Cookies
          }  // this.Cookies == null
         } // if Response.Cookie.Count > 0
        }  // if this.bHandleCookies = 0

        
        // *** Save the response object for external access
        this.oWebResponse = Response;

        Encoding enc;
        try
        {
         if (Response.ContentEncoding.Length  > 0)
          enc = Encoding.GetEncoding(Response.ContentEncoding);
         else
          enc = Encoding.GetEncoding(1252);
        }
        catch
        {
         // *** Invalid encoding passed
         enc = Encoding.GetEncoding(1252);
        }
        
        // *** drag to a stream
        StreamReader strResponse =
         new StreamReader(Response.GetResponseStream(),enc);
        return strResponse;
       }
       catch(Exception e)
       {
        if (this.bThrowExceptions)
         throw e;

        this.cErrorMsg = e.Message;
        this.bError = true;
        return null;
       }
      }

      /// <summary>
      /// Return a the result from an HTTP Url into a StreamReader.
      /// Client code should call Close() on the returned object when done reading.
      /// </summary>
      /// <param name="Url">Url to retrieve.</param>
      /// <returns></returns>
      public StreamReader GetUrlStream(string Url)
      {
       HttpWebRequest oHttpWebRequest = null;
       return this.GetUrlStream(Url,oHttpWebRequest);
      }

      /// <summary>
      /// Return a the result from an HTTP Url into a StreamReader.
      /// Client code should call Close() on the returned object when done reading.
      /// </summary>
      /// <param name="Request">A Request object</param>
      /// <returns></returns>
      public StreamReader GetUrlStream(HttpWebRequest Request)
      {
       return this.GetUrlStream(Request.RequestUri.AbsoluteUri,Request);
      }

      /// <summary>
      /// Return a the result from an HTTP Url into a string.
      /// </summary>
      /// <param name="Url">Url to retrieve.</param>
      /// <returns></returns>
      public string GetUrl(string Url)
      {
       StreamReader oHttpResponse = this.GetUrlStream(Url);
       if (oHttpResponse == null)
        return "";

       string lcResult = oHttpResponse.ReadToEnd();
       oHttpResponse.Close();

       return lcResult;
      }

      /// <summary>
      /// Return a the result from an HTTP Url into a string.
      /// </summary>
      /// <param name="Url">Url to retrieve.</param>
      /// <returns></returns>
      public byte[] GetUrlBytes(string Url)
      {
       StreamReader oHttpResponse = this.GetUrlStream(Url);
       
       if (oHttpResponse == null)
       {
        return null;
       }

       string lcResult = oHttpResponse.ReadToEnd();
       oHttpResponse.Close();

       return null;
      }

      /// <summary>
      /// Retrieves URL with events in the OnReceiveData event.
      /// </summary>
      /// <param name="Url"></param>
      /// <param name="BufferSize"></param>
      /// <returns></returns>
      public string GetUrlEvents(string Url,long BufferSize)
      {
      
       StreamReader oHttpResponse = this.GetUrlStream(Url);
       if (oHttpResponse == null)
        return "";

       long lnSize = BufferSize;
       if (this.oWebResponse.ContentLength > 0)
        lnSize = this.oWebResponse.ContentLength;
       else
        lnSize = 0;

       Encoding enc = Encoding.GetEncoding(1252);

       StringBuilder loWriter = new StringBuilder((int) lnSize);
          
       char[] lcTemp = new char[BufferSize];

       OnReceiveDataEventArgs oArgs = new OnReceiveDataEventArgs();
       oArgs.TotalBytes = lnSize;

       lnSize = 1;
       int lnCount = 0;
       long lnTotalBytes = 0;

       while (lnSize > 0)
       {
        lnSize = oHttpResponse.Read(lcTemp,0,(int) BufferSize);
        if (lnSize > 0)
        {
         loWriter.Append( lcTemp,0,(int) lnSize );
         lnCount++;
         lnTotalBytes += lnSize;

         // *** Raise an event if hooked up
         if (this.OnReceiveData != null)
         {
          /// *** Update the event handler
          oArgs.CurrentByteCount = lnTotalBytes;
          oArgs.NumberOfReads = lnCount;
          oArgs.CurrentChunk = lcTemp;
          this.OnReceiveData(this,oArgs);

          // *** Check for cancelled flag
          if (oArgs.Cancel)
           goto CloseDown;
         }
        }
       } // while


      CloseDown:
       oHttpResponse.Close();

       // *** Send Done notification
       if (this.OnReceiveData != null && !oArgs.Cancel)
       {
        // *** Update the event handler
        oArgs.Done = true;
        this.OnReceiveData(this,oArgs);
       }

    //   return lcHtml;
       return loWriter.ToString();
      }


      public delegate void OnReceiveDataHandler(object sender, OnReceiveDataEventArgs e);
      public class OnReceiveDataEventArgs
      {
       public long CurrentByteCount=0;
       public long TotalBytes = 0;
       public int NumberOfReads = 0;
       public char[] CurrentChunk;
       public bool Done = false;
       public bool Cancel = false;
      }  
     }

    在wwHttp这个类里面,不仅仅可以传送文件AddPostFile方法,还可以传送变量AddPostKey方法。

    这样,如果我们要通过代理服务器传送文件,就可以编写如下的代码了:
    wwHttp ww = new wwHttp();
       ww.ProxyAddress = "202.132.156.124";   
       ww.PostMode = 2;
       ww.AddPostKey("testKey","test");
       ww.AddPostFile("myfile",@"D:\Temp\Java\JavaStart\JavaStart2.jar");  
       
       string shtml = ww.GetUrlEvents("http://localhost/UploadFileWeb/WebForm1.aspx",409600);
       Console.Write(shtml);

    小结:

    (1)通过Web Services传文件。

    (2)如果不需要使用代理,使用WebClient类

    (3)如果需要使用代理,使用扩展得到的类wwHttp

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/2018520.html
Copyright © 2020-2023  润新知