天天看點

ASP.NET跨伺服器上傳檔案的相關解決方案

首先,在另外一台伺服器上設定好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;

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所在伺服器上的檔案的方法

        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.cnblogs.com/zuowj/p/3999798.html  ,如需轉載請自行聯系原作者

繼續閱讀