加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

利用WebService实现远程服务器文件的上传和下载

发布时间:2020-12-17 01:13:33 所属栏目:安全 来源:网络整理
导读:有时候我们通常需要把上传的图片或其他文件放在其他服务器上,以便和网站服务器分开,这时候ASP.NET的WebService就派上大用场了。我们可以在文件服务器上运行一个WebService,提供上传和下载文件的方法,然后在网站服务器上的网站中引用这个WebService,调用

有时候我们通常需要把上传的图片或其他文件放在其他服务器上,以便和网站服务器分开,这时候ASP.NET的WebService就派上大用场了。我们可以在文件服务器上运行一个WebService,提供上传和下载文件的方法,然后在网站服务器上的网站中引用这个WebService,调用上传或下载的方法,实现对远程服务器上的文件上传和下载的功能。以下操作在VS2005环境中完成。
????? 先新建一个WebService项目UpDownFile,里面自动建了一个叫Service1的asmx和cs文件,看不顺眼这个名字的就把它重命名吧,我就把它重命名为了UpDownFile.asmx,把里面的class也重命名为UpDownFile了,这样看起来顺眼多了


UpDownFile.asmx.cs的代码如下:

using System;

using System.Data;

using System.Web;

using System.Collections;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.ComponentModel;

using System.IO;


namespace UpDownFile

{

/**//// <summary>

/// UpDownFile 的摘要说明

/// </summary>

??? [WebService(Namespace = "http://tempuri.org/")]

??? [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

??? [ToolboxItem(false)]

public class UpDownFile : System.Web.Services.WebService

{

//将Stream流转换为byte数组的方法。

//PS:原本想把这个方法也当做WebMethod的,因为客户端在上传文件时也要调用该方法,后来发现Stream类型的不能通过WebService传输。。。:(

public byte[] ConvertStreamToByteBuffer(Stream s)

{

??????????? MemoryStream ms = new MemoryStream();

int b;

while ((b = s.ReadByte()) != -1)

{

??????????????? ms.WriteByte((byte)b);

??????????? }

return ms.ToArray();

??????? }


//上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中

??????? [WebMethod]

public bool Up(byte[] data,string filename)

{

try

{

??????????????? FileStream fs = File.Create(Server.MapPath("File/") + filename);

??????????????? fs.Write(data,data.Length);

??????????????? fs.Close();

return true;

??????????? }

catch

{

return false;

??????????? }

??????? }


//下载WebService所在服务器上的文件的方法

??????? [WebMethod]

public byte[] Down(string filename)

{

string filepath = Server.MapPath("File/") + filename;

if (File.Exists(filepath))

{

try

{

??????????????????? FileStream s = File.OpenRead(filepath);

return ConvertStreamToByteBuffer(s);

??????????????? }

catch

{

return new byte[0];

??????????????? }

??????????? }

else

{

return new byte[0];

??????????? }

??????? }

??? }

}

接下来就是在客户端网站中调用了,先添加Web引用,干脆引用名也用UpDownFile算了

,首先是DownFile.aspx

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.IO;


namespace HelloWorld

{

public partial class DownFile : System.Web.UI.Page

{

protected void Page_Load(object sender,EventArgs e)

{

??????????? UpDownFile.UpDownFile down = new UpDownFile.UpDownFile();

byte[] file = down.Down(Request.QueryString["filename"].ToString());

??????????? Response.BinaryWrite(file);

??????? }

??? }

}

接下来是上传的演示文件UpFile.aspx

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.IO;


namespace HelloWorld

{

public partial class UpFile : System.Web.UI.Page

{

protected void Page_Load(object sender,EventArgs e)

{


??????? }


protected void Button1_Click(object sender,EventArgs e)

{

//保存到远程File文件夹

//FileUpload1是aspx页面的一个FileUpload控件

??????????? UpDownFile.UpDownFile up = new UpDownFile.UpDownFile();

??????????? up.Up(ConvertStreamToByteBuffer(FileUpload1.PostedFile.InputStream),FileUpload1.PostedFile.FileName.Substring(FileUpload1.PostedFile.FileName.LastIndexOf("") + 1));

??????? }


protected byte[] ConvertStreamToByteBuffer(Stream s)

{

??????????? MemoryStream ms = new MemoryStream();

int b;

while ((b = s.ReadByte()) != -1)

{

??????????????? ms.WriteByte((byte)b);

??????????? }

return ms.ToArray();

??????? }

??? }

}

其实主要是UpDownFile.asmx.cs这个Web服务文件,客户端怎么调用就随便了。大家看到了,Up和Down方法中传输的都是byte[]数组,因为WebService不支持Stream传输,那就把文件转换为二进制数组来传递。 ????? 此外也可以制作利用WebService远程存储数据库的东西,因为有时候远程服务器的1433端口不能开放,只能开放80,那WebService就派上用场了。要注意的是,DataTable不能通过WebService传输,只能附在DataSet上来传输,此外很多类型也不可以通过WebService传,具体可以通过其传输的类型请参考书籍

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读