區域網內基於WEB的檔案傳輸解決方案詳解 (轉)

amyz發表於2007-08-15
區域網內基於WEB的檔案傳輸解決方案詳解 (轉)[@more@]

作者:tonny
E:master@weiw.com">webmaster@weiw.com
轉載請顯示出處:

環境說明:

內的兩臺,一臺當作主WEB伺服器,一臺作伺服器,
兩伺服器操作為 professional(或win2000 server)
主WEB伺服器 區域網內部URL:  外部URL
 伺服器名為:main  WEB站點的埠為8080

檔案伺服器 區域網內部URL:
 伺服器計算機名為:file  WEB站點的埠為8080


需求介紹:
訪問者訪問WEB伺服器,檔案時將檔案放於檔案伺服器,如生成一些資訊之類的靜態頁面,也在檔案伺服器上生成。WEB伺服器並不保留檔案副本。並且允許生成X格式的檔案。


解決方法:
檔案伺服器IIS設定站點。,設一目錄用於存放上傳檔案,命名為UpFile。
並且把當前目錄屬性--&gt--&gt中加入一預留給專供上傳的域賬號,許可權當然是完全控制。

在WEB伺服器上,根目錄下原先有Upfile目錄。現將此目錄從IIS中刪除,然後在IIS中建立一虛擬目錄,名為Upfile,目標指向檔案伺服器上的Upfile目錄。當然還是要加上可寫可讀的許可權。

將檔案上傳至檔案伺服器的例子:
test.cs (執行於Web伺服器上的程式)
using System.Text;

string virtualPath="test01"; //欲建立在upfile目錄下的資料夾名稱;
string UpfilePath = @""; //檔案伺服器 (非本程式執行的伺服器)
string uriString = rootUpfilePath + virtualPath +"/"; //URL路徑

//CreateDirectory. 此檔案用於在目的伺服器(檔案伺服器)上Upfile目錄下,用於建立相應目錄。
string path = rootUpfilePath + "CreateDirectory.aspx?Path="+virtualPath;

string filename="test.htm"; //此為生成的檔名

string MyString = "這是建立的檔案內容" ;
UTF8Encoding AE = new UTF8Encoding();

byte[] input = AE.GetBytes(MyString);
int  intLength=input.Length;

string username = @"ain_acqweb"; //“域名稱域使用者名稱”
string pass = @"123456"; //域使用者密碼

System.NetworkCredential myCred = new System.Net.NetworkCredential(username, password);
//為基於密碼的身份驗證方案提供憑據
System.Net.WebClient Client = new System.Net.WebClient();
//提供向 URI 標識的資源傳送資料和從 URI 標識的資源接收資料的公共方法
System.Net.CredentialCache myCache = new System.Net.CredentialCache();
// Internet 資源的憑據
myCache.Add(new Uri(uriString), "NTLM", myCred);
//向憑據快取新增 NetworkCredential 例項

byte[] buffer = new byte[128];

Stream stream = Client.OpenRead(path);
stream.Read(buffer, 0, 128); // 建立目錄

System.IO.Stream writeStream = Client.OpenWrite(uriString + filename  ,"PUT");
writeStream.Write (input, 0, intLength);
writeStream.Close();


檔案伺服器 上的檔案CreateDirectory.aspx
" %>

 


 CreateDirectory
 
 
 
 ">
 
 
 
 
 
 

 System.IO.Directory.CreateDirectory(Server.MapPath(path));
%>

 


二、將aspx檔案生成至檔案伺服器的程式例子:
思路:直接透過http方式傳輸,檔案伺服器端會提示禁止訪問。因為安全問題,伺服器對ASPX,asp等檔案的有限制。限制是在.net 中做的,相關檔案是, machine.config。如果修改此檔案即可解決問題。我曾就此問題諮詢過微技術支援,回覆是,修改後會帶來其他安全問題,所以最好還不改這個。暫且也就只好用改副檔名的方式。傳之前,將副檔名改為html,到觸發檔案伺服器端程式,將副檔名改回aspx。由於在處理時,檔案編碼為強制改為UTF-8.會出現中文亂碼。所以還要把編碼改為ANSI。
///


/// 在Web目錄基礎下建立資料夾
///

