如何把文件上傳到另外一台服務器【轉】


如何把文件上傳到另外一台服務器【轉】

原文:http://www.cnblogs.com/cnaspnet/archive/2008/09/23/716881.html

 

在程序部署上經常遇到一個問題,為了安全,速度,一般都是把數據庫和程序分開放在不同的服務器.一般對外一台服務器就夠了,其它如果想對外,通過這台對外服務器就可以實現.

剛不久在做一個項目遇到了一個問題,程序所在的服務器空間小,另外購置了一台數據服務器(存儲數據庫及文件).程序里多個地方用到了附件上傳,一般上傳文件都放在程序目錄下.可這次不一樣,要放在另外一台服務器.
開始時我覺得很簡單,只要建立網絡映射不就可以了嗎?只要有足夠的權限,和操作本機盤有什么區別呢?

以前也做過這方面,用的是.net winform匯總excel,當時一點問題都沒有.這次是webform,問題來了,程序根本找不到.
這下好了,想了好多方面還是沒有解決,在網上也沒搜索到,於是在CSDN中發了請求帖,終於解決.
http://community.csdn.net/Expert/topic/5470/5470471.xml?temp=.5512812

摘要如下:

簡單的測試虛擬目錄設置是否正確!
假設A是你web站點的服務器 B是你要上傳文件的服務器
1、在B服務器上共享一個文件夾upload,並設置好權限 開設用戶test 密碼123456 並給予test對upload的寫入權限,同時在該文件夾里放入一個簡單的頁面,隨便什么都行,輸出幾個字母就可以了【B服務器上的操作over】
2、 在A服務器web站點下面建立一個虛擬目錄,默認加虛擬目錄的時候是沒得選擇其他服務器的共享文件夾的,你先隨便選擇一個本地的路徑,建立好之后,點擊該 虛擬目錄的屬性,在更改本地路徑的上面,有3個選擇,你選擇“另一台計算機上的共享”,接着設置網絡路徑,格式是這樣的:\\{服務器}\{共享名}, {服務器}用IP來代替,{共享名}就是那個upload文件夾,填好之后點擊后面的“連接用戶”,輸入剛才在B服務器上用戶test 和密碼 123456(當然,簡單一點,你最好先測試一下,確定A服務器能訪問B服務器共享的文件夾,如果A都不能訪問B的共享,那你先解決這個問題先,測試的方 法很簡單,在瀏覽器里輸入\\B服務器的IP\upload,如果能輸入用戶和密碼之后能看到你剛才隨便建的那個文件,OK,共享是可以訪問的)
3、虛擬目錄設置好了之后,你可以測試一下,在A的web站點下面通過程序獲取一下虛擬目錄的路徑,如果是成功的,路徑應該是服務器B的IP+upload文件夾。
4、 接下來的工作就是上傳文件了,這個時候你直接上傳應該都是可以的,應該你剛才已經輸入過訪問B服務器upload的帳號和密碼,也就是說A和B已經建立了 信任連接,不過如果你重啟服務器,剛才建立的連接也就不存在了。所以在A服務器web站點的Global.asax文件里加載一句話,讓A服務器站點啟動 的時候就和B建立信任連接
System.Diagnostics.Process.Start("net.exe", "use \\\\B服務器的IP\\upload \"123456\" /user:\"test\"");  
上面的語句就是建立信任連接的,放在global.asax的好處就是站點啟動就建立連接,因為這種信任連接是可持續性的,不會象session一樣過期,只有在重啟A服務器的時候這種信任連接才會消失。

不曉得你明白沒有?不過我可以肯定,這個是可以實現的,因為我剛剛做過這塊。
后話:至於上傳到B服務器上的文件怎么訪問,那就比較方便了。
一種方式:還是通過A服務器web站點下面的虛擬目錄來訪問,這種情況下,B服務器只是提供空間
另一種方式:在B服務器上建立一個站點,指向該目錄,這樣B服務器分擔了訪問文件時IIS的工作任務

 

文件上傳保存:
SaveAs(Server.MapPath("abc") + "\\" + filePath.Substring(filePath.LastIndexOf("\\") + 1));
//abc為程序運行站點或者虛擬目錄下的虛擬目錄

文件瀏覽:
DownloadFile(Server.MapPath("abc") + "//abc.txt");
//abc.txt為B服務器上的文件

 

         private   void  DownloadFile( string  physicalFilePath)
        
{
            FileStream stream 
= null;
            
try
            
{
                stream 
= new FileStream(physicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                
int bufSize = (int)stream.Length;
                
byte[] buf = new byte[bufSize];

                
int bytesRead = stream.Read(buf, 0, bufSize);
                HttpContext.Current.Response.ContentType 
= "application/octet-stream";
                
//attachment是以附件的形式下載,也可以改為online在線找開. 
                HttpContext.Current.Response.AppendHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(System.IO.Path.GetFileName(physicalFilePath), System.Text.Encoding.UTF8));
                HttpContext.Current.Response.OutputStream.Write(buf, 
0, bytesRead);
                HttpContext.Current.Response.End();
            }

            
finally
            
{
                stream.Close();
            }

        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM