zoukankan      html  css  js  c++  java
  • 利用WebService实现远程服务器文件的上传和下载(转)

    利用Webservice上传文件,在前台服务器上部署一个上传服务,可以通过URL来访问并经过身份验证后上传文件,并返回访问文件的绝对地址,存入数据库(前台后台公用)中,前台读出来显示用户下载就行了。

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

    (原文:http://www.cnblogs.com/lazyman/articles/1583153.html

    有时候我们通常需要把上传的图片或其他文件放在其他服务器上,以便和网站服务器分开,这时候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传,具体可以通过其传输的类型请参考书籍

  • 相关阅读:
    wav格式
    python字符串操作
    云中Active Directory是如何工作的?
    Azure Active Directory中的特权身份管理如何运作?
    工作组下的共享设置
    重新审视虚拟桌面存储
    NAND
    如何使用PowerShell管理Windows服务
    如何应对云爆发架构?四种方法替你解忧
    配置网络策略中的 NAP 条件
  • 原文地址:https://www.cnblogs.com/cc415/p/2294523.html
Copyright © 2011-2022 走看看