一:通过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文件内容如下:
-
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
- {
-
-
-
- public class GetBinaryFileShow : System.Web.UI.Page
- {
-
- private void Page_Load(object sender, System.EventArgs e)
- {
-
-
- xml.sz.luohuedu.net.aspxWebCS.GetBinaryFile.Images oImage;
- oImage = new xml.sz.luohuedu.net.aspxWebCS.GetBinaryFile.Images();
-
- byte[] image = oImage.GetImage("");
-
- System.IO.MemoryStream memStream = new System.IO.MemoryStream(image);
-
- Bitmap bm = new Bitmap(memStream);
-
- Response.Clear();
-
-
- if(Request.QueryString["Download"]=="1")
- {
- Response.Buffer = true;
- Response.ContentType = "application/octet-stream";
-
- 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)
- {
-
-
-
- InitializeComponent();
- base.OnInit(e);
- }
-
-
-
-
-
- private void InitializeComponent()
- {
- this.Load += new System.EventHandler(this.Page_Load);
-
- }
- #endregion
- }
- }
-
最后,我们就编写最终的浏览页面:GetBinaryFile.aspx,这个文件很简单,只需要aspx文件即可,内容如下:
- <%@ Page language="c#" Codebehind="GetBinaryFile.aspx.cs" AutoEventWireup="false"
- Inherits="aspxWebCS.GetBinaryFile" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
- <HTML>
- <HEAD>
- <title>通过Web Services显示和下载文件</title>
- <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
- <meta name="CODE_LANGUAGE" Content="C#">
- <meta name="vs_defaultClientScript" content="JavaScript">
- <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
- </HEAD>
- <body MS_POSITIONING="GridLayout">
- <form id="GetBinaryFile" method="post" runat="server">
- <FONT face="宋体">
- <asp:HyperLink id="HyperLink1" NavigateUrl="GetBinaryFileShow.aspx?Download=1"
- runat="server">下载文件</asp:HyperLink>
- <br/>
- <!--下面是直接显示文件-->
- <asp:Image id="Image1" ImageUrl="GetBinaryFileShow.aspx" runat="server"></asp:Image>
- </FONT>
- </form>
- </body>
- </HTML>
-
二:通过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
- {
-
-
-
- [WebService(Namespace="http://xml.sz.luohuedu.net/",
- Description="在Web Services里利用.NET框架进上载文件。")]
- public class Upload : System.Web.Services.WebService
- {
- public Upload()
- {
-
- InitializeComponent();
- }
-
- #region Component Designer generated code
-
-
- private IContainer components = null;
-
-
-
-
-
- private void InitializeComponent()
- {
- }
-
-
-
-
- protected override void Dispose( bool disposing )
- {
- if(disposing && components != null)
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #endregion
-
- [WebMethod(Description="Web 服务提供的方法,返回是否文件上载成功与否。")]
- public string UploadFile(byte[] fs,string FileName)
- {
- try
- {
-
- MemoryStream m = new MemoryStream(fs);
-
- FileStream f = new FileStream(Server.MapPath(".") + "\\"
- + FileName, FileMode.Create);
-
- m.WriteTo(f);
- m.Close();
- f.Close();
- f = null;
- m = null;
- return "文件已经上传成功。";
- }
- catch(Exception ex)
- {
- return ex.Message;
- }
- }
- }
- }
-
要上载文件,必须提供一个表单,来供用户进行文件的选择,下面我们就建立这样一个页面Upload.aspx,用来提供文件上载:
- <%@ Page language="c#" Codebehind="Upload.aspx.cs" AutoEventWireup="false"
- Inherits="aspxWebCS.Upload" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <title>通过Web Services上载文件</title>
- <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.0">
- <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
- <meta name="vs_defaultClientScript" content="JavaScript">
- <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
- </HEAD>
- <body MS_POSITIONING="GridLayout">
- <form id="Form1" method="post" runat="server" enctype="multipart/form-data">
- <INPUT id="MyFile" type="file" runat="server">
- <br>
- <br>
- <asp:Button id="Button1" runat="server" Text="上载文件"></asp:Button>
- </form>
- </body>
- </HTML>
-
我们要进行处理的是在后代码里面,下面详细的介绍,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
- {
-
-
-
-
- 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)
- {
-
- }
-
- #region Web Form Designer generated code
- override protected void OnInit(EventArgs e)
- {
-
-
-
- InitializeComponent();
- base.OnInit(e);
- }
-
-
-
-
-
- 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)
- {
-
- if(MyFile.PostedFile != null)
- {
- System.Web.HttpFileCollection oFiles;
- oFiles = System.Web.HttpContext.Current.Request.Files;
- if(oFiles.Count < 1)
- {
- Response.Write ("请选择文件。");
- Response.End();
- }
-
- string FilePath = oFiles[0].FileName;
- if(FilePath == "" || FilePath == null)
- {
- Response.Write ("请选择一个文件。");
- Response.End();
- }
- string FileName = FilePath.Substring(FilePath.LastIndexOf("\\")+1);
- try
- {
-
- 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, 0, oFiles[0].ContentLength);
-
- Response.Write(o.UploadFile(b, FileName));
- fs.Close();
- }
- catch(Exception ex)
- {
- Response.Write(ex.Message);
- }
- }
- else
- {
- Response.Write("请选择文件");
- }
- }
- }
- }
-
最后,需要注意的是:在保存文件时,您应该确保指定文件的完整路径(例如,"C:\MyFiles\Picture.jpg"),并确保为 ASP.NET 使用的帐户提供要存储文件的目录的写权限。上载大文件时,可使用 元素的 maxRequestLength 属性来增加文件大小的最大允许值,例如:
其中: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 属性的值。例如:
我做了一个例子:
/Files/liuhaitao/WebServiceDownloadFile.rar
|
请发表评论