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

 更新时间:2008年12月19日 12:40:45   作者:  
随着Internet技术的发展和跨平台需求的日益增加,Web Services的应用越来越广,我们不但需要通过Web Services传递字符串信息,而且需要传递二进制文件信息。

一旦我们创建了上面的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","attachment;filename=ok.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("请选择文件");
}
}
}
}

最后,需要注意的是:在保存文件时,您应该确保指定文件的完整路径(例如,"C:\MyFiles\Picture.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下测试通过。

相关文章

最新评论