当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net Web Services上传和下载文件(完整代码)

ASP.NET
AspNetPager与Socut.Data使用方法
asp.net UpdaeProgress的简单用法
asp.net ajaxControlToolkit ValidatorCalloutExtender的简单用法
asp.net 简易生成注册码(数字+大小写字母)
asp.net中利用ashx实现图片防盗链代码
ASP.NET程序中常用代码汇总
ASP.NET 2.0/3.5中直接操作Gridview控件插入新记录
ASP.NET Ajax级联DropDownList实现代码
ASP.NET 2.0写无限级下拉菜单
asp.net Web Services上传和下载文件(完整代码)
asp.net DataGrid控件中弹出详细信息窗口
Asp.NET 多层登陆实现代码
利用Asp.Net回调机制实现进度条
ASP.NET Ref和Out关键字区别分析
Javascript调用Webservice的多种方法
.Net下的签名与混淆图文分析
.Net Compact Framework开发小技巧 推荐
.Net连接Oracle数据库的实现代码
js获取.aspx页面里面的服务器控件和.ascx中的服务器控件值
asp.net下 jquery jason 高效传输数据

ASP.NET 中的 asp.net Web Services上传和下载文件(完整代码)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-11   浏览: 187 ::
收藏到网摘: n/a

随着Internet技术的发展和跨平台需求的日益增加,Web Services的应用越来越广,我们不但需要通过Web Services传递字符串信息,而且需要传递二进制文件信息。 下面,我们就分别介绍如何通过Web Services从服务器下载文件到客户端和从客户端通过Web Services上载文件到服务器。
一:通过Web Services显示和下载文件
我们这里建立的Web Services的名称为GetBinaryFile,提供两个公共方法:分别是GetImage()和GetImageType(),前者返回二进制文件字节数组,后者返回文件类型,其中,GetImage()方法有一个参数,用来在客户端选择要显示或下载的文件名字。这里我们所显示和下载的文件可以不在虚拟目录下,采用这个方法的好处是:可以根据权限对文件进行显示和下载控制,从下面的方法我们可以看出,实际的文件位置并没有在虚拟目录下,因此可以更好地对文件进行权限控制,这在对安全性有比较高的情况下特别有用。这个功能在以前的ASP程序中可以用Stream对象实现。为了方便读者进行测试,这里列出了全部的源代码,并在源代码里进行介绍和注释。
首先,建立GetBinaryFile.asmx文件:
我们可以在VS.NET里新建一个C#的aspxWebCS工程,然后“添加新项”,选择“Web服务”,并设定文件名为:GetBinaryFile.asmx,在“查看代码”中输入以下代码,即:GetBinaryFile.asmx.cs:
复制代码 代码如下:
一旦我们创建了上面的asmx文件,进行编译后,我们就可以编写客户端的代码来进行调用这个Web Services了。
我们先“添加Web引用”,输入:http://localhost/aspxWebCS/GetBinaryFile.asmx。下面,我们编写显示文件的中间文件:GetBinaryFileShow.aspx,这里,我们只需要在后代码里编写代码即可,GetBinaryFileShow.aspx.cs文件内容如下:
复制代码 代码如下:

usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Web;
usingSystem.Web.SessionState;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.Services;
namespaceaspxWebCS
{
///<summary>
///GetBinaryFileShow的摘要说明。
///</summary>
publicclassGetBinaryFileShow:System.Web.UI.Page
{
privatevoidPage_Load(objectsender,System.EventArgse)
{
//在此处放置用户代码以初始化页面
///定义并初始化文件对象;
xml.sz.luohuedu.net.aspxWebCS.GetBinaryFile.ImagesoImage;
oImage=newxml.sz.luohuedu.net.aspxWebCS.GetBinaryFile.Images();
///得到二进制文件字节数组;
byte[]image=oImage.GetImage("");
///转换为支持存储区为内存的流
System.IO.MemoryStreammemStream=newSystem.IO.MemoryStream(image);
///定义并实例化Bitmap对象
Bitmapbm=newBitmap(memStream);
///根据不同的条件进行输出或者下载;
Response.Clear();
///如果请求字符串指定下载,就下载该文件;
///否则,就显示在浏览器中。
if(Request.QueryString["Download"]=="1")
{
Response.Buffer=true;
Response.ContentType="application/octet-stream";
///这里下载输出的文件名字ok.jpg为例子,你实际中可以根据情况动态决定。
Response.AddHeader("Content-Disposition","/upload/tech/20091011/20091011144010_51d92be1c60d1db1d2e5e7a07da55b26.jpg");
}
else
{
Response.ContentType=oImage.GetImageType();
Response.BinaryWrite(image);
Response.End();
}
}
#regionWebFormDesignergeneratedcode
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.Load+=newSystem.EventHandler(this.Page_Load);
}
#endregion
}
}

