一、初始化上傳控件。
1、我們這里用dropzone.js作為上傳控件,下載地址http://www.dropzonejs.com/
2、這里我們使用一個div元素作為dropzone載體。
<div class="tray-bin ml10 mr10" style="min-height: 250px;"> <h5 class="text-muted mt10 fw600"> <i class="fa fa-exclamation-circle text-info fa-lg"></i> 上傳外部文件 </h5> <div class="dropzone dropzone-sm" id="dropZone"> <div class="fallback"> <input name="file" type="file" multiple /> </div> </div> </div>
3、這里我們使用Dropzone 附帶的 jQuery 插件創建dropzone,(示例僅作參考,如果想實現自己想要的功能還需要參照官方給出的文檔進行修改)。
function InitDropzone() { //Dropzone的初始化,dropZone為div的id $("#dropZone").dropzone({ //指明了文件提交到哪個頁面。 url: "/Job/Exercise/Upload", //相當於<input>元素的name屬性,默認為file。 paramName: "file", //最大文件大小,單位是 MB。 maxFilesize: 1024, //默認為null,可以指定為一個數值,限制最多文件數量。 maxFiles: 1, //默認false。如果設為true,則會給文件添加一個刪除鏈接 addRemoveLinks: true, //指明允許上傳的文件類型,格式是逗號分隔的 MIME type 或者擴展名。例如:image/*,application/pdf,.psd,.obj acceptedFiles: ".sdb,.srk", //指明是否允許 Dropzone 一次提交多個文件。默認為false。如果設為true,則相當於 HTML 表單添加multiple屬性。 uploadMultiple: false, //如果設定,則會作為額外的 header 信息發送到服務器。例如:{"custom-header": "value"} //headers:{"custom-header": "value"}, //關閉自動上傳功能,默認會true會自動上傳,也就是添加一張圖片向服務器發送一次請求 autoProcessQueue: true, //沒有任何文件被添加的時候的提示文本 dictDefaultMessage: '<i class="fa fa-cloud-upload"></i> \ <span class="main-text"><b>點擊選擇題庫文件</b></span> <br /> \ <span class="sub-text">或將文件拖動到這里,單次最多上傳1個文件</span> \ ', //文件類型被拒絕時的提示文本 dictInvalidInputType: "", //文件大小過大時的提示文本。 dictFileTooBig: "文件過大({{filesize}}MB). 上傳文件最大支持: {{maxFilesize}}MB.", //取消上傳鏈接的文本 dictCancelUpload: "取消上傳", //取消上傳確認信息的文本。 dictCancelUploadConfirmation: "你確定要取消上傳嗎?", //移除文件鏈接的文本。 dictRemoveFile: "移除文件", //超過最大文件數量的提示文本。 dictMaxFilesExceeded: "您一次最多只能上傳{{maxFiles}}個文件", //如果該文件與文件類型不匹配所示的錯誤消息 dictInvalidFileType: "請上傳題庫文件", //如果服務器響應無效時的錯誤消息。{{statusCode}}將被替換的服務器狀態代碼 dictResponseError: '文件上傳失敗!', //一個函數,在 Dropzone 初始化的時候調用,可以用來添加自己的事件監聽器。 init: function () { //當一個文件被添加到列表中 this.on("addedfile", function (file) { }); //從列表中刪除一個文件。你可以監聽該事件然后從您的服務器刪除文件 this.on("removedfile", function (file) { if (file.fileName == undefined) { return; } var url = "/Job/Exercise/DeleteFile"; window.setTimeout(function () { var postData = { fileName: file.fileName } AjaxJson(url, postData, function (data) { //alertDialog(data.Message, 1); }); }, 500); }); //當文件的數量達到maxFiles限制時調用 this.on("maxfilesreached", function (file) { }); //由於文件數量達到 maxFiles 限制數量被拒絕時調用 this.on("maxfilesexceeded", function (file) { this.removeFile(file); }); //當上傳隊列中的所有文件上傳完成時調用 this.on("queuecomplete", function (file) { }); //文件已經成功上傳觸發。file為第一個參數,獲取服務器響應作為第二個參數。(這一事件在finished之前觸發。 this.on("success", function (file, response) { file.fileName = response.FileName; if (response.Result) { $("#FileName").val(response.FileName); $("#FilePath").val(response.FilePath); $("#FileSize").val(response.FileSize); } else { alertDialog(response.Message, -1); this.removeFile(file); } }); //發生一個錯誤。接收errorMessage作為第二個參數,如果錯誤是由於XMLHttpRequest xhr對象為第三個參數。 this.on("error", function (file, errorMessage) { alertDialog(errorMessage, -1); this.removeFile(file); }); //上傳成功或錯誤時。 this.on("complete", function (file) { }); }, }); }
二、后台上傳功能。
1、保存文件到服務器,並上傳到FTP服務器。
/// <summary> /// 上傳文件 /// </summary> /// <returns></returns> public JsonResult Upload() { #region 局部變量 var result = true; var checkResult = false; string message = string.Empty; string ftpMessage = string.Empty; string savePath = string.Empty; string fileName = string.Empty; string fileSize = string.Empty; string filePath = string.Empty; var currentDir = string.Empty; List<string> dirList = new List<string>(); FtpWeb ftpWeb = null; HttpPostedFileBase file = null; var topicdb = new T_zy_topicdb(); var topicdbftp = new T_zy_topicdbftp(); #endregion try { #region 判斷是否為有效文件 file = Request.Files[0]; if (file.ContentLength <= 0) { result = false; message = "不能上傳零字節的文件"; return Json(new { Result = result, Message = message }); } #endregion #region 保存文件 //上傳文件臨時路徑 savePath = SysFun.GetAppUploadPath() + SysFun.GetTopicDBSavePath(); if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath); fileName = Path.GetFileName(file.FileName); fileSize = SysFun.FileSize(file.ContentLength); filePath = string.Format("{0}\\{1}", savePath, fileName); //保存文件 file.SaveAs(filePath); #endregion #region 上傳到FTP目錄 topicdbftp = bllTopicDBFTP.SelectWhere("1=1"); checkResult = FtpWebTest.CheckFtp(topicdbftp.IP, topicdbftp.UserName, topicdbftp.Password, topicdbftp.Port, topicdbftp.Pattern.Value, topicdbftp.Anonymous.Value, out ftpMessage); if (checkResult) { ftpWeb = new FtpWeb(topicdbftp.IP, SysFun.GetUploadDir(), topicdbftp.UserName, topicdbftp.Password, topicdbftp.Port, 3000, topicdbftp.Pattern.Value, topicdbftp.Anonymous.Value); dirList = SysFun.GetTopicDBSavePath().Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (var dirName in dirList) { if (!ftpWeb.DirectoryExist(dirName)) ftpWeb.MakeDir(dirName); currentDir = string.Format("/{0}/", dirName); ftpWeb.GotoDirectory(currentDir, false); } ftpWeb.Upload(filePath); result = true; message = "上傳成功!"; } else { result = false; message = "FTP上傳失敗,原因:" + ftpMessage; DeleteLocalEnvFile(filePath, ftpWeb); } #endregion } catch (Exception ex) { result = false; message = ex.Message; DeleteLocalEnvFile(filePath, ftpWeb); } return Json(new { Result = result, Message = message, FileName = fileName, FileSize = fileSize, FilePath = filePath }); }
2、以下是上傳文件用到的幫助類。
/// <summary> /// 計算文件大小函數(保留兩位小數),Size為字節大小 /// </summary> /// <param name="Size">初始文件大小</param> /// <returns></returns> public static string FileSize(long Size) { string m_strSize = ""; long FactSize = 0; FactSize = Size; if (FactSize < 1024.00) m_strSize = FactSize.ToString("F2") + " Byte"; else if (FactSize >= 1024.00 && FactSize < 1048576) m_strSize = (FactSize / 1024.00).ToString("F2") + " K"; else if (FactSize >= 1048576 && FactSize < 1073741824) m_strSize = (FactSize / 1024.00 / 1024.00).ToString("F2") + " M"; else if (FactSize >= 1073741824) m_strSize = (FactSize / 1024.00 / 1024.00 / 1024.00).ToString("F2") + " G"; return m_strSize; }
public class FtpWebTest { static Dictionary<string, string> StatusList; /// <summary> /// 檢查FTP連接(帶地址) /// </summary> /// <param name="ftpUserID">用戶名</param> /// <param name="ftpPassword">密碼</param> /// <param name="port">端口號</param> /// <param name="pattern">模式</param> /// <param name="ftpAnonymous">匿名</param> /// <param name="message">返回信息</param> /// <returns></returns> public static bool CheckFtp(string ftpUserID, string ftpPassword, string port, bool pattern, bool ftpAnonymous, out string message) { return CheckFtp("", ftpUserID, ftpPassword, port, pattern, ftpAnonymous, out message); } /// <summary> /// 檢查FTP連接(不帶地址) /// </summary> /// <param name="ip">地址</param> /// <param name="ftpUserID">用戶名</param> /// <param name="ftpPassword">密碼</param> /// <param name="port">端口號</param> /// <param name="pattern">模式</param> /// <param name="ftpAnonymous">匿名</param> /// <param name="message">返回信息</param> /// <returns></returns> public static bool CheckFtp(string ip, string ftpUserID, string ftpPassword, string port, bool pattern, bool ftpAnonymous, out string message) { int statusCode = 0; bool checkResult = false; string serverIP = string.Empty; string ftpURL = string.Empty; FtpWebRequest ftpRequest = null; FtpWebResponse ftpResponse = null; try { if (string.IsNullOrEmpty(ip)) serverIP = GetIPAddress(); else serverIP = ip; if (string.IsNullOrEmpty(serverIP)) throw new Exception("獲取服務器IP地址失敗"); ftpURL = string.Format("ftp://{0}:{1}/", serverIP, port); ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURL)); if (!ftpAnonymous) { ftpRequest.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } ftpRequest.UsePassive = pattern; ftpRequest.UseBinary = true; ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; ftpRequest.Timeout = 3000; ftpResponse = ftpRequest.GetResponse() as FtpWebResponse; if (ftpResponse.StatusCode == FtpStatusCode.OpeningData || ftpResponse.StatusCode == FtpStatusCode.DataAlreadyOpen) { checkResult = true; } statusCode = (int)ftpResponse.StatusCode; message = GetStatusMessage(statusCode.ToString()); ftpResponse.Close(); } catch (WebException ex) { checkResult = false; message = ex.Message; } catch (Exception ex) { checkResult = false; message = ex.Message; } return checkResult; } private static string GetStatusMessage(string statusCode) { GetStatusName(); if (StatusList.ContainsKey(statusCode)) { return StatusList[statusCode]; } else { return "檢測失敗"; } } private static void GetStatusName() { StatusList = new Dictionary<string, string>(); StatusList.Add("110", "響應包含一個重新啟動標記回復"); StatusList.Add("120", "此服務現在不可用,請稍后再試您的請求"); StatusList.Add("125", "數據連接已打開並且請求的傳輸已開始"); StatusList.Add("150", "服務器正在打開數據連接"); StatusList.Add("200", "命令成功完成"); StatusList.Add("202", "服務器未執行該命令"); StatusList.Add("220", "服務器已能進行用戶登錄操作"); StatusList.Add("221", "服務器正在關閉管理連接"); StatusList.Add("226", "服務器正在關閉數據連接,並且請求的文件操作成功"); StatusList.Add("250", "請求的文件操作成功完成"); StatusList.Add("331", "服務器需要提供密碼"); StatusList.Add("332", "服務器需要提供登錄帳戶"); StatusList.Add("421", "此服務不可用"); StatusList.Add("425", "無法打開數據連接"); StatusList.Add("426", "連接已關閉"); StatusList.Add("451", "發生了阻止完成請求操作的錯誤"); StatusList.Add("452", "不能執行請求的操作,因為服務器上沒有足夠的空間"); StatusList.Add("500", "命令具有語法錯誤或不是服務器可識別的命令"); StatusList.Add("501", "一個或多個命令參數具有語法錯誤"); StatusList.Add("502", "FTP 服務器未執行該命令"); StatusList.Add("530", "登錄信息必須發送到服務器"); StatusList.Add("532", "需要服務器上的用戶帳戶"); StatusList.Add("550", "無法對指定文件執行請求的操作,原因是該文件不可用"); StatusList.Add("551", "不能采取請求的操作,因為指定的頁類型是未知的"); StatusList.Add("552", "不能執行請求的操作"); StatusList.Add("553", "無法對指定文件執行請求的操作"); } private static string GetIPAddress() { IPAddress[] arrIPAddresses = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress ip in arrIPAddresses) { if (ip.AddressFamily.Equals(AddressFamily.InterNetwork)) { return ip.ToString(); } } return ""; } }
public class FtpWeb { string ftpServerIP; string ftpRemotePath; string ftpUserID; string ftpPassword; string ftpURI; string ftpPort; int timeOut; bool model; bool anonymous; /// <summary> /// 連接FTP /// </summary> /// <param name="FtpServerIP">FTP連接地址</param> /// <param name="FtpRemotePath">指定FTP連接成功后的當前目錄, 如果不指定即默認為根目錄</param> /// <param name="FtpUserID">用戶名</param> /// <param name="FtpPassword">密碼</param> public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword, string FtpPort, int TimeOut, bool Model, bool Anonymous) { ftpServerIP = FtpServerIP; ftpRemotePath = FtpRemotePath; ftpUserID = FtpUserID; ftpPassword = FtpPassword; ftpPort = FtpPort; timeOut = TimeOut; model = Model; anonymous = Anonymous; ftpURI = string.Format("ftp://{0}:{1}/{2}/", ftpServerIP, FtpPort, ftpRemotePath); } public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword, string FtpPort) { ftpServerIP = FtpServerIP; ftpRemotePath = FtpRemotePath; ftpUserID = FtpUserID; ftpPassword = FtpPassword; ftpPort = FtpPort; timeOut = 10000; model = true; anonymous = true; ftpURI = string.Format("ftp://{0}:{1}/{2}/", ftpServerIP, FtpPort, ftpRemotePath); //ftpURI = string.Format("ftp://{0}:{1}/", ftpServerIP, FtpPort); } /// <summary> /// 上傳 /// </summary> /// <param name="filename"></param> public void Upload(string filename) { FileInfo fileInf = new FileInfo(filename); string uri = ftpURI + fileInf.Name; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.KeepAlive = false; reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; reqFTP.ContentLength = fileInf.Length; int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = fileInf.OpenRead(); try { Stream strm = reqFTP.GetRequestStream(); contentLen = fs.Read(buff, 0, buffLength); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } strm.Close(); fs.Close(); } catch (Exception ex) { throw new Exception("FTP上傳文件過程中發生錯誤:" + ex.Message); } } public void Download(string TopicDBCode, string filePath, string fileName) { Download(TopicDBCode, filePath, fileName, ""); } /// <summary> /// 下載 /// </summary> /// <param name="filePath"></param> /// <param name="fileName"></param> public void Download(string TopicDBCode, string filePath, string fileName, string Uri) { FtpWebRequest reqFTP; string FileName = ""; FtpWebResponse response = null; Stream ftpStream = null; FileStream outputStream = null; try { FileName = filePath + Path.DirectorySeparatorChar + fileName; if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); outputStream = new FileStream(FileName, FileMode.Create); string Url = ftpURI; if (!string.IsNullOrEmpty(Uri)) Url += Uri; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(Url + fileName)); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); response = (FtpWebResponse)reqFTP.GetResponse(); ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); } catch (Exception ex) { if (ftpStream != null) ftpStream.Close(); if (outputStream != null) outputStream.Close(); if (response != null) response.Close(); if (File.Exists(FileName)) File.Delete(FileName); throw new Exception("FTP下載文件過程中發生錯誤:" + ex.Message); } } /// <summary> /// 刪除文件 /// </summary> /// <param name="fileName"></param> public void Delete(string fileName) { try { string uri = ftpURI + fileName; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; string result = String.Empty; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); long size = response.ContentLength; Stream datastream = response.GetResponseStream(); StreamReader sr = new StreamReader(datastream); result = sr.ReadToEnd(); sr.Close(); datastream.Close(); response.Close(); } catch (Exception ex) { throw new Exception("FTP刪除文件過程中發生錯誤:" + ex.Message); } } /// <summary> /// 刪除文件夾 /// </summary> /// <param name="folderName"></param> public void RemoveDirectory(string folderName) { try { string uri = ftpURI + folderName; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory; string result = String.Empty; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); long size = response.ContentLength; Stream datastream = response.GetResponseStream(); StreamReader sr = new StreamReader(datastream); result = sr.ReadToEnd(); sr.Close(); datastream.Close(); response.Close(); } catch (Exception ex) { throw new Exception("FTP刪除文件夾過程中發生錯誤:" + ex.Message); } } /// <summary> /// 獲取當前目錄下明細(包含文件和文件夾) /// </summary> /// <returns></returns> public string[] GetFilesDetailList() { try { StringBuilder result = new StringBuilder(); FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI)); if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails; reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); string line = reader.ReadLine(); while (line != null) { result.Append(line); result.Append("\n"); line = reader.ReadLine(); } result.Remove(result.ToString().LastIndexOf("\n"), 1); reader.Close(); response.Close(); return result.ToString().Split('\n'); } catch (Exception ex) { throw new Exception("FTP獲取目錄過程中發生錯誤:" + ex.Message); } } public string[] GetFileList(string mask) { return GetFileList("", mask); } public string[] GetFileList(string TopicDBCode, string mask) { return GetFileList(TopicDBCode, mask, ""); } /// <summary> /// 獲取當前目錄下文件列表(僅文件) /// </summary> /// <param name="TopicDBCode"></param> /// <param name="mask"></param> /// <param name="Uri">文件夾/</param> /// <returns></returns> public string[] GetFileList(string TopicDBCode, string mask, string Uri) { string[] downloadFiles; StringBuilder result = new StringBuilder(); FtpWebRequest reqFTP; try { if (!string.IsNullOrEmpty(Uri)) { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + Uri)); } else { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI)); } reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; reqFTP.UseBinary = true; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); string line = reader.ReadLine(); while (line != null) { if (mask.Trim() != string.Empty && mask.Trim() != "*.*") { int length = mask.IndexOf("*"); if (length < line.Length) { string mask_ = mask.Substring(0, length); if (line.Substring(0, mask_.Length) == mask_) { result.Append(line); result.Append("\n"); } } } else { result.Append(line); result.Append("\n"); } line = reader.ReadLine(); } string val = result.ToString(); if (!string.IsNullOrEmpty(val)) result.Remove(val.LastIndexOf('\n'), 1); reader.Close(); response.Close(); val = result.ToString(); if (!string.IsNullOrEmpty(val)) return result.ToString().Split('\n'); else return null; } catch (Exception ex) { downloadFiles = null; if (ex.Message.Trim() != "遠程服務器返回錯誤: (550) 文件不可用(例如,未找到文件,無法訪問文件)。") { throw new Exception("FTP獲取目錄失敗:" + ex.Message); } return downloadFiles; } } /// <summary> /// 獲取當前目錄下所有的文件夾列表(僅文件夾) /// </summary> /// <returns></returns> public string[] GetDirectoryList() { string[] drectory = GetFilesDetailList(); string m = string.Empty; foreach (string str in drectory) { int dirPos = str.IndexOf("<DIR>"); if (dirPos > 0) { /*判斷 Windows 風格*/ m += str.Substring(dirPos + 5).Trim() + "\n"; } else if (str.Trim().Substring(0, 1).ToUpper() == "D") { /*判斷 Unix 風格*/ string dir = str.Substring(54).Trim(); if (dir != "." && dir != "..") { m += dir + "\n"; } } } char[] n = new char[] { '\n' }; return m.Split(n); } /// <summary> /// 判斷當前目錄下指定的子目錄是否存在 /// </summary> /// <param name="RemoteDirectoryName">指定的目錄名</param> public bool DirectoryExist(string RemoteDirectoryName) { string[] dirList = GetDirectoryList(); foreach (string str in dirList) { if (str.Trim() == RemoteDirectoryName.Trim()) { return true; } } return false; } /// <summary> /// 判斷當前目錄下指定的文件是否存在 /// </summary> /// <param name="RemoteFileName">遠程文件名</param> public bool FileExist(string RemoteFileName) { string[] fileList = GetFileList("*.*"); if (fileList == null) { return false; } foreach (string str in fileList) { if (str.Trim() == RemoteFileName.Trim()) { return true; } } return false; } /// <summary> /// 創建文件夾 /// </summary> /// <param name="dirName"></param> public void MakeDir(string dirName) { FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName)); reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; reqFTP.UseBinary = true; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); ftpStream.Close(); response.Close(); } catch (Exception ex) { throw new Exception("FTP創建文件夾過程中發生錯誤:" + ex.Message); } } /// <summary> /// 獲取指定文件大小 /// </summary> /// <param name="filename"></param> /// <returns></returns> public long GetFileSize(string filename) { FtpWebRequest reqFTP; long fileSize = 0; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename)); reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; reqFTP.UseBinary = true; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); fileSize = response.ContentLength; ftpStream.Close(); response.Close(); } catch (Exception ex) { throw new Exception("FTP獲取文件大小失敗:" + ex.Message); } return fileSize; } /// <summary> /// 改名 /// </summary> /// <param name="currentFilename"></param> /// <param name="newFilename"></param> public void ReName(string currentFilename, string newFilename) { FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename)); reqFTP.Timeout = timeOut; reqFTP.UsePassive = model; reqFTP.Method = WebRequestMethods.Ftp.Rename; reqFTP.RenameTo = newFilename; reqFTP.UseBinary = true; if (!anonymous) reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); ftpStream.Close(); response.Close(); } catch (Exception ex) { throw new Exception("FTP文件改名失敗:" + ex.Message); } } /// <summary> /// 移動文件 /// </summary> /// <param name="currentFilename"></param> /// <param name="newFilename"></param> public void MovieFile(string currentFilename, string newDirectory) { ReName(currentFilename, newDirectory); } /// <summary> /// 切換當前目錄 /// </summary> /// <param name="DirectoryName"></param> /// <param name="IsRoot">true 絕對路徑 false 相對路徑</param> public void GotoDirectory(string DirectoryName, bool IsRoot) { if (IsRoot) { ftpRemotePath = DirectoryName; } else { ftpRemotePath += DirectoryName + "/"; } ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; } /// <summary> /// 刪除目錄 /// </summary> /// <param name="ftpServerIP">FTP 主機地址</param> /// <param name="folderToDelete">FTP 用戶名</param> /// <param name="ftpUserID">FTP 用戶名</param> /// <param name="ftpPassword">FTP 密碼</param> public static void DeleteOrderDirectory(string ftpServerIP, string folderToDelete, string ftpUserID, string ftpPassword, string FtpPort) { try { if (!string.IsNullOrEmpty(ftpServerIP) && !string.IsNullOrEmpty(folderToDelete) && !string.IsNullOrEmpty(ftpUserID) && !string.IsNullOrEmpty(ftpPassword)) { FtpWeb fw = new FtpWeb(ftpServerIP, folderToDelete, ftpUserID, ftpPassword, FtpPort); //進入訂單目錄 fw.GotoDirectory(folderToDelete, true); //獲取規格目錄 string[] folders = fw.GetDirectoryList(); foreach (string folder in folders) { if (!string.IsNullOrEmpty(folder) || folder != "") { //進入訂單目錄 string subFolder = folderToDelete + "/" + folder; fw.GotoDirectory(subFolder, true); //獲取文件列表 string[] files = fw.GetFileList("*.*"); if (files != null) { //刪除文件 foreach (string file in files) { fw.Delete(file); } } //刪除沖印規格文件夾 fw.GotoDirectory(folderToDelete, true); fw.RemoveDirectory(folder); } } //刪除訂單文件夾 string parentFolder = folderToDelete.Remove(folderToDelete.LastIndexOf('/')); string orderFolder = folderToDelete.Substring(folderToDelete.LastIndexOf('/') + 1); fw.GotoDirectory(parentFolder, true); fw.RemoveDirectory(orderFolder); } else { throw new Exception("FTP路徑不能為空!"); } } catch (Exception ex) { throw new Exception("FTP刪除目錄時發生錯誤,錯誤信息為:" + ex.Message); } } }
