您的位置:首页 > 编程语言 > C#

C# winform 上传文件、图片

2015-09-08 15:17 387 查看
方案一:

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

{

/**////

/// winform形式的文件传输类

///

public class WinFileTransporter

{

/**////

/// WebClient上传文件至服务器,默认不自动改名

///

/// 文件名,全路径格式

/// 服务器文件夹路径

public void UpLoadFile(string fileNamePath, string uriString)

{

UpLoadFile(fileNamePath, uriString, false);

}
/**////

/// WebClient上传文件至服务器

///

/// 文件名,全路径格式

/// 服务器文件夹路径

/// 是否自动按照时间重命名

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();

}
}
////

/**////

/// 下载服务器文件至客户端

///

/// 被下载的文件地址,绝对路径

/// 另存放的目录

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” %>

WebForm1

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

{

///

/// WebForm1 的摘要说明。

///

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);

}
///

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

///

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来实现的,代码如下:

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

{

///

/// Fires progress events when using GetUrlEvents() to retrieve a URL.

///

public event OnReceiveDataHandler OnReceiveData;

///

/// Determines how data is POSTed when cPostBuffer is set.

/// 1 - UrlEncoded

/// 2 - Multi-Part form vars

/// 4 - XML (raw buffer content type: text/xml)

///

public int PostMode

{

get { return this.nPostMode; }
set { this.nPostMode = value; }
}
///

/// User name used for Authentication.

/// To use the currently logged in user when accessing an NTLM resource you can use “AUTOLOGIN”.

///

public string Username

{

get { return this.cUsername; }
set { cUsername = value; }
}
///

/// Password for Authentication.

///

public string Password

{

get {return this.cPassword;}
set {this.cPassword = value;}
}
///

/// Address of the Proxy Server to be used.

/// Use optional DEFAULTPROXY value to specify that you want to IE’s Proxy Settings

///

public string ProxyAddress

{

get {return this.cProxyAddress;}
set {this.cProxyAddress = value;}
}
///

/// Semicolon separated Address list of the servers the proxy is not used for.

///

public string ProxyBypass

{

get {return this.cProxyBypass;}
set {this.cProxyBypass = value;}
}
///

/// Username for a password validating Proxy. Only used if the proxy info is set.

///

public string ProxyUsername

{

get {return this.cProxyUsername;}
set {this.cProxyUsername = value;}
}
///

/// Password for a password validating Proxy. Only used if the proxy info is set.

///

public string ProxyPassword

{

get {return this.cProxyPassword;}
set {this.cProxyPassword = value;}
}
///

/// Timeout for the Web request in seconds. Times out on connection, read and send operations.

/// Default is 30 seconds.

///

public int Timeout

{

get {return this.nConnectTimeout; }
set {this.nConnectTimeout = value; }
}
///

/// Error Message if the Error Flag is set or an error value is returned from a method.

///

public string ErrorMsg

{

get { return this.cErrorMsg; }
set { this.cErrorMsg = value; }
}
///

/// Error flag if an error occurred.

///

public bool Error

{

get { return this.bError; }
set { this.bError = value; }
}
///

/// 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).

///

public bool ThrowExceptions

{

get { return bThrowExceptions; }
set { this.bThrowExceptions = value;}
}
///

/// If set to a non-zero value will automatically track cookies. The number assigned is the cookie count.

///

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

//

}
///

/// 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.

///

/// Key value or raw buffer depending on post type

/// Value to store. Used only in key/value pair modes

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));

}
///

/// Adds a fully self contained POST buffer to the request.

/// Works for XML or previously encoded content.

///

///

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;

}
///

/// Return a the result from an HTTP Url into a StreamReader.

/// Client code should call Close() on the returned object when done reading.

///

/// Url to retrieve.

/// An HttpWebRequest object that can be passed in with properties preset.

///

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;


}
}
///

/// Return a the result from an HTTP Url into a StreamReader.

/// Client code should call Close() on the returned object when done reading.

///

/// Url to retrieve.

///

public StreamReader GetUrlStream(string Url)

{

HttpWebRequest oHttpWebRequest = null;

return this.GetUrlStream(Url,oHttpWebRequest);

}
///

/// Return a the result from an HTTP Url into a StreamReader.

/// Client code should call Close() on the returned object when done reading.

///

/// A Request object

///

public StreamReader GetUrlStream(HttpWebRequest Request)

{

return this.GetUrlStream(Request.RequestUri.AbsoluteUri,Request);

}
///

/// Return a the result from an HTTP Url into a string.

///

/// Url to retrieve.

///

public string GetUrl(string Url)

{

StreamReader oHttpResponse = this.GetUrlStream(Url);

if (oHttpResponse == null)

return “”;

string lcResult = oHttpResponse.ReadToEnd();

oHttpResponse.Close();

return lcResult;

}
///

/// Return a the result from an HTTP Url into a string.

///

/// Url to retrieve.

///

public byte[] GetUrlBytes(string Url)

{

StreamReader oHttpResponse = this.GetUrlStream(Url);

if (oHttpResponse == null)

{

return null;

}
string lcResult = oHttpResponse.ReadToEnd();

oHttpResponse.Close();

return null;

}
///

/// Retrieves URL with events in the OnReceiveData event.

///

///

///

///

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: