問:一般一個網站程序發佈在一個iis服務器上,可是若是要分佈式部署網站。文件系統該如何存儲呢?html
答:一般的就是給網站文件系統一個子域名。好比 https://images.web.com. 網站程序內部經過代碼調用ftp服務器-每次用戶上傳文件直接上傳到相應imags域名對應的目錄。web
問:若是網站的圖片,文件部署在子域名 網站該如何調用呢? 服務器
答:在視圖模板裏面 直接讀取配置的images 域名 程序以下。。。分佈式
public class AppConfig { /// <summary> /// 上傳文件存放文件夾 /// </summary> public static string FileSaveBasePath = ConfigurationManager.AppSettings["FileSaveBasePath"].ToString(); /// <summary> /// ftpip /// </summary> public static string FtpServerIP = ConfigurationManager.AppSettings["FtpServerIP"].ToString(); /// <summary> /// ftp登錄名 /// </summary> public static string FtpUserId = ConfigurationManager.AppSettings["FtpUserId"].ToString(); /// <summary> /// ftp登錄密碼 /// </summary> public static string FtpPassword = ConfigurationManager.AppSettings["FtpPassword"].ToString(); /// <summary> /// ftp上html的基礎路徑 /// </summary> public static string FtpHtmlBasePath = ConfigurationManager.AppSettings["FtpHtmlBasePath"].ToString(); /// <summary> /// ftp上file的基礎路徑 /// </summary> public static string FtpFileBasePath = ConfigurationManager.AppSettings["FtpFileBasePath"].ToString(); /// <summary> /// 是否須要ftp上傳 /// </summary> public static bool FtpUpload { get { bool flag = false; if (bool.TryParse(ConfigurationManager.AppSettings["FtpUpload"].ToString(), out flag)) return flag; else return false; } } }
/// <summary> /// 建立圖片文件 /// </summary> /// <param name="btImage">圖片二進制字符串</param> /// <param name="imageName">文件相對路徑+文件名</param> /// <returns></returns> public bool CreateFileImage(byte[] image, string readPath) { if (image == null) return false; try { bool flag = true; string errorinfo = string.Empty; isCreateDir(path + readPath); System.IO.File.WriteAllBytes(path + readPath, image); Loger.Info(string.Format("方法名:{0},建立圖片文件成功,文件路徑:{1}", "CreateFileImage", path + readPath)); //ftp上傳操做 flag = FtpUpload(path + readPath, readPath, AppConfig.FtpFileBasePath, out errorinfo); return flag; } catch (Exception ex) { Loger.Info(string.Format("方法名:{0},建立圖片文件失敗!", "CreateFileImage")); Loger.Error(ex); return false; } }
public bool FtpUpload(string fileLocalPath, string filePath, string fileFtpPath, out string errorInfo) { bool flag = true; errorInfo = string.Empty; if (AppConfig.FtpUpload) { FtpHelper ftp = new FtpHelper(); ftp.FtpUpDown(AppConfig.FtpServerIP, AppConfig.FtpUserId, AppConfig.FtpPassword); string directory = FileHelper.GetFileDirectory(filePath);//獲取該文件的文件路徑結構 if (!string.IsNullOrEmpty(directory) && directory != "/" && directory != "\\") { //ftp.MakeDir(fileFtpPath + directory); directory = directory.TrimStart('/').TrimEnd('/'); string[] dirs = directory.Split('/'); string ftpCreateDir = fileFtpPath; //建立ftp目錄,目前只能一級一級建立 for (int i = 0; i < dirs.Length; i++) { ftpCreateDir += "/" + dirs[i] + "/"; ftp.MakeDir(ftpCreateDir); } } flag = ftp.Upload(fileLocalPath, fileFtpPath + filePath, out errorInfo); if (flag) Loger.Info(string.Format("上傳ftp文件成功,文件路徑:{0},{1}", fileFtpPath + filePath, errorInfo)); else Loger.Warn(string.Format("上傳ftp文件失敗,文件路徑:{0},{1}", fileFtpPath + filePath, errorInfo)); } return flag; }
public class FtpHelper { string ftpServerIP; string ftpUserID; string ftpPassword; FtpWebRequest reqFTP; //public void Connecttest(string ftpServerIP, string ftpUserID, string ftpPassword) //{ // // 根據uri建立FtpWebRequest對象 // reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP)); // // 指定數據傳輸類型 // reqFTP.UseBinary = true; // // ftp用戶名和密碼 // reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); //} #region 鏈接 /// <summary> /// 鏈接 /// </summary> /// <param name="path"></param> private void Connect(String path)//鏈接ftp { // 根據uri建立FtpWebRequest對象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); // 指定數據傳輸類型 reqFTP.UseBinary = true; // ftp用戶名和密碼 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } #endregion #region ftp登陸信息 /// <summary> /// ftp登陸信息 /// </summary> /// <param name="ftpServerIP">ftpServerIP</param> /// <param name="ftpUserID">ftpUserID</param> /// <param name="ftpPassword">ftpPassword</param> public void FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword) { this.ftpServerIP = ftpServerIP; this.ftpUserID = ftpUserID; this.ftpPassword = ftpPassword; } #endregion #region 獲取文件列表 /// <summary> /// 獲取文件列表 /// </summary> /// <param name="path"></param> /// <param name="WRMethods"></param> /// <returns></returns> private string[] GetFileList(string path, string WRMethods)//上面的代碼示例瞭如何從ftp服務器上得到文件列表 { string[] downloadFiles; StringBuilder result = new StringBuilder(); try { Connect(path); reqFTP.Method = WRMethods; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);//中文文件名 string line = reader.ReadLine(); while (line != null) { result.Append(line); result.Append("\n"); line = reader.ReadLine(); } // to remove the trailing '\n' int lastIndex = result.ToString().LastIndexOf('\n'); if (lastIndex > -1) result.Remove(lastIndex, 1); reader.Close(); response.Close(); return result.ToString().Split('\n'); } catch (Exception ex) { //System.Windows.Forms.MessageBox.Show(ex.Message); Loger.Error(ex); downloadFiles = null; return downloadFiles; } } public string[] GetFileList(string path)//上面的代碼示例瞭如何從ftp服務器上得到文件列表 { return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory); } public string[] GetFileList()//上面的代碼示例瞭如何從ftp服務器上得到文件列表 { return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory); } #endregion #region 上傳文件 /// <summary> /// 上傳文件 /// </summary> /// <param name="filename"></param> public bool Upload(string filename, string path, out string errorinfo) //上面的代碼實現了從ftp服務器上載文件的功能 { path = path.Replace("\\", "/"); FileInfo fileInf = new FileInfo(filename); string a = fileInf.Directory.Name; string uri = "ftp://" + ftpServerIP + "/" + path; Connect(uri);//鏈接 // 默認爲true,鏈接不會被關閉 // 在一個命令以後被執行 reqFTP.KeepAlive = false; // 指定執行什麼命令 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 上傳文件時通知服務器文件的大小 reqFTP.ContentLength = fileInf.Length; // 緩衝大小設置爲kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打開一個文件流(System.IO.FileStream) 去讀上傳的文件 FileStream fs = fileInf.OpenRead(); try { // 把上傳的文件寫入流 Stream strm = reqFTP.GetRequestStream(); // 每次讀文件流的kb contentLen = fs.Read(buff, 0, buffLength); // 流內容沒有結束 while (contentLen != 0) { // 把內容從file stream 寫入upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // 關閉兩個流 strm.Close(); fs.Close(); errorinfo = "完成"; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},沒法完成上傳", ex.Message); return false; } } #endregion #region 續傳文件 /// <summary> /// 續傳文件 /// </summary> /// <param name="filename"></param> public bool Upload(string filename, long size, string path, out string errorinfo) //上面的代碼實現了從ftp服務器上載文件的功能 { path = path.Replace("\\", "/"); FileInfo fileInf = new FileInfo(filename); //string uri = "ftp://" + path + "/" + fileInf.Name; string uri = "ftp://" + path; Connect(uri);//鏈接 // 默認爲true,鏈接不會被關閉 // 在一個命令以後被執行 reqFTP.KeepAlive = false; // 指定執行什麼命令 reqFTP.Method = WebRequestMethods.Ftp.AppendFile; // 上傳文件時通知服務器文件的大小 reqFTP.ContentLength = fileInf.Length; // 緩衝大小設置爲kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打開一個文件流(System.IO.FileStream) 去讀上傳的文件 FileStream fs = fileInf.OpenRead(); try { StreamReader dsad = new StreamReader(fs); fs.Seek(size, SeekOrigin.Begin); // 把上傳的文件寫入流 Stream strm = reqFTP.GetRequestStream(); // 每次讀文件流的kb contentLen = fs.Read(buff, 0, buffLength); // 流內容沒有結束 while (contentLen != 0) { // 把內容從file stream 寫入upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // 關閉兩個流 strm.Close(); fs.Close(); errorinfo = "完成"; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},沒法完成上傳", ex.Message); return false; } } #endregion #region 下載文件 /// <summary> /// 下載文件 /// </summary> /// <param name="filePath"></param> /// <param name="fileName"></param> /// <param name="errorinfo"></param> /// <returns></returns> public bool Download(string ftpfilepath, string filePath, string fileName, out string errorinfo)////上面的代碼實現了從ftp服務器下載文件的功能 { try { filePath = filePath.Replace("個人電腦\\", ""); String onlyFileName = Path.GetFileName(fileName); string newFileName = filePath + onlyFileName; if (File.Exists(newFileName)) { errorinfo = string.Format("本地文件{0}已存在,沒法下載", newFileName); return false; } ftpfilepath = ftpfilepath.Replace("\\", "/"); string url = "ftp://" + ftpfilepath; Connect(url);//鏈接 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); FileStream outputStream = new FileStream(newFileName, FileMode.Create); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); errorinfo = ""; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},沒法下載", ex.Message); return false; } } #endregion #region 刪除文件 /// <summary> /// 刪除文件 /// </summary> /// <param name="fileName"></param> public void DeleteFileName(string fileName) { try { FileInfo fileInf = new FileInfo(fileName); string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; Connect(uri);//鏈接 // 默認爲true,鏈接不會被關閉 // 在一個命令以後被執行 reqFTP.KeepAlive = false; // 指定執行什麼命令 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { //MessageBox.Show(ex.Message, "刪除錯誤"); } } #endregion #region 在ftp上建立目錄 /// <summary> /// 在ftp上建立目錄 /// </summary> /// <param name="dirName"></param> public void MakeDir(string dirName) { try { string uri = "ftp://" + ftpServerIP +"/" + dirName; Connect(uri);//鏈接 reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { //不輸出異常,目前ftp只支持多級目錄的一層層建立 //Loger.Debug(ex); } } #endregion #region 刪除ftp上目錄 /// <summary> /// 刪除ftp上目錄 /// </summary> /// <param name="dirName"></param> public void delDir(string dirName) { try { string uri = "ftp://" + ftpServerIP + "/" + dirName; Connect(uri);//鏈接 reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } } #endregion #region 得到ftp上文件大小 /// <summary> /// 得到ftp上文件大小 /// </summary> /// <param name="filename"></param> /// <returns></returns> public long GetFileSize(string filename) { long fileSize = 0; filename = filename.Replace("\\", "/"); try { // FileInfo fileInf = new FileInfo(filename); //string uri1 = "ftp://" + ftpServerIP + "/" + fileInf.Name; // string uri = filename; string uri = "ftp://" + filename; Connect(uri);//鏈接 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); fileSize = response.ContentLength; response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } return fileSize; } #endregion #region ftp上文件更名 /// <summary> /// ftp上文件更名 /// </summary> /// <param name="currentFilename"></param> /// <param name="newFilename"></param> public void Rename(string currentFilename, string newFilename) { try { FileInfo fileInf = new FileInfo(currentFilename); string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; Connect(uri);//鏈接 reqFTP.Method = WebRequestMethods.Ftp.Rename; reqFTP.RenameTo = newFilename; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); //Stream ftpStream = response.GetResponseStream(); //ftpStream.Close(); response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } } #endregion #region 得到文件明晰 /// <summary> /// 得到文件明晰 /// </summary> /// <returns></returns> public string[] GetFilesDetailList() { return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails); } /// <summary> /// 得到文件明晰 /// </summary> /// <param name="path"></param> /// <returns></returns> public string[] GetFilesDetailList(string path) { path = path.Replace("\\", "/"); return GetFileList("ftp://" + path, WebRequestMethods.Ftp.ListDirectoryDetails); } #endregion }
在webconfig裏面 直接配置以下就能使用了。。直接源碼提供。。O(∩_∩)O哈哈~網站
<add key="FileSaveBasePath" value="D:\web\Content" /> <add key="FtpUpload" value="false"/> <add key="FtpServerIP" value="127.0.0.1"/> <add key="FtpUserId" value="settingftp"/> <add key="FtpPassword" value="/psw"/> <add key="FtpHtmlBasePath" value=""/> <add key="FtpFileBasePath" value="test"/>