web前端

位置:IT落伍者 >> web前端 >> 浏览文章

如何通过Web Services上传和下载文件


发布日期:2022年12月24日
 
如何通过Web Services上传和下载文件

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

runat=server>runat=server>下载文件

收藏地址:进入讨论组讨论

using System;

using SystemCollections;

using SystemComponentModel;

using SystemData;

using SystemDiagnostics;

using SystemWeb;

using SystemWebServices;

using SystemIO;

namespace aspxWebCS

{

///

/// Upload 的摘要说明

///

[WebService(Namespace=

Description=在Web Services里利用NET框架进上载文件)]

public class Upload : SystemWebServicesWebService

{

public Upload()

{

//CODEGEN该调用是 ASPNETWeb 服务设计器所必需的

InitializeComponent();

}

#region Component Designer generated code

//Web 服务设计器所必需的

private IContainer components = null;

///

/// 设计器支持所需的方法 不要使用代码编辑器修改

/// 此方法的内容

///

private void InitializeComponent()

{

}

///

/// 清理所有正在使用的资源

///

protected override void Dispose( bool disposing )

{

if(disposing &&components != null)

{

componentsDispose();

}

baseDispose(disposing);

}

#endregion

[WebMethod(Description=Web 服务提供的方法返回是否文件上载成功与否)]

public string UploadFile(byte[] fsstring FileName)

{

try

{

///定义并实例化一个内存流以存放提交上来的字节数组

MemoryStream m = new MemoryStream(fs);

///定义实际文件对象保存上载的文件

FileStream f = new FileStream(ServerMapPath() + \

+ FileName FileModeCreate);

///把内内存里的数据写入物理文件

mWriteTo(f);

mClose();

fClose();

f = null;

m = null;

return 文件已经上传成功;

}

catch(Exception ex)

{

return exMessage;

}

}

}

}

using System;

using SystemCollections;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemWeb;

using SystemWebSessionState;

using SystemWebUI;

using SystemWebUIWebControls;

using SystemWebUIHtmlControls;

using SystemWebServices;

using SystemIO;

namespace aspxWebCS

{

///

/// Upload 的摘要说明

/// 利用该方法通过Web Services上载文件

///

public class Upload : SystemWebUIPage

{

protected SystemWebUIHtmlControlsHtmlInputFile MyFile;

protected SystemWebUIWebControlsButton Button;

private void Page_Load(object sender SystemEventArgs e)

{

// 在此处放置用户代码以初始化页面

}

#region Web Form Designer generated code

override protected void OnInit(EventArgs e)

{

//

// CODEGEN该调用是 ASPNETWeb 窗体设计器所必需的

//

InitializeComponent();

baseOnInit(e);

}

///

/// 设计器支持所需的方法 不要使用代码编辑器修改

/// 此方法的内容

///

private void InitializeComponent()

{

thisButtonClick += new SystemEventHandler(thisButton_Click);

thisLoad += new SystemEventHandler(thisPage_Load);

}

#endregion

private void Button_Click(object sender SystemEventArgs e)

{

///首先得到上载文件信息和文件流

if(MyFilePostedFile != null)

{

SystemWebHttpFileCollection oFiles;

oFiles = SystemWebHttpContextCurrentRequestFiles;

if(oFilesCount <)

{

ResponseWrite (请选择文件);

ResponseEnd();

}

string FilePath = oFiles[]FileName;

if(FilePath == || FilePath == null)

{

ResponseWrite (请选择一个文件);

ResponseEnd();

}

string FileName = FilePathSubstring(FilePathLastIndexOf(\)+);

try

{

///处理上载的文件流信息

byte[] b = new byte[oFiles[]ContentLength];

SystemIOStream fs;

aspxWebCSUpload o;

o = new aspxWebCSUpload();

fs = (SystemIOStream)oFiles[]InputStream;

fsRead(b oFiles[]ContentLength);

///调用Web Services的UploadFile方法进行上载文件

ResponseWrite(oUploadFile(b FileName));

fsClose();

}

catch(Exception ex)

{

ResponseWrite(exMessage);

}

}

else

{

ResponseWrite(请选择文件);

}

}

}

}

最后需要注意的是在保存文件时您应该确保指定文件的完整路径(例如C:MyFilesPicturejpg并确保为 ASPNET使用的帐户提供要存储文件的目录的写权限上载大文件时可使用 元素的 maxRequestLength 属性来增加文件大小的最大允许值其中maxRequestLength指示 ASPNET 支持的HTTP方式上载的最大字节数该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击指定的大小以 KB 为单位默认值为 KB ( MB)executionTimeout指示在被 ASPNET 自动关闭前允许执行请求的最大秒数在当文件超出指定的大小时如果浏览器中会产生 DNS错误或者出现服务不可得到的情况也请修改以上的配置把配置数加大

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

aspnet_wpexe (PID: ) 被回收因为内存消耗超过了 MB(可用 RAM 的百分之

如果遇到此错误信息请增加应用程序的 nfig 文件的 元素中 memoryLimit 属性的值

我在自己的机器上测试可以上传M以上的文件

               

上一篇:动态IP的Web service调用

下一篇:使用WebService进行异步通信