All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
利用单元测试在每个层上对PHP代码进行检查_php资料_编程技术
如何在十天学内会php之第四天_php资料_编程技术
asp.net2.0内置Application对象的应用
SEOer如何撰写高质量的优质文章_百度优化_seo学堂
利用PHP代码实现网页自动判断转向的实例_php资料_编程技术
php自动跳转中英文页面_[PHP教程]
SQL高级教程:SQL 撤销索引、表以及数据库_[SQL Server教程]
Web页面的数据导出excel时的格式问题_[Asp.Net教程]
详细学习PHP的日期时间函数date()_php资料_编程技术
delphi弹出菜单组件(TPopMenu)
Reading number is top 10 pictures
男人们都在想什么
The real super beauty12
人造器官和铁肺人
支持判处贩卖儿童者死刑
BingBingFan apple dew point photo gallery5
一万二一支的万珂,用得真心肉疼。
30 beautiful school beauty5
世界五大海盗
Distribution of wealth in China survey status report
水晶头骨造型的酒瓶
Download software ranking
Unix video tutorial14
都市狐狸姑娘传
Photoshop 8.0图象编辑软件
Boxer's Top ten classic battle7
WebService在.NET中的实战应用教学视频 → 第2集
虚拟机5.5.3版
Ashlynn Video3
Ashlynn Video4
电脑知识及技巧大合集
linux高级编程
delv published in(发表于) 2014/1/16 9:34:38 Edit(编辑)
通过Web,Services上传和下载文件_[Asp.Net教程]

通过Web,Services上传和下载文件_[Asp.Net教程]

通过Web Services上传和下载文件_[Asp.Net教程]

随着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:

