ASP.NET跨服务器上传文件的相关解决方案_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > ASP.NET跨服务器上传文件的相关解决方案

ASP.NET跨服务器上传文件的相关解决方案

 2014/9/29 13:05:11  梦在旅途  程序员俱乐部  我要评论(0)
  • 摘要:第一种:通过FTP来上传文件首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台FTP服务器上了。代码如下:<%@PageLanguage="C#"EnableViewState="false"%><%@ImportNamespace="System.Net"%><%@ImportNamespace="System.IO"%><!DOCTYPEhtmlPUBLIC"
  • 标签:.net ASP.NET 解决方案 解决 上传 文件 net 服务器 服务 上传文件

class="post_body_title">第一种:通过FTP来上传文件

首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了。代码如下:

<%@ Page Language="C#" EnableViewState="false"%>

<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  protected void Button1_Click(object sender, EventArgs e)
  {
    //要接收文件的 ftp 服务器地址
    String serverUri = "ftp://192.168.3.1/";
    String fileName = Path.GetFileName(FileUpload1.FileName);
    serverUri += fileName;

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Method = WebRequestMethods.Ftp.AppendFile;
request.UseBinary = true;
request.UsePassive = true;

// ftp 服务器上允许上传的用户名和密码
request.Credentials = new NetworkCredential("upload", "upload");
Stream requestStream = request.GetRequestStream();
Byte[] buffer = FileUpload1.FileBytes;

requestStream.Write(buffer, 0, buffer.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Label1.Text = response.StatusDescription;
response.Close();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>将文件上传到另外一个服务器的方法二</title>
</head>
<body>
<form id="form1" runat="server">
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上传文件" />
<div><asp:Label ID="Label1" runat="server" Text=""></asp:Label></div>
</form>
</body>
</html> 

第二种:通过WebClient来上传文件

如:现在的开发的web应用程序的虚拟目录是WebAA,另一个应用程序的虚拟目录是WebBB,现在要从WebAA向WebBB下的一个UpLoadFiles文件夹下保存图片

1.在WebBB项目下添加一个UploadHandler.ashx文件,代码如下:

public class UploadHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string filename = context.Request.QueryString["filename"].ToString();
        using (FileStream inputStram = File.Create(context.Server.MapPath("UpLoadFiles/") + filename))
        {
            SaveFile(context.Request.InputStream, inputStram);
        }

    }
    protected void SaveFile(Stream stream, FileStream inputStream)
    {
int bufSize=1024;
int byteGet=0;
byte[] buf=new byte[bufSize];
while ((byteGet = stream.Read(buf, 0, bufSize)) > 0)
{
inputStream.Write(buf, 0, byteGet);
}
}
public bool IsReusable
{
get
{
return false;
}
}

2.在WebAA项目中通过WebClient或者WebRequest请求该url,下面以WebClient为例说明。 在WebAA中新建test.aspx页面,上面有FileUpload控件FileUpload1和Button控件Button1,具体事件代码如下:

using System.IO; using System.Net;   MemoryStream ms; protected void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) {     int bufSize = 10;     int byteGet = 0;     byte[] buf = new byte[bufSize];     while ((byteGet = ms.Read(buf, 0, bufSize)) > 0)//循环读取,上传     {         e.Result.Write(buf, 0, byteGet);//注意这里     }     e.Result.Close();//关闭     ms.Close();关闭ms } protected void Button1_Click(object sender, EventArgs e) {     FileUpload fi = FileUpload1;       byte[] bt = fi.FileBytes;//获取文件的Byte[]     ms = new MemoryStream(bt);//用Byte[],实例化ms       UriBuilder url = new UriBuilder("http://xxxxxxxx/WebBB/UploadHandler.ashx");//上传路径     url.Query = string.Format("filename={0}", Path.GetFileName(fi.FileName));//上传url参数     WebClient wc = new WebClient();     wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);//委托异步上传事件     wc.OpenWriteAsync(url.Uri);//开始异步上传 }

第三种:通过Web Service来上传文件(与第二种其实原理有些相同)

1.首先定义Web Service类,代码如下:

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     {         //上传文件至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];             }         }     } }

2.在网站中引用上述创建的WEB服务,命名为(UpDownFile,可自行定义),然后在页面DownFile.aspx中分别实现文件上传与下载:

上传:  

            //FileUpload1是aspx页面的一个FileUpload控件
            UpDownFile.UpDownFile up = new UpDownFile.UpDownFile();
            up.Up(ConvertStreamToByteBuffer(FileUpload1.PostedFile.InputStream),
            FileUpload1.PostedFile.FileName.Substring(FileUpload1.PostedFile.FileName.LastIndexOf("\\") + 1));

下载:
            UpDownFile.UpDownFile down = new UpDownFile.UpDownFile();
            byte[] file = down.Down(Request.QueryString["filename"].ToString()); //filename是要下载的文件路径,可自行以其它方式获取文件路径
            Response.BinaryWrite(file);

以下是将文件流转换成文件字节的函数(因为Stream类型的是不能直接通过WebService传输):

 protected byte[] ConvertStreamToByteBuffer(Stream s)  {     BinaryReader br = new BinaryReader(stream);     byte[] fileBytes = br.ReadBytes((int)stream.Length);     return fileBytes; }

第四种:通过页面跳转或嵌套页面的方式(这种方法很简单,严格不算跨服务器,且有一定的局限性)

实现方法:

1.在需要上传文件的页面加入iframe,iframe的地址指向另一个服务器上传页面,并且页面需包含上传按钮;
2.需要上传时就利用JS的location.href或服务端的Response.redirect跳转至另一个服务器上传页面;

方法其实还有多很,这里就不一一例举,当然上述方法只是实现上传与下载功能,有时可能还需考虑跨服务器删除文件,这个可能需要考虑安全等方面的问题。

同步发表于我的个人网站:http://www.zuowenjun.cn/post/2014/09/29/44.html

上一篇: EF Code First之困扰 下一篇: 没有下一篇了!
发表评论
用户名: 匿名