利用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, 0, 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传,具体可以通过其传输的类型请参考书籍


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值