using System;<br/> using System.Collections;<br/> using System.ComponentModel;<br/> using System.Data;<br/> using System.Diagnostics;<br/> using System.Web;<br/> using System.Web.UI;<br/> using System.Web.Services;<br/> using System.IO;<br/> namespace xml.sz.luohuedu.net.aspxWebCS<br/> {<br/> /// <summary><br/> /// GetBinaryFile 的摘要说明。<br/> /// Web Services名称:GetBinaryFile<br/> /// 功能:返回服务器上的一个文件对象的二进制字节数组。<br/> /// </summary><br/> [WebService(Namespace="http://xml.sz.luohuedu.net/",<br/> Description="在Web Services里利用.NET框架进行传递二进制文件。")]<br/> public class GetBinaryFile : System.Web.Services.WebService<br/> {<br/> #region Component Designer generated code<br/> //Web 服务设计器所必需的<br/> private IContainer components = null;<br/> /// <summary><br/> /// 清理所有正在使用的资源。<br/> /// </summary><br/> protected override void Dispose( bool disposing )<br/> {<br/> if(disposing && components != null)<br/> {<br/> components.Dispose();<br/> }<br/> base.Dispose(disposing);<br/> }<br/> #endregion<br/> public class Images: System.Web.Services.WebService<br/> {<br/> /// <summary><br/> /// Web 服务提供的方法,返回给定文件的字节数组。<br/> /// </summary><br/> [WebMethod(Description="Web 服务提供的方法,返回给定文件的字节数组")]<br/> public byte[] GetImage(string requestFileName)<br/> {<br/> ///得到服务器端的一个图片<br/> ///如果你自己测试,注意修改下面的实际物理路径<br/> if(requestFileName == null || requestFileName == "")<br/> return getBinaryFile("D:\\Picture.JPG");<br/> else<br/> return getBinaryFile("D:\\" + requestFileName);<br/> }<br/> /// <summary><br/> /// getBinaryFile:返回所给文件路径的字节数组。<br/> /// </summary><br/> /// <param name="filename"></param><br/> /// <returns></returns><br/> public byte[] getBinaryFile(string filename)<br/> {<br/> if(File.Exists(filename))<br/> {<br/> try<br/> {<br/> ///打开现有文件以进行读取。<br/> FileStream s = File.OpenRead(filename);<br/> return ConvertStreamToByteBuffer(s);<br/> }<br/> catch(Exception e)<br/> {<br/> return new byte[0];<br/> }<br/> }<br/> else<br/> {<br/> return new byte[0];<br/> }<br/> }<br/> /// <summary><br/> /// ConvertStreamToByteBuffer:把给定的文件流转换为二进制字节数组。<br/> /// </summary><br/> /// <param name="theStream"></param><br/> /// <returns></returns><br/> public byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)<br/> {<br/> int b1;<br/> System.IO.MemoryStream tempStream = new System.IO.MemoryStream();<br/> while((b1=theStream.ReadByte())!=-1)<br/> {<br/> tempStream.WriteByte(((byte)b1));<br/> }<br/> return tempStream.ToArray();<br/> }<br/> [WebMethod(Description="Web 服务提供的方法,返回给定文件类型。")]<br/> public string GetImageType()<br/> {<br/> ///这里只是测试,您可以根据实际的文件类型进行动态输出<br/> return "image/jpg";<br/> }<br/> }<br/> }<br/> }<br/>

一旦我们创建了上面的asmx文件,进行编译后,我们就可以编写客户端的代码来进行调用这个Web Services了。


我们先“添加Web引用”,输入:http://localhost/aspxWebCS/GetBinaryFile.asmx。下面,我们编写显示文件的中间文件:GetBinaryFileShow.aspx,这里,我们只需要在后代码里编写代码即可,GetBinaryFileShow.aspx.cs文件内容如下:

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

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

<%@ Page language="c#" Codebehind="GetBinaryFile.aspx.cs" AutoEventWireup="false"<br/> Inherits="aspxWebCS.GetBinaryFile" %><br/> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><br/> <HTML><br/> <HEAD><br/> <title>通过Web Services显示和下载文件</title><br/> <br/> <br/> <br/> <br/> </HEAD><br/> <body MS_POSITIONING="GridLayout"><br/> <form id="GetBinaryFile" method="post" runat="server"><br/> <FONT face="宋体"><br/> <asp:HyperLink id="HyperLink1" NavigateUrl="GetBinaryFileShow.aspx?Download=1"<br/> runat="server">下载文件</asp:HyperLink><br/> <br/> <br/> <asp:Image id="Image1" ImageUrl="GetBinaryFileShow.aspx" runat="server"></asp:Image><br/> </FONT><br/> </form><br/> </body><br/> </HTML><br/>

二:通过Web Services上载文件


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

using System;<br/> using System.Collections;<br/> using System.ComponentModel;<br/> using System.Data;<br/> using System.Diagnostics;<br/> using System.Web;<br/> using System.Web.Services;<br/> using System.IO;<br/> namespace xml.sz.luohuedu.net.aspxWebCS<br/> {<br/> /// <summary><br/> /// Upload 的摘要说明。<br/> /// </summary><br/> [WebService(Namespace="http://xml.sz.luohuedu.net/",<br/> Description="在Web Services里利用.NET框架进上载文件。")]<br/> public class Upload : System.Web.Services.WebService<br/> {<br/> public Upload()<br/> {<br/> //CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的<br/> InitializeComponent();<br/> }<br/> #region Component Designer generated code<br/> //Web 服务设计器所必需的<br/> private IContainer components = null;<br/> /// <summary><br/> /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br/> /// 此方法的内容。<br/> /// </summary><br/> private void InitializeComponent()<br/> {<br/> }<br/> /// <summary><br/> /// 清理所有正在使用的资源。<br/> /// </summary><br/> protected override void Dispose( bool disposing )<br/> {<br/> if(disposing && components != null)<br/> {<br/> components.Dispose();<br/> }<br/> base.Dispose(disposing);<br/> }<br/> #endregion<br/> [WebMethod(Description="Web 服务提供的方法,返回是否文件上载成功与否。")]<br/> public string UploadFile(byte[] fs,string FileName)<br/> {<br/> try<br/> {<br/> ///定义并实例化一个内存流,以存放提交上来的字节数组。<br/> MemoryStream m = new MemoryStream(fs);<br/> ///定义实际文件对象,保存上载的文件。<br/> FileStream f = new FileStream(Server.MapPath(".") + "\\"<br/> + FileName, FileMode.Create);<br/> ///把内内存里的数据写入物理文件<br/> m.WriteTo(f);<br/> m.Close();<br/> f.Close();<br/> f = null;<br/> m = null;<br/> return "文件已经上传成功。";<br/> }<br/> catch(Exception ex)<br/> {<br/> return ex.Message;<br/> }<br/> }<br/> }<br/> }<br/>

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

<%@ Page language="c#" Codebehind="Upload.aspx.cs" AutoEventWireup="false"<br/> Inherits="aspxWebCS.Upload" %><br/> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><br/> <HTML><br/> <HEAD><br/> <title>通过Web Services上载文件</title><br/> <br/> <br/> <br/> <br/> </HEAD><br/> <body MS_POSITIONING="GridLayout"><br/> <form id="Form1" method="post" runat="server" enctype="multipart/form-data"><br/> <INPUT id="MyFile" type="file" runat="server"><br/> <br/> <br/> <asp:Button id="Button1" runat="server" Text="上载文件"></asp:Button><br/> </form><br/> </body><br/> </HTML><br/>

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

using System;<br/> using System.Collections;<br/> using System.ComponentModel;<br/> using System.Data;<br/> using System.Drawing;<br/> using System.Web;<br/> using System.Web.SessionState;<br/> using System.Web.UI;<br/> using System.Web.UI.WebControls;<br/> using System.Web.UI.HtmlControls;<br/> using System.Web.Services;<br/> using System.IO;<br/> namespace aspxWebCS<br/> {<br/> /// <summary><br/> /// Upload 的摘要说明。<br/> /// 利用该方法通过Web Services上载文件<br/> /// </summary><br/> public class Upload : System.Web.UI.Page<br/> {<br/> protected System.Web.UI.HtmlControls.HtmlInputFile MyFile;<br/> protected System.Web.UI.WebControls.Button Button1;<br/> private void Page_Load(object sender, System.EventArgs e)<br/> {<br/> // 在此处放置用户代码以初始化页面<br/> }<br/> #region Web Form Designer generated code<br/> override protected void OnInit(EventArgs e)<br/> {<br/> //<br/> // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。<br/> //<br/> InitializeComponent();<br/> base.OnInit(e);<br/> }<br/> /// <summary><br/> /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br/> /// 此方法的内容。<br/> /// </summary><br/> private void InitializeComponent()<br/> {<br/> this.Button1.Click += new System.EventHandler(this.Button1_Click);<br/> this.Load += new System.EventHandler(this.Page_Load);<br/> }<br/> #endregion<br/> private void Button1_Click(object sender, System.EventArgs e)<br/> {<br/> ///首先得到上载文件信息和文件流<br/> if(MyFile.PostedFile != null)<br/> {<br/> System.Web.HttpFileCollection oFiles;<br/> oFiles = System.Web.HttpContext.Current.Request.Files;<br/> if(oFiles.Count < 1)<br/> {<br/> Response.Write ("请选择文件。");<br/> Response.End();<br/> }<br/> string FilePath = oFiles[0].FileName;<br/> if(FilePath == "" || FilePath == null)<br/> {<br/> Response.Write ("请选择一个文件。");<br/> Response.End();<br/> }<br/> string FileName = FilePath.Substring(FilePath.LastIndexOf("\\")+1);<br/> try<br/> {<br/> ///处理上载的文件流信息。<br/> byte[] b = new byte[oFiles[0].ContentLength];<br/> System.IO.Stream fs;<br/> xml.sz.luohuedu.net.aspxWebCS.Upload o;<br/> o = new xml.sz.luohuedu.net.aspxWebCS.Upload();<br/> fs = (System.IO.Stream)oFiles[0].InputStream;<br/> fs.Read(b, 0, oFiles[0].ContentLength);<br/> ///调用Web Services的UploadFile方法进行上载文件。<br/> Response.Write(o.UploadFile(b, FileName));<br/> fs.Close();<br/> }<br/> catch(Exception ex)<br/> {<br/> Response.Write(ex.Message);<br/> }<br/> }<br/> else<br/> {<br/> Response.Write("请选择文件");<br/> }<br/>}<br/>}<br/>}<br/>

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

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

其中:maxRequestLength:指示 ASP.NET 支持的HTTP方式上载的最大字节数。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。executionTimeout:指示在被 ASP.NET 自动关闭前,允许执行请求的最大秒数。在当文件超出指定的大小时,如果浏览器中会产生 DNS 错误或者出现服务不可得到的情况,也请修改以上的配置,把配置数加大。


另外,上载大文件时,还可能会收到以下错误信息:

aspnet_wp.exe (PID: 1520) 被回收,因为内存消耗超过了 460 MB(可用 RAM 的百分之 60)。<br/>

如果遇到此错误信息,请增加应用程序的 Web.config 文件的 元素中 memoryLimit 属性的值。例如:

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

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


作者:孟宪会 出自:【孟宪会之精彩世界】







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.