c#中如何用WebClient上传文件?

发布时间:2020-02-24编辑:脚本学堂
c#中使用WebClient上传文件的实现代码,c#编程中使用WebClient实现不同虚拟目录间的文件上传与保存,并不需要知道两个虚拟目录的物理路径。

c#用WebClient上传文件

需求:
在web应用程序的虚拟目录为WebAA,另一个应用程序的虚拟目录是WebBB,怎么实现WebAA向WebBB下UpLoadFiles文件夹下保存图片?无需知道WebBB/UpLoadFiles的物理路径。

1、在WebBB项目下添加一个UploadHandler.ashx文件

代码:
 

复制代码 代码示例:

public class UploadHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string filename = context.Request.QueryString["filename"].ToString();
using (FileStream inputStram = File.Create(context.Server.MapPath("UpLoadFiles/") + filename))
{
SaveFile(context.Request.InputStream, inputStram);
}

}
protected void SaveFile(Stream stream, FileStream inputStream)
{
int bufSize=1024;
int byteGet=0;
byte[] buf=new byte[bufSize];
while ((byteGet = stream.Read(buf, 0, bufSize)) > 0)
{
inputStream.Write(buf, 0, byteGet);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}

二,得到一个上传路径为http://xxxxxxxx/WebBB/UploadHandler.ashx
在WebAA项目中通过WebClient或者WebRequest请求该url,下面以WebClient为例说明。
在WebAA中新建test.aspx页面,上面有FileUpload控件FileUpload1和Button控件Button1

代码:
 

复制代码 代码示例:

using System.IO;
using System.Net;

MemoryStream ms;
protected void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
{
int bufSize = 10;
int byteGet = 0;
byte[] buf = new byte[bufSize];
while ((byteGet = ms.Read(buf, 0, bufSize)) > 0) //循环读取,上传
{
e.Result.Write(buf, 0, byteGet); //要点
}
e.Result.Close(); //关闭
ms.Close();关闭ms
}
protected void Button1_Click(object sender, EventArgs e)
{
FileUpload fi = FileUpload1;

byte[] bt = fi.FileBytes; //获取文件的Byte[]
ms = new MemoryStream(bt); //用Byte[],实例化ms

UriBuilder url = new UriBuilder("http://xxxxxxxx/WebBB/UploadHandler.ashx"); //上传路径
url.Query = string.Format("filename={0}", Path.GetFileName(fi.FileName)); //上传url参数
WebClient wc = new WebClient();
wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted); //委托异步上传事件
wc.OpenWriteAsync(url.Uri); //开始异步上传
}

总结:
以上实现了WebAA向WebBB目录下上传文件,可根据需要改造成在同一web中上传文件。