/// 目錄路徑,如圖片庫為UpFiles/PhotoLib/
/// 返回是否成功新建目錄
public static bool CreateNewFolderBaseWeb(string path)
{
 string rootUpfilePath = Com.Common.SzcmConfiguration.FileWeb; ";
 string uriString = rootUpfilePath + path;
 path = rootUpfilePath + "CreateDirectory.aspx?Path=" + path;
 string username = Com.Common.SzcmConfiguration.UploadFileUser; ";
 string password = Com.Common.SzcmConfiguration.UploadFilePassword; ";
 System.Net.NetworkCredential myCred = new System.Net.NetworkCredential(username, password);
 System.Net.WebClient Client = new System.Net.WebClient();
 System.Net.CredentialCache myCache = new System.Net.CredentialCache();
 // myCache.Add(new Uri(this.Page.Application["__FSPATH__"].ToString()),"NTLM",myCred);
 myCache.Add(new Uri(uriString), "NTLM", myCred);
 // Client.Credentials = myCache;
 // 建立目錄
 //byte[] buffer = new byte[128];
 Stream stream = Client.OpenRead(path);
 //stream.Read(buffer, 0, 128);
}

///


/// 在Web目錄基礎下建立文字檔案
///

/// 指定的檔案(如WebOut/Article/1/20021022093422.html)
/// 文字檔案的內容
/// 返回是否成功建立檔案
public static bool CreateTxtFileBaseWeb(string fileSpec, string content)
{
 string path;
 try
 {
 fileSpec = fileSpec.Replace("aspx","html"); //先把副檔名由aspx改為html
 string virtualPath = fileSpec.Substring(0,fileSpec.LastIndexOf("/"));
 string rootUpfilePath = Com.Common.SzcmConfiguration.UploadFileWeb; ";
 string uriString = rootUpfilePath + virtualPath + "/"; //"upfiles/";
 //在檔案伺服器上把生成的html副檔名改為aspx
 path = rootUpfilePath + "ReNameFile.aspx?Path="+fileSpec;

 System.Text.UTF8Encoding AE = new System.Text.UTF8Encoding();
 byte[] input = AE.GetBytes(content);
 //byte[] input = System.Text.Encoding.GetEncoding("UTF8").GetBytes(content);
 int  intLength=input.Length;
 string username = Com.Common.SzcmConfiguration.UploadFileUser; ";
 string password = Com.Common.SzcmConfiguration.UploadFilePassword; ";
 System.Net.NetworkCredential myCred = new System.Net.NetworkCredential(username, password);
 System.Net.WebClient Client = new System.Net.WebClient();

 System.IO.Stream writeStream = Client.OpenWrite(rootUpfilePath + fileSpec  ,"PUT");
 
 //System.IO.Stream writeStream = Client.OpenWrite(rootUpfilePath + "upfiles/tt.txt"  ,"PUT");
 writeStream.Write(input, 0, intLength); 
 writeStream.Close();
 Stream stream = Client.OpenRead(path); //在觸發檔案伺服器端的改名程式。
 return true;
 }
 catch (Exception ex )
 {
 throw ex;
 return false;
 }
}


檔案伺服器 上的檔案ReNameFile.aspx


 


 ReNameFile
 
 
 
 
 
 
 

 
 

 

 System.IO.FileInfo fi = new System.IO.FileInfo(Server.MapPath(path));

 string content;
 System.IO.StreamReader oRead = fi.OpenText();
 content = oRead.ReadToEnd();
 oRead.Close();
 System.IO.FileStream fileStream = new System.IO.FileStream( Server.MapPath(path), System.IO.FileMode.Create );
 System.IO.StreamWriter streamWriter = new System.IO.StreamWriter( fileStream ,System.Text.Encoding.Default );
 streamWriter.Write( content );
 streamWriter.Close();
 if (path.IndexOf("html")>0)
 {
 path = path.Replace("html","aspx");
 fi.MoveTo(Server.MapPath(path));
 }
%>


注意:此時,如果仍出現錯誤,提示無許可權,可能是WEB伺服器的存放臨時檔案處的許可權問題。還要設定一下Framework.
C:WINNTMicrosoft.NETFrameworkv1.0.3705Temporary Files
把此目錄許可權開放給everyone
再檢查一下machine.config中節名為processModel的userName屬性值是否為"本機名aspnet"

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958707/,如需轉載,請註明出處,否則將追究法律責任。

相關文章