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

ASP.NET
asp.net Execl的添加,更新操作实现代码
asp.net 生成曲线图实现代码
从外部的js文件中获取ASPX页面的控件ClientID
asp.net 因为数据库正在使用的解决方法
asp.net Repeater 自递增
asp.net 实现防迅雷等下载工具盗链
ASP.NET封装的SQL数据库访问类
asp.net 通过指定IP地址得到当前的网络上的主机的域名
aspx 服务器架设问题解决
ASP.NET Session使用详解
Asp.net 5种页面转向方法
ASP.NET 用户多次登录的解决方法
ASP.NET下母版页和内容页中的事件发生顺序整理
asp.net 程序性能优化的七个方面 (c#(或vb.net)程序改进)
从客户端检测到有潜在危险的Request.Form值的asp.net代码
asp.net CommunityServer中的wwwStatus
在应用程序级别之外使用注册为allowDefinition=''MachineToApplication''的节是错误的
.net开发人员常犯的错误分析小结
ASP.net Substitution 页面缓存而部分不缓存的实现方法
asp.net 生成静态时的过滤viewstate的实现方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-11   浏览: 264 ::
收藏到网摘: 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下测试通过。