FTP上传文件夹
文件上传类
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.IO; 5 using System.Linq; 6 using System.Net; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace ImageResize 11 { 12 public class FtpClient 13 { 14 public string ftpUser = string.Empty; 15 public string ftpPassword = string.Empty; 16 public string ftpRootURL = string.Empty; 17 public bool isFlag = true; 18 public string baseFolderPath = null; 19 20 public FtpClient(string url, string userid, string password) 21 { 22 this.ftpUser = userid; 23 this.ftpPassword = password; 24 this.ftpRootURL = url; 25 } 26 27 /// <summary> 28 /// 文件夹上传 29 /// </summary> 30 /// <param name="sourceFolder"></param> 31 /// <param name="destFolder">ftpRootUrl + ftpPath</param> 32 /// <returns></returns> 33 public bool foldersUpload(string sourceFolder, string destFolder, string detailFolder) 34 { 35 bool isFolderFlag = false; 36 if (isFlag) 37 { 38 baseFolderPath = sourceFolder.Substring(0, sourceFolder.LastIndexOf("\\")); 39 isFlag = false; 40 } 41 42 string selectFolderName = sourceFolder.Replace(baseFolderPath, "").Replace("\\", "/"); 43 44 if (selectFolderName != null) 45 { 46 string ftpDirectory = destFolder + selectFolderName; 47 if (ftpDirectory.LastIndexOf('/') < ftpDirectory.Length - 1) 48 { 49 ftpDirectory = ftpDirectory + "/"; 50 } 51 if (!FtpDirectoryIsNotExists(ftpDirectory)) 52 { 53 CreateFtpDirectory(ftpDirectory); 54 } 55 } 56 57 try 58 { 59 string[] directories = Directory.EnumerateDirectories(sourceFolder).ToArray(); 60 if (directories.Length > 0) 61 { 62 foreach (string d in directories) 63 { 64 foldersUpload(d, destFolder, sourceFolder.Replace(baseFolderPath, "").Replace("\\","/")); 65 } 66 } 67 68 string[] files = Directory.EnumerateFiles(sourceFolder).ToArray(); 69 if (files.Length > 0) 70 { 71 foreach (string s in files) 72 { 73 74 string fileName = s.Substring(s.LastIndexOf("\\")).Replace("\\", "/"); 75 76 if(selectFolderName.Contains("/")) 77 { 78 if(selectFolderName.LastIndexOf('/') < selectFolderName.Length -1) 79 { 80 selectFolderName = selectFolderName + '/'; 81 } 82 83 } 84 ftpRootURL = destFolder; 85 86 fileUpload(new FileInfo(s), selectFolderName , fileName.Substring(1,fileName.Length -1)); 87 88 } 89 } 90 isFolderFlag = true; 91 92 } 93 catch (Exception ex) 94 { 95 Debug.WriteLine(ex.Message); 96 } 97 return isFolderFlag; 98 } 99 100 101 /// <summary> 102 /// 上传 103 /// </summary> 104 /// <param name="localFile">本地文件绝对路径</param> 105 /// <param name="ftpPath">上传到ftp的路径</param> 106 /// <param name="ftpFileName">上传到ftp的文件名</param> 107 public bool fileUpload(FileInfo localFile, string ftpPath, string ftpFileName) 108 { 109 bool success = false; 110 FtpWebRequest ftpWebRequest = null; 111 112 FileStream localFileStream = null; 113 Stream requestStream = null; 114 115 try 116 { 117 // 检查FTP目标存放目录是否存在 118 // 1.1 ftp 上目标目录 119 string destFolderPath = ftpRootURL + ftpPath; 120 121 if (!FtpDirectoryIsNotExists(destFolderPath)) 122 { 123 CreateFtpDirectory(destFolderPath); 124 } 125 126 string uri = ftpRootURL + ftpPath + ftpFileName; 127 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 128 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 129 ftpWebRequest.UseBinary = true; 130 131 ftpWebRequest.KeepAlive = false; 132 ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile; 133 ftpWebRequest.ContentLength = localFile.Length; 134 135 int buffLength = 2048; 136 byte[] buff = new byte[buffLength]; 137 int contentLen; 138 139 localFileStream = localFile.OpenRead(); 140 requestStream = ftpWebRequest.GetRequestStream(); 141 142 contentLen = localFileStream.Read(buff, 0, buffLength); 143 while (contentLen != 0) 144 { 145 // 把内容从file stream 写入upload stream 146 requestStream.Write(buff, 0, contentLen); 147 contentLen = localFileStream.Read(buff, 0, buffLength); 148 } 149 150 success = true; 151 } 152 catch (Exception) 153 { 154 success = false; 155 } 156 finally 157 { 158 if (requestStream != null) 159 { 160 requestStream.Close(); 161 } 162 if (localFileStream != null) 163 { 164 localFileStream.Close(); 165 } 166 } 167 168 return success; 169 } 170 171 172 /// <summary> 173 /// 上传文件 174 /// </summary> 175 /// <param name="localPath">本地文件地址(没有文件名)</param> 176 /// <param name="localFileName">本地文件名</param> 177 /// <param name="ftpPath">上传到ftp的路径</param> 178 /// <param name="ftpFileName">上传到ftp的文件名</param> 179 public bool fileUpload(string localPath, string localFileName, string ftpPath, string ftpFileName) 180 { 181 bool success = false; 182 try 183 { 184 FileInfo localFile = new FileInfo(localPath + localFileName); 185 if (localFile.Exists) 186 { 187 success = fileUpload(localFile, ftpPath, ftpFileName); 188 } 189 else 190 { 191 success = false; 192 } 193 } 194 catch (Exception) 195 { 196 success = false; 197 } 198 return success; 199 } 200 201 202 /// <summary> 203 /// 下载文件 204 /// </summary> 205 /// <param name="localPath">本地文件地址(没有文件名)</param> 206 /// <param name="localFileName">本地文件名</param> 207 /// <param name="ftpPath">下载的ftp的路径</param> 208 /// <param name="ftpFileName">下载的ftp的文件名</param> 209 public bool fileDownload(string localPath, string localFileName, string ftpPath, string ftpFileName) 210 { 211 bool success = false; 212 FtpWebRequest ftpWebRequest = null; 213 FtpWebResponse ftpWebResponse = null; 214 Stream ftpResponseStream = null; 215 FileStream outputStream = null; 216 try 217 { 218 outputStream = new FileStream(localPath + localFileName, FileMode.Create); 219 string uri = ftpRootURL + ftpPath + ftpFileName; 220 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 221 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 222 ftpWebRequest.UseBinary = true; 223 ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile; 224 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse(); 225 ftpResponseStream = ftpWebResponse.GetResponseStream(); 226 long contentLength = ftpWebResponse.ContentLength; 227 int bufferSize = 2048; 228 byte[] buffer = new byte[bufferSize]; 229 int readCount; 230 readCount = ftpResponseStream.Read(buffer, 0, bufferSize); 231 while (readCount > 0) 232 { 233 outputStream.Write(buffer, 0, readCount); 234 readCount = ftpResponseStream.Read(buffer, 0, bufferSize); 235 } 236 success = true; 237 } 238 catch (Exception) 239 { 240 success = false; 241 } 242 finally 243 { 244 if (outputStream != null) 245 { 246 outputStream.Close(); 247 } 248 if (ftpResponseStream != null) 249 { 250 ftpResponseStream.Close(); 251 } 252 if (ftpWebResponse != null) 253 { 254 ftpWebResponse.Close(); 255 } 256 } 257 return success; 258 } 259 260 261 /// <summary> 262 /// 重命名 263 /// </summary> 264 /// <param name="ftpPath">ftp文件路径</param> 265 /// <param name="currentFilename"></param> 266 /// <param name="newFilename"></param> 267 public bool fileRename(string ftpPath, string currentFileName, string newFileName) 268 { 269 bool success = false; 270 FtpWebRequest ftpWebRequest = null; 271 FtpWebResponse ftpWebResponse = null; 272 Stream ftpResponseStream = null; 273 try 274 { 275 string uri = ftpRootURL + ftpPath + currentFileName; 276 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 277 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 278 ftpWebRequest.UseBinary = true; 279 ftpWebRequest.Method = WebRequestMethods.Ftp.Rename; 280 ftpWebRequest.RenameTo = newFileName; 281 282 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse(); 283 ftpResponseStream = ftpWebResponse.GetResponseStream(); 284 285 } 286 catch (Exception) 287 { 288 success = false; 289 } 290 finally 291 { 292 if (ftpResponseStream != null) 293 { 294 ftpResponseStream.Close(); 295 } 296 if (ftpWebResponse != null) 297 { 298 ftpWebResponse.Close(); 299 } 300 } 301 return success; 302 } 303 304 305 /// <summary> 306 /// 消除文件 307 /// </summary> 308 /// <param name="filePath"></param> 309 public bool fileDelete(string ftpPath, string ftpName) 310 { 311 bool success = false; 312 FtpWebRequest ftpWebRequest = null; 313 FtpWebResponse ftpWebResponse = null; 314 Stream ftpResponseStream = null; 315 StreamReader streamReader = null; 316 try 317 { 318 string uri = ftpRootURL + ftpPath + ftpName; 319 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 320 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 321 ftpWebRequest.KeepAlive = false; 322 ftpWebRequest.Method = WebRequestMethods.Ftp.DeleteFile; 323 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse(); 324 long size = ftpWebResponse.ContentLength; 325 ftpResponseStream = ftpWebResponse.GetResponseStream(); 326 streamReader = new StreamReader(ftpResponseStream); 327 string result = String.Empty; 328 result = streamReader.ReadToEnd(); 329 330 success = true; 331 } 332 catch (Exception) 333 { 334 success = false; 335 } 336 finally 337 { 338 if (streamReader != null) 339 { 340 streamReader.Close(); 341 } 342 if (ftpResponseStream != null) 343 { 344 ftpResponseStream.Close(); 345 } 346 if (ftpWebResponse != null) 347 { 348 ftpWebResponse.Close(); 349 } 350 } 351 return success; 352 } 353 354 /// <summary> 355 /// 文件存在检查 356 /// </summary> 357 public bool fileCheckExist(string destFolderPath, string fileName) 358 { 359 bool success = false; 360 FtpWebRequest ftpWebRequest = null; 361 WebResponse webResponse = null; 362 StreamReader reader = null; 363 try 364 { 365 366 367 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(destFolderPath)); 368 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 369 ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory; 370 ftpWebRequest.KeepAlive = false; 371 webResponse = ftpWebRequest.GetResponse(); 372 reader = new StreamReader(webResponse.GetResponseStream()); 373 string line = reader.ReadLine(); 374 while (line != null) 375 { 376 string ftpName = "test.jpg"; 377 if (line == ftpName) 378 { 379 success = true; 380 break; 381 } 382 line = reader.ReadLine(); 383 } 384 } 385 catch (Exception) 386 { 387 success = false; 388 } 389 finally 390 { 391 if (reader != null) 392 { 393 reader.Close(); 394 } 395 if (webResponse != null) 396 { 397 webResponse.Close(); 398 } 399 } 400 return success; 401 } 402 403 404 /// <summary> 405 /// 创建FTP文件目录 406 /// </summary> 407 /// <param name="ftpDirectory">ftp服务器上的文件目录</param> 408 public void CreateFtpDirectory(string ftpDirectory) 409 { 410 try 411 { 412 FtpWebRequest ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpDirectory)); 413 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword); 414 ftpWebRequest.UseBinary = true; 415 ftpWebRequest.KeepAlive = false; 416 ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory; 417 418 FtpWebResponse respFTP = (FtpWebResponse)ftpWebRequest.GetResponse(); 419 respFTP.Close(); 420 } 421 catch (Exception ex) 422 { 423 Debug.WriteLine("FTP创建目录失败" + ex.Message); 424 } 425 426 } 427 428 429 430 431 /// <summary> 432 /// 获取目录下的详细信息 433 /// </summary> 434 /// <param name="localDir">本机目录</param> 435 /// <returns></returns> 436 public List<List<string>> GetDirDetails(string localDir) 437 { 438 List<List<string>> infos = new List<List<string>>(); 439 try 440 { 441 infos.Add(Directory.GetFiles(localDir).ToList()); 442 infos.Add(Directory.GetDirectories(localDir).ToList()); 443 for (int i = 0; i < infos[0].Count; i++) 444 { 445 int index = infos[1][i].LastIndexOf(@"\"); 446 infos[1][i] = infos[1][i].Substring(index + 1); 447 } 448 } 449 catch(Exception ex) 450 { 451 Debug.WriteLine(ex.Message); 452 } 453 return infos; 454 } 455 456 457 public void UploadDirectory(string localDir, string ftpPath, string dirName, string ftpUser, string ftpPassword) 458 { 459 if (ftpUser == null) 460 { 461 ftpUser = ""; 462 } 463 if (ftpPassword == null) 464 { 465 ftpPassword = ""; 466 } 467 468 string dir = localDir + dirName + @"\"; 469 470 if (!Directory.Exists(dir)) 471 { 472 return; 473 } 474 475 //if (!CheckDirectoryExist(ftpPath, dirName)) 476 //{ 477 // MakeDir(ftpPath, dirName); 478 479 //} 480 481 List<List<string>> infos = GetDirDetails(dir); //获取当前目录下的所有文件和文件夹 482 //先上传文件 483 // MyLog.ShowMessage(dir + "下的文件数:" + infos[0].Count.ToString()); 484 for (int i = 0; i < infos[0].Count; i++) 485 { 486 Console.WriteLine(infos[0][i]); 487 // UpLoadFile(dir + infos[0][i], ftpPath + dirName + @"/" + infos[0][i], ftpUser, ftpPassword); 488 } 489 //再处理文件夹 490 // MyLog.ShowMessage(dir + "下的目录数:" + infos[1].Count.ToString()); 491 for (int i = 0; i < infos[1].Count; i++) 492 { 493 UploadDirectory(dir, ftpPath + dirName + @"/", infos[1][i], ftpUser, ftpPassword); 494 } 495 } 496 497 /// <summary> 498 /// 判断Ftp上待上传文件存放的(文件夹)目录是否存在 499 /// 注意事项:目录结构的最后一个字符一定要是一个斜杠 500 /// </summary> 501 /// <param name="destFtpFolderPath">Ftp服务器上存放待上传文件的目录</param> 502 private bool FtpDirectoryIsNotExists(string destFolderPath) 503 { 504 try 505 { 506 var request = (FtpWebRequest)WebRequest.Create(destFolderPath); 507 request.Credentials = new NetworkCredential(ftpUser, ftpPassword); 508 request.Method = WebRequestMethods.Ftp.ListDirectory; 509 FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 510 } 511 catch (WebException ex) 512 { 513 FtpWebResponse response = (FtpWebResponse)ex.Response; 514 if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) 515 { 516 response.Close(); 517 return false; 518 } 519 else 520 { 521 response.Close(); 522 } 523 } 524 return true; 525 } 526 527 /// <summary> 528 /// 解析文件所在的路径(即当前文件所在的文件位置) 529 /// </summary> 530 /// <param name="destFilePath">需要存储在FTP服务器上的文件路径,如:ftp://192.168.1.100/LocalUser/picture1.jpg</param> 531 /// <returns></returns> 532 public string FtpParseDirectory(string destFilePath) 533 { 534 return destFilePath.Substring(0, destFilePath.LastIndexOf("/")); 535 } 536 537 538 // 验证文件类型 539 public bool IsAllowableFileType(string fileName) 540 { 541 //从web.config读取判断文件类型限制 542 string stringstrFileTypeLimit = string.Format(".jpeg|*.jpeg|*.*|All Files"); 543 //当前文件扩展名是否包含在这个字符串中 544 if (stringstrFileTypeLimit.IndexOf(fileName.ToLower()) != -1) 545 { 546 return true; 547 } 548 else 549 { 550 return false; 551 } 552 } 553 554 //文件大小 555 public bool IsAllowableFileSize(long FileContentLength) 556 { 557 //从web.config读取判断文件大小的限制 558 Int32 doubleiFileSizeLimit = 1232; 559 560 //判断文件是否超出了限制 561 if (doubleiFileSizeLimit > FileContentLength) 562 { 563 return true; 564 } 565 else 566 { 567 return false; 568 } 569 } 570 571 572 573 } 574 }