我要把圖片通過ftp上傳到服務(wù)器固定的目錄下面,存放圖片的這個文件夾是會變的,所以在上傳之前,得先判斷目錄下面有沒有這個文件夾,要是沒有就先新建一個文件夾,在把圖片上傳到這個文件夾里
上傳的核心代碼:
/// <summary>
/// FTP上傳文件 /// </summary> /// <param name="fileUpload">上傳控件</param> /// <param name="ftPServerIP">上傳文件服務(wù)器IP</param> /// <param name="ftpUserID">服務(wù)器用戶名</param> /// <param name="ftpPassword">服務(wù)器密碼</param> /// <returns></returns> public string Upload(FileUpload fileUpload, string ftpServerIP, string ftpUserID, string ftpPassword) { string filename = fileUpload.FileName; string sRet = "上傳成功!"; FileInfo fileInf = new FileInfo(fileUpload.PostedFile.FileName); string uri = "ftp://" + ftpServerIP + "/" + filename; FtpWebRequest reqFTP; // 根據(jù)uri創(chuàng)建FtpWebRequest對象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用戶名和密碼 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // 默認(rèn)為true,連接不會被關(guān)閉 // 在一個命令之后被執(zhí)行 reqFTP.KeepAlive = false; // 指定執(zhí)行什么命令 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 指定數(shù)據(jù)傳輸類型 reqFTP.UseBinary = true; reqFTP.UsePassive = false; // 上傳文件時通知服務(wù)器文件的大小 reqFTP.ContentLength = fileInf.Length; // 緩沖大小設(shè)置為2kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打開一個文件流 (System.IO.FileStream) 去讀上傳的文件 FileStream fs = fileInf.OpenRead(); try { // 把上傳的文件寫入流 Stream strm = reqFTP.GetRequestStream(); // 每次讀文件流的2kb contentLen = fs.Read(buff, 0, buffLength); // 流內(nèi)容沒有結(jié)束 while (contentLen != 0) { // 把內(nèi)容從file stream 寫入 upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // 關(guān)閉兩個流 strm.Close(); fs.Close(); } catch (Exception ex) { sRet = ex.Message; } return sRet; }
上面只是一個簡單的上傳,當(dāng)然上傳之前還需要對文件進(jìn)行一些驗(yàn)證,例如文件格式或者文件的大小之類的。簡單驗(yàn)證請參考上傳圖片之上傳前判斷文件格式與大小。
為了防止重名,可以使用全局唯一標(biāo)示符GUID,生成一個隨機(jī)序列,在理想情況下,任何計算機(jī)和計算機(jī)集群都不會生成兩個相同的GUID。當(dāng)然重復(fù)的幾率也并不為0,但是非常小了。
/// <summary>
/// 生成全局唯一標(biāo)示符 /// </summary> /// <returns></returns> public string strGUID() { string strguid = Guid.NewGuid().ToString(); return strguid; }
調(diào)用這個方法,然后將返回的序列跟文件名拼接就可以有效的避免文件重名的情況了。當(dāng)然也可以用系統(tǒng)當(dāng)前時間來跟文件名進(jìn)行拼接,這樣或許你感覺更保險一些。具體用那種方法就見仁見智了。