最后,我们就编写最终的浏览页面:GetBinaryFile.aspx,这个文件很简单,只需要aspx文件即可,内容如下:
复制代码 代码如下:

<%@Pagelanguage="c#"Codebehind="GetBinaryFile.aspx.cs"AutoEventWireup="false"Inherits="aspxWebCS.GetBinaryFile"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<title>通过WebServices显示和下载文件</title>
<metanamemetaname="GENERATOR"Content="MicrosoftVisualStudio7.0">
<metanamemetaname="CODE_LANGUAGE"Content="C#">
<metanamemetaname="vs_defaultClientScript"content="JavaScript">
<metanamemetaname="vs_targetSchema"content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<bodyMS_POSITIONINGbodyMS_POSITIONING="GridLayout">
<formidformid="GetBinaryFile"method="post"runat="server">
<FONTfaceFONTface="宋体">
<asp:HyperLinkidasp:HyperLinkid="HyperLink1"NavigateUrl="GetBinaryFileShow.aspx?Download=1"
runat="server">下载文件</asp:HyperLink>
<br/>
<!--下面是直接显示文件-->
<asp:Imageidasp:Imageid="Image1"ImageUrl="GetBinaryFileShow.aspx"runat="server"></asp:Image>
</FONT>
</form>
</body>
</HTML>

二:通过Web Services上载文件
向服务器上载文件可能有许多种方法,在利用Web Services上载文件的方法中,下面的这个方法应该是最简单的了。我们仍象前面的例子那样,首先建立Upload.asmx文件,其Upload.asmx.cs内容如下,里面已经做了注释:
复制代码 代码如下:

usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Diagnostics;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.IO;
namespacexml.sz.luohuedu.net.aspxWebCS
{
///<summary>
///Upload的摘要说明。
///</summary>
[WebService(Namespace="http://xml.sz.luohuedu.net/",
Description="在WebServices里利用.NET框架进上载文件。")]
publicclassUpload:System.Web.Services.WebService
{
publicUpload()
{
//CODEGEN:该调用是ASP.NETWeb服务设计器所必需的
InitializeComponent();
}
#regionComponentDesignergeneratedcode
//Web服务设计器所必需的
privateIContainercomponents=null;
///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
}
///<summary>
///清理所有正在使用的资源。
///</summary>
protectedoverridevoidDispose(booldisposing)
{
if(disposing&&components!=null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
[WebMethod(Description="Web服务提供的方法,返回是否文件上载成功与否。")]
publicstringUploadFile(byte[]fs,stringFileName)
{
try
{
///定义并实例化一个内存流,以存放提交上来的字节数组。
MemoryStreamm=newMemoryStream(fs);
///定义实际文件对象,保存上载的文件。
FileStreamf=newFileStream(Server.MapPath(".")+"\\"
+FileName,FileMode.Create);
///把内内存里的数据写入物理文件
m.WriteTo(f);
m.Close();
f.Close();
f=null;
m=null;
return"文件已经上传成功。";
}
catch(Exceptionex)
{
returnex.Message;
}
}
}
}

要上载文件,必须提供一个表单,来供用户进行文件的选择,下面我们就建立这样一个页面Upload.aspx,用来提供文件上载:
复制代码 代码如下:

<%@Pagelanguage="c#" Codebehind="Upload.aspx.cs" AutoEventWireup="false" Inherits="aspxWebCS.Upload"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<title>通过WebServices上载文件</title>
<metanamemetaname="GENERATOR"content="MicrosoftVisualStudio.NET7.0">
<metanamemetaname="CODE_LANGUAGE"content="VisualBasic7.0">
<metanamemetaname="vs_defaultClientScript"content="JavaScript">
<metanamemetaname="vs_targetSchema"content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<bodyMS_POSITIONINGbodyMS_POSITIONING="GridLayout">
<formidformid="Form1"method="post"runat="server"enctype="multipart/form-data">
<INPUTidINPUTid="MyFile"type="file"runat="server">
<br>
<br>
<asp:Buttonidasp:Buttonid="Button1"runat="server"Text="上载文件"></asp:Button>
</form>
</body>
</HTML>

我们要进行处理的是在后代码里面,下面详细的介绍,Upload.aspx.cs:.
复制代码 代码如下:

usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Web;
usingSystem.Web.SessionState;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.Services;
usingSystem.IO;
namespaceaspxWebCS
{
///<summary>
///Upload的摘要说明。
///利用该方法通过WebServices上载文件
///</summary>
publicclassUpload:System.Web.UI.Page
{
protectedSystem.Web.UI.HtmlControls.HtmlInputFileMyFile;
protectedSystem.Web.UI.WebControls.ButtonButton1;
privatevoidPage_Load(objectsender,System.EventArgse)
{
//在此处放置用户代码以初始化页面
}
#regionWebFormDesignergeneratedcode
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.Button1.Click+=newSystem.EventHandler(this.Button1_Click);
this.Load+=newSystem.EventHandler(this.Page_Load);
}
#endregion
privatevoidButton1_Click(objectsender,System.EventArgse)
{
///首先得到上载文件信息和文件流
if(MyFile.PostedFile!=null)
{
System.Web.HttpFileCollectionoFiles;
oFiles=System.Web.HttpContext.Current.Request.Files;
if(oFiles.Count<1)
{
Response.Write("请选择文件。");
Response.End();
}
stringFilePath=oFiles[0].FileName;
if(FilePath==""||FilePath==null)
{
Response.Write("请选择一个文件。");
Response.End();
}
stringFileName=FilePath.Substring(FilePath.LastIndexOf("\\")+1);
try
{
///处理上载的文件流信息。
byte[]b=newbyte[oFiles[0].ContentLength];
System.IO.Streamfs;
xml.sz.luohuedu.net.aspxWebCS.Uploado;
o=newxml.sz.luohuedu.net.aspxWebCS.Upload();
fs=(System.IO.Stream)oFiles[0].InputStream;
fs.Read(b,0,oFiles[0].ContentLength);
///调用WebServices的UploadFile方法进行上载文件。
Response.Write(o.UploadFile(b,FileName));
fs.Close();
}
catch(Exceptionex)
{
Response.Write(ex.Message);
}
}
else
{
Response.Write("请选择文件");
}
}
}
}

最后,需要注意的是:在保存文件时,您应该确保指定文件的完整路径(例如,"/upload/tech/20091011/20091011144014_92cc227532d17e56e07902b254dfad10.jpg"),并确保为 ASP.NET 使用的帐户提供要存储文件的目录的写权限。上载大文件时,可使用 元素的 maxRequestLength 属性来增加文件大小的最大允许值,例如:
复制代码 代码如下:

<configuration>
<system.web>
<httpRuntime maxRequestLength="1048576" executionTimeout="3600" />
</system.web>
</configuration>

其中:maxRequestLength:指示 ASP.NET 支持的HTTP方式上载的最大字节数。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。executionTimeout:指示在被 ASP.NET 自动关闭前,允许执行请求的最大秒数。在当文件超出指定的大小时,如果浏览器中会产生 DNS 错误或者出现服务不可得到的情况,也请修改以上的配置,把配置数加大。
另外,上载大文件时,还可能会收到以下错误信息:
aspnet_wp.exe (PID: 1520) 被回收,因为内存消耗超过了 460 MB(可用 RAM 的百分之 60)。
如果遇到此错误信息,请增加应用程序的 Web.config 文件的 元素中 memoryLimit 属性的值。例如:
复制代码 代码如下:

<configuration>
<system.web>
<processModel memoryLimit="80"/>
</system.web>
</configuration>

我在自己的机器上测试,可以上传50M以上的文件。以上代码在Windows XP + .NET 1.0 + VS.NET2002下测试通过。