通过WebService上传和下载文件

前端之家收集整理的这篇文章主要介绍了通过WebService上传和下载文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

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

&amp;lt;%@ Page language="c#" Codebehind="GetBinaryFile.aspx.cs" AutoEventWireup="false" Inherits="aspxWebCS.GetBinaryFile" %&amp;gt; &amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" &amp;gt; &amp;lt;HTML&amp;gt; &amp;lt;HEAD&amp;gt; &amp;lt;title&amp;gt;通过Web Services<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>和下载<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>&amp;lt;/title&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="GENERATOR" Content="Microsoft Visual Stu<a href="/tag/dio/" target="_blank" class="keywords">dio</a> 7.0"&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="CODE_LANGUAGE" Content="C#"&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="vs_defaultClientScript" content="JavaScript"&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"&amp;gt; &amp;lt;/HEAD&amp;gt; &amp;lt;body MS_POSITIONING="GridLayout"&amp;gt; &amp;lt;form id="GetBinaryFile" method="post" runat="server"&amp;gt; &amp;lt;FONT face="宋体"&amp;gt; &amp;lt;asp:HyperLink id="HyperLink1" NavigateUrl="GetBinaryFileShow.aspx?Download=1" runat="server"&amp;gt;下载<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>&amp;lt;/asp:HyperLink&amp;gt; &amp;lt;br/&amp;gt; &amp;lt;!--下面是直接<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>--&amp;gt; &amp;lt;asp:Image id="Image1" ImageUrl="GetBinaryFileShow.aspx" runat="server"&amp;gt;&amp;lt;/asp:Image&amp;gt; &amp;lt;/FONT&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/HTML&amp;gt;

二:通过Web Services上载文件

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

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

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

&amp;lt;%@ Page language="c#" Codebehind="Upload.aspx.cs" AutoEventWireup="false" Inherits="aspxWebCS.Upload" %&amp;gt; &amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&amp;gt; &amp;lt;HTML&amp;gt; &amp;lt;HEAD&amp;gt; &amp;lt;title&amp;gt;通过Web Services上载<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>&amp;lt;/title&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="GENERATOR" content="Microsoft Visual Stu<a href="/tag/dio/" target="_blank" class="keywords">dio</a> .NET 7.0"&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="CODE_LANGUAGE" content="Visual Basic 7.0"&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="vs_defaultClientScript" content="JavaScript"&amp;gt; &amp;lt;<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a> name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"&amp;gt; &amp;lt;/HEAD&amp;gt; &amp;lt;body MS_POSITIONING="GridLayout"&amp;gt; &amp;lt;form id="Form1" method="post" runat="server" enctype="multipart/form-data"&amp;gt; &amp;lt;INPUT id="MyFile" type="file" runat="server"&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;asp:Button id="Button1" runat="server" Text="上载<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>"&amp;gt;&amp;lt;/asp:Button&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/HTML&amp;gt;

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

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

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

&amp;lt;configuration&amp;gt; &amp;lt;system.web&amp;gt; &amp;lt;httpRuntime maxRequestLength="1048576" executionTimeout="3600" /&amp;gt; &amp;lt;/system.web&amp;gt; &amp;lt;/configuration&amp;gt;

其中: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 属性的值。例如:

&amp;lt;configuration&amp;gt; &amp;lt;system.web&amp;gt; &amp;lt;processModel memoryLimit="80"/&amp;gt; &amp;lt;/system.web&amp;gt; &amp;lt;/configuration&amp;gt;

猜你在找的WebService相关文章