转:http://www.cnblogs.com/7in10/archive/2008/05/20/1203402.html

方案一:

注意:要开启虚拟目录的“写入”权限,要不然就报 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

转载于:https://www.cnblogs.com/seoxs/archive/2011/04/15/2016721.html

C# winform 上传文件 (多种)相关推荐

  1. C# winform 上传文件 (多种方案)

    方案一: 注意:要开启虚拟目录的"写入"权限,要不然就报 403 错误 工作中用到winform上传文件(-_-!,很少用winform,搞了半天) 碰到一点问题,解决如下 1.5 ...

  2. winform上传文件解决方案

    winform上传文件解决方案 参考文章: (1)winform上传文件解决方案 (2)https://www.cnblogs.com/yeminglong/archive/2012/10/16/27 ...

  3. c winform 上传文件到mysql_C# winform DevExpress上传图片到数据库【转】

    实现功能如下图: 注明:此文使用的是DevExpress控件,winform 原生控件也是一样使用方法. 1.点击选择图片按钮,功能为通过对话框选择要上传的文件,并将该文件在下面的PictureEdi ...

  4. c winform 上传文件到mysql_WinForm上传文件至服务器

    /// /// WebClient上传文件至服务器 /// /// 文件名,全路径格式 /// 服务器文件夹路径 /// public bool Upload(string localFilePath ...

  5. Jquery_异步上传文件多种方式归纳

    1.不用任何插件,利用iframe,将form的taget设为iframe的name,注意设为iframe的id是没用的,跟网上很多说的不太一致 iframe_upload.htm<!DOCTY ...

  6. C# winform 上传文件到服务器

    1.首先要在服务器端新建一个网站axpx页 然后再网站的后台写代码获取winform传过来的文件名. 声明:这个方法虽然最简单最省事,但是上传大文件可能会报错,我的机器是10M, 超过10M就会提示报 ...

  7. c winform 上传文件到mysql_Winform下如何上传图片并显示出来。同时保存到数据库...

    通常,我们在开发软件或者网站是否,通常有时候需要添加图片,我们怎么做呢,直接贴例子. 前提是添加openFileDialog控件哈 #region 定义公共的类对象及变量 SqlConnection ...

  8. 在WinForm中通过HTTP协议向服务器端上传文件(转)

    相信用ASP.NET写一个上传文件的网页,大家都会写,但是有没有人想过通过在WinForm中通过HTTP协议上传文件呢? 有些人说要向服务器端上传文件,用FTP协议不是很简单吗?效率又高,为什么还要使 ...

  9. 记录华为OBS文件上传下载多种方式

    公司要从阿里的oss切换到华为的obs,为了尽量小代价的改动,所以想找和阿里一样上传的方式,之前阿里做的是后端生成文件上传的url,前端做上传动作,这里记录一下obs的多种上传方式.直接上代码: 1. ...

最新文章

  1. .Net Core 3.0 gRPC部署问题解决
  2. 一、什么是hadoop?
  3. apache ftp server的外网访问问题
  4. Android--Activity四种启动模式
  5. CAS Client 3.2.1 配置详解
  6. devops定义_在层中定义DevOps
  7. clean,compile,build,install,package区别
  8. 圆台下料展开计算方法_冲压件展开计算方法(二),转发给每一位冲压人
  9. svn和maven结合讨论
  10. Endnote自定义文献引用格式
  11. 微信加不了好友提醒服务器忙,微信加人对方收不到验证信息怎么办?
  12. Ckplayer播放器播放视频
  13. 肖邦 第一叙事曲 赏析
  14. 笔记本计算机怎么进入安全模式启动,笔记本怎么进入安全模式 【使用步骤】...
  15. 终身教职让美国研究型大学称霸世界,却把中国「青椒」卷怕了!
  16. uniapp弹窗滚动阻止外部滚动
  17. android 视频剪辑工具,微剪辑视频剪辑工具
  18. FBX SDK 总结之中文问题
  19. 统计素数并求和 / 求奇数和
  20. 大端(Big Endian)和小端(Little Endian)的区别

热门文章

  1. windows ce操作系统能用哪个导航_微软的windows和苹果的mac操作系统,在技术难度上哪个更高...
  2. 因分辨率变化html页面布局跳动_Web前端页面设计流程及注意事项,谨记!
  3. cad 打开硬件加速卡_CAD画图卡顿?电脑带不动?4个简单实用的方法,解决CAD运行卡顿问题...
  4. 我的大数据方法论:求扔砖
  5. 数据分析中常用的数据模型
  6. python爬虫工程师工作内容_爬虫岗位职责
  7. mysql的财务视图_Mysql中的视图
  8. 运筹优化(十二)--带约束非线性规划(NLP)
  9. 系统学习深度学习(一) --深度学习与神经网络关系
  10. jenkins教程_2 入门