利用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传,具体可以通过其传输的类型请参考书籍。我想远程上下传文件和远程存取数据库是WebService最主要的应用吧?

分类:  ASP.NET
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2013/04/26/3045090.html ,如需转载请自行联系原作者
相关文章
|
1月前
|
存储 弹性计算 数据可视化
要将ECS中的文件直接传输到阿里云网盘与相册(
【2月更文挑战第31天】要将ECS中的文件直接传输到阿里云网盘与相册(
417 4
|
2月前
|
数据可视化 Shell Linux
shell+crontab+gitlab实现ecs服务器文件的web展示
本文通过把ecs服务器上的文件定时上传至gitlab,实现文件的页面可视化和修改历史。技术点:shell、crontab、gitlab。
51 3
|
1月前
|
缓存 网络协议 数据可视化
WinSCP下载安装并实现远程SSH本地服务器上传文件
WinSCP下载安装并实现远程SSH本地服务器上传文件
|
3月前
|
弹性计算 数据可视化 安全
云服务器ECS里文件的URL,如何查到呢?
云服务器ECS里文件的URL,如何查到呢?
52 0
|
4月前
|
JSON JavaScript 数据格式
Node.js实现服务器端生成Excel文件(xls格式、xlsx格式文件)并弹出下载文件
Node.js实现服务器端生成Excel文件(xls格式、xlsx格式文件)并弹出下载文件
|
3月前
|
Apache 项目管理 数据安全/隐私保护
【cpolar】TortoiseSVN如何安装并实现公网提交文件到本地SVN服务器
【cpolar】TortoiseSVN如何安装并实现公网提交文件到本地SVN服务器
46 0
|
1月前
|
Linux 网络安全 Python
如何在服务器上运行python文件
如何在服务器上运行python文件
|
30天前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
1月前
|
数据可视化 网络安全 Windows
下载安装MobaXterm并链接服务器的操作方法
【2月更文挑战第13天】本文介绍在Windows电脑中,下载、配置MobaXterm软件,从而连接、操作远程服务器的方法~
下载安装MobaXterm并链接服务器的操作方法
|
2月前
|
Java
java上传、下载、预览、删除ftp服务器上的文件
java上传、下载、预览、删除ftp服务器上的文件