假定有兩臺服務器:A和B,其中A爲Web服務器(IP:192.123.1.1, 爲iis發佈程序的服務器 ),B爲文件服務器(IP: 192.123.2.2)html
http://www.cnblogs.com/guangpeng/archive/2013/04/09/3009600.htmlweb
在程序部署上常常遇到一個問題,爲了安全,速度,通常都是把數據庫和程序分開放在不一樣的服務器.通常對外一臺服務器就夠了,其它若是想對外,經過這臺對外服務器就能夠實現.
剛不久在作一個項目遇到了一個問題,程序所在的服務器空間小,另外購置了一臺數據服務器(存儲數據庫及文件).程序裏多個地方用到了附件上傳,通常上傳文件都放在程序目錄下.可此次不同,要放在另一臺服務器.
開始時我以爲很簡單,只要創建網絡映射不就能夠了嗎?只要有足夠的權限,和操做本機盤有什麼區別呢?
之前也作過這方面,用的是.net winform彙總excel,當時一點問題都沒有.此次是webform,問題來了,程序根本找不到.
這下好了,想了好多方面仍是沒有解決,在網上也沒搜索到,因而在CSDN中發了請求帖,終於解決.
http://community.csdn.net/Expert/topic/5470/5470471.xml?temp=.5512812數據庫
摘要以下:瀏覽器
簡單的測試虛擬目錄設置是否正確! 假設A是你web站點的服務器 B是你要上傳文件的服務器 一、在B服務器上共享一個文件夾upload,並設置好權限 開設用戶test 密碼123456 並給予test對upload的寫入權限,同時在該文件夾裏放入一個簡單的頁面,隨便什麼都行,輸出幾個字母就能夠了【B服務器上的操做over】 二、在A服務器web站點下面創建一個虛擬目錄,默認加虛擬目錄的時候是沒得選擇其餘服務器的共享文件夾的,你先隨便選擇一個本地的路徑,創建好以後,點擊該虛擬目錄的屬性,在更改本地路徑的上面,有3個選擇,你選擇「另外一臺計算機上的共享」,接着設置網絡路徑,格式是這樣的:\\{服務器}\{共享名},{服務器}用IP來代替,{共享名}就是那個upload文件夾,填好以後點擊後面的「鏈接用戶」,輸入剛纔在B服務器上用戶test 和密碼123456(固然,簡單一點,你最好先測試一下,肯定A服務器能訪問B服務器共享的文件夾,若是A都不能訪問B的共享,那你先解決這個問題先,測試的方法很簡單,在瀏覽器裏輸入\\B服務器的IP\upload,若是能輸入用戶和密碼以後能看到你剛纔隨便建的那個文件,OK,共享是能夠訪問的) 三、虛擬目錄設置好了以後,你能夠測試一下,在A的web站點下面經過程序獲取一下虛擬目錄的路徑,若是是成功的,路徑應該是服務器B的IP+upload文件夾。 四、接下來的工做就是上傳文件了,這個時候你直接上傳應該都是能夠的,應該你剛纔已經輸入過訪問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(); } }
http://www.cnblogs.com/cnaspnet/archive/2008/09/23/716881.html服務器
本身嘗試操做的:網絡
首先保證內網的網站服務器能訪問到 文件服務器。session
一、在文件服務器上建立用戶 例如:用戶名:UploadUser、 密碼:123456app
二、在文件服務器上建立共享文件夾 例如:Data_qz 同時增長用戶UploadUser對於此文件夾的讀寫權限。測試
三、在網站服務器上建立同名,同密碼的用戶。
四、將網站的IIS從新啓動運行。
注:須要在webconfig文件中的 <appSettings>節點下,建立節點UploadPath。 例如:<add key="UploadPath" value="\\文件服務器IP\共享文件夾\"/>,如:「\\192.168.0.7\Data_qz\」。
webconfig: <add key="UploadPath" value="\\192.xxx.0.x\Data_qz\"/> <add key="UploadUser" value="UploadUser"/> <add key="UploadPwd" value="Aa123456"/>
Global.asax
void Application_Start(object sender, EventArgs e) { // 在應用程序啓動時運行的代碼 System.Diagnostics.Process.Start("net.exe", "use \\"+ConfigurationManager.AppSettings["UploadPath"].Trim() +" \""+ConfigurationManager.AppSettings["UploadPwd"].Trim()+"\" /user:\""+ConfigurationManager.AppSettings["UploadUser"].Trim()+"\""); }
頁面上傳代碼: //本地上傳 f_upload.SaveAs(Request.MapPath("../Data/Appraise") + @"\" + announceDoc.FileUrl.Trim()); //異地上傳
f_upload.SaveAs(ConfigurationManager.AppSettings["UploadPath"].Trim() + @"Data\\Appraise\\" + announceDoc.FileUrl.Trim());
//前臺控件
<asp:FileUpload runat="server" ID="f_upload" /> 頁面上傳代碼: //本地上傳 f_upload.SaveAs(Request.MapPath("../Data/Appraise") + @"\" + announceDoc.FileUrl.Trim()); //異地上傳 f_upload.SaveAs(ConfigurationManager.AppSettings["UploadPath"].Trim() + @"Data\\Appraise\\" + announceDoc.FileUrl.Trim());