随着Internet技术的发展和跨平台需求的日益增加Web Services的应用越来越广我们不但需要通过Web Services传递字符串信息而且需要传递二进制文件信息下面我们就分别介绍如何通过Web Services从服务器下载文件到客户端和从客户端通过Web Services上载文件到服务器
一通过Web Services显示和下载文件
我们这里建立的Web Services的名称为GetBinaryFile提供两个公共方法分别是GetImage()和GetImageType()前者返回二进制文件字节数组后者返回文件类型其中GetImage()方法有一个参数用来在客户端选择要显示或下载的文件名字这里我们所显示和下载的文件可以不在虚拟目录下采用这个方法的好处是可以根据权限对文件进行显示和下载控制从下面的方法我们可以看出实际的文件位置并没有在虚拟目录下因此可以更好地对文件进行权限控制这在对安全性有比较高的情况下特别有用这个功能在以前的ASP程序中可以用Stream对象实现为了方便读者进行测试这里列出了全部的源代码并在源代码里进行介绍和注释
首先建立GetBinaryFileasmx文件
我们可以在VSNET里新建一个C#的aspxWebCS工程然后添加新项选择Web服务并设定文件名为GetBinaryFileasmx在查看代码中输入以下代码即GetBinaryFileasmxcs
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDiagnostics;
using SystemWeb;
using SystemWebUI;
using SystemWebServices;
using SystemIO;
namespace aspxWebCS
{
///
/// GetBinaryFile 的摘要说明
/// Web Services名称GetBinaryFile
/// 功能返回服务器上的一个文件对象的二进制字节数组
///
[WebService(Namespace=
Description=在Web Services里利用NET框架进行传递二进制文件)]
public class GetBinaryFile : SystemWebServicesWebService
{
#region Component Designer generated code
//Web 服务设计器所必需的
private IContainer components = null;
///
/// 清理所有正在使用的资源
///
protected override void Dispose( bool disposing )
{
if(disposing &&components != null)
{
componentsDispose();
}
baseDispose(disposing);
}
#endregion
public class Images: SystemWebServicesWebService
{
///
/// Web 服务提供的方法返回给定文件的字节数组
///
[WebMethod(Description=Web 服务提供的方法返回给定文件的字节数组)]
public byte[] GetImage(string requestFileName)
{
///得到服务器端的一个图片
///如果你自己测试注意修改下面的实际物理路径
if(requestFileName == null || requestFileName == )
return getBinaryFile(D:\PictureJPG);
else
return getBinaryFile(D:\ + requestFileName);
}
///
/// getBinaryFile返回所给文件路径的字节数组
///
///
public byte[] getBinaryFile(string filename)
{
if(FileExists(filename))
{
try
{
///打开现有文件以进行读取
FileStream s = FileOpenRead(filename);
return ConvertStreamToByteBuffer(s);
}
catch(Exception e)
{
return new byte[];
}
}
else
{
return new byte[];
}
}
///
/// ConvertStreamToByteBuffer把给定的文件流转换为二进制字节数组
///
///
public byte[] ConvertStreamToByteBuffer(SystemIOStream theStream)
{
int b;
SystemIOMemoryStream tempStream = new SystemIOMemoryStream();
while((b=theStreamReadByte())!=)
{
tempStreamWriteByte(((byte)b));
}
return tempStreamToArray();
}
[WebMethod(Description=Web 服务提供的方法返回给定文件类型)]
public string GetImageType()
{
///这里只是测试您可以根据实际的文件类型进行动态输出
return image/jpg;
}
}
}
}
观看地址 进入讨论组讨论
一旦我们创建了上面的asmx文件进行编译后我们就可以编写客户端的代码来进行调用这个Web Services了
我们先添加Web引用输入下面我们编写显示文件的中间文件GetBinaryFileShowaspx这里我们只需要在后代码里编写代码即可GetBinaryFileShowaspxcs文件内容如下
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
using SystemWebServices;
namespace aspxWebCS
{
///
/// GetBinaryFileShow 的摘要说明
///
public class GetBinaryFileShow : SystemWebUIPage
{
private void Page_Load(object sender SystemEventArgs e)
{
// 在此处放置用户代码以初始化页面
///定义并初始化文件对象
aspxWebCSGetBinaryFileImages oImage;
oImage = new aspxWebCSGetBinaryFileImages();
///得到二进制文件字节数组
byte[] image = oImageGetImage();
///转换为支持存储区为内存的流
SystemIOMemoryStream memStream = new SystemIOMemoryStream(image);
///定义并实例化Bitmap对象
Bitmap bm = new Bitmap(memStream);
///根据不同的条件进行输出或者下载
ResponseClear();
///如果请求字符串指定下载就下载该文件
///否则就显示在浏览器中
if(RequestQueryString[Download]==)
{
ResponseBuffer = true;
ResponseContentType = application/octetstream;
///这里下载输出的文件名字 okjpg 为例子你实际中可以根据情况动态决定
ResponseAddHeader(ContentDispositionattachment;filename=okjpg);
}
else
ResponseContentType = oImageGetImageType();
ResponseBinaryWrite(image);
ResponseEnd();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN该调用是 ASPNETWeb 窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
///
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
///
private void InitializeComponent()
{
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
}
}
最后我们就编写最终的浏览页面GetBinaryFileaspx这个文件很简单只需要aspx文件即可内容如下
<%@ Page language="c#" Codebehind="GetBinaryFile.aspx.cs" AutoEventWireup="false"
Inherits="aspxWebCS.GetBinaryFile" %>Inherits=aspxWebCSGetBinaryFile %>