Asp.net 2.0中Ftp支持断点续传 源码
/*****************************************************************
// Copyright (C) 2006-2007 Newegg Corporation
// All rights reserved.
//
// Author: Charles Ge (Charles.Y.Ge@Newegg.com)
// Create Date: 04/12/2007 15:33:42
// Usage: DFIS Ftp Client Service,add ftp site,upload files,download files
//
// RevisionHistory
// Date Author Description
//
*****************************************************************/
using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.Configuration;
// Copyright (C) 2006-2007 Newegg Corporation
// All rights reserved.
//
// Author: Charles Ge (Charles.Y.Ge@Newegg.com)
// Create Date: 04/12/2007 15:33:42
// Usage: DFIS Ftp Client Service,add ftp site,upload files,download files
//
// RevisionHistory
// Date Author Description
//
*****************************************************************/
using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.Configuration;
1 public sealed class FtpClientService
2 {
3 #region Internal Members
4
5 private NetworkCredential certificate;
6
7 #endregion
8
9 /// <summary>
10 /// 构造函数,提供初始化数据的功能,打开Ftp站点
11 /// </summary>
12 public FtpClientService()
13 {
14 certificate = new NetworkCredential(WebConfigurationManager.AppSettings["UserName"], WebConfigurationManager.AppSettings["PassWord"]);
15 }
16
17 /// <summary>
18 /// 创建FTP请求
19 /// </summary>
20 /// <param name="uri">ftp://myserver/upload.txt</param>
21 /// <param name="method">Upload/Download</param>
22 /// <returns></returns>
23 private FtpWebRequest CreateFtpWebRequest(Uri uri, string method)
24 {
25 FtpWebRequest ftpClientRequest = (FtpWebRequest)WebRequest.Create(uri);
26
27 ftpClientRequest.Proxy = null;
28 ftpClientRequest.Credentials = certificate;
29 ftpClientRequest.KeepAlive = true;
30 ftpClientRequest.UseBinary = true;
31 ftpClientRequest.UsePassive = true;
32 ftpClientRequest.Method = method;
33
34 //ftpClientRequest.Timeout = -1;
35
36 return ftpClientRequest;
37 }
38 #region 支持断点续传
39
40 public bool UploadFile(string sourceFile, Uri destinationPath, int offSet,string ftpMethod)
41 {
42 try
43 {
44 FileInfo file = new FileInfo(sourceFile);
45 Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);
46 FtpWebRequest request = CreateFtpWebRequest(uri, ftpMethod);
47 request.ContentOffset = offSet;
48 Stream requestStream = request.GetRequestStream();//需要获取文件的流
49 FileStream fileStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);//创建存储文件的流
50 int sourceLength = (int)fileStream.Length;
51 offSet = CopyDataToDestination(fileStream, requestStream, offSet);
52 WebResponse response = request.GetResponse();
53 response.Close();
54 if (offSet != 0)
55 {
56 UploadFile(sourceFile, destinationPath, offSet, WebRequestMethods.Ftp.AppendFile);
57 }
58 }
59 catch(Exception ex)
60 {
61 ex.ToString();
62 return false;
63 }
64
65 return true;
66 }
67
68 private int CopyDataToDestination(Stream sourceStream, Stream destinationStream, int offSet)
69 {
70 try
71 {
72 int sourceLength = (int)sourceStream.Length;
73 int length = sourceLength - offSet;
74 byte[] buffer = new byte[length + offSet];
75 int bytesRead = sourceStream.Read(buffer, offSet, length);
76 while (bytesRead != 0)
77 {
78 destinationStream.Write(buffer, 0, bytesRead);
79 bytesRead = sourceStream.Read(buffer, 0, length);
80 length = length - bytesRead;
81 offSet = (bytesRead == 0) ? 0 : (sourceLength - length);//(length - bytesRead);
82 }
83 }
84 catch(Exception ex)
85 {
86 string error = ex.ToString();
87 return offSet;
88 }
89 finally
90 {
91 destinationStream.Close();
92 sourceStream.Close();
93 }
94 return offSet;
95 }
96 #endregion
97 }
2 {
3 #region Internal Members
4
5 private NetworkCredential certificate;
6
7 #endregion
8
9 /// <summary>
10 /// 构造函数,提供初始化数据的功能,打开Ftp站点
11 /// </summary>
12 public FtpClientService()
13 {
14 certificate = new NetworkCredential(WebConfigurationManager.AppSettings["UserName"], WebConfigurationManager.AppSettings["PassWord"]);
15 }
16
17 /// <summary>
18 /// 创建FTP请求
19 /// </summary>
20 /// <param name="uri">ftp://myserver/upload.txt</param>
21 /// <param name="method">Upload/Download</param>
22 /// <returns></returns>
23 private FtpWebRequest CreateFtpWebRequest(Uri uri, string method)
24 {
25 FtpWebRequest ftpClientRequest = (FtpWebRequest)WebRequest.Create(uri);
26
27 ftpClientRequest.Proxy = null;
28 ftpClientRequest.Credentials = certificate;
29 ftpClientRequest.KeepAlive = true;
30 ftpClientRequest.UseBinary = true;
31 ftpClientRequest.UsePassive = true;
32 ftpClientRequest.Method = method;
33
34 //ftpClientRequest.Timeout = -1;
35
36 return ftpClientRequest;
37 }
38 #region 支持断点续传
39
40 public bool UploadFile(string sourceFile, Uri destinationPath, int offSet,string ftpMethod)
41 {
42 try
43 {
44 FileInfo file = new FileInfo(sourceFile);
45 Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);
46 FtpWebRequest request = CreateFtpWebRequest(uri, ftpMethod);
47 request.ContentOffset = offSet;
48 Stream requestStream = request.GetRequestStream();//需要获取文件的流
49 FileStream fileStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);//创建存储文件的流
50 int sourceLength = (int)fileStream.Length;
51 offSet = CopyDataToDestination(fileStream, requestStream, offSet);
52 WebResponse response = request.GetResponse();
53 response.Close();
54 if (offSet != 0)
55 {
56 UploadFile(sourceFile, destinationPath, offSet, WebRequestMethods.Ftp.AppendFile);
57 }
58 }
59 catch(Exception ex)
60 {
61 ex.ToString();
62 return false;
63 }
64
65 return true;
66 }
67
68 private int CopyDataToDestination(Stream sourceStream, Stream destinationStream, int offSet)
69 {
70 try
71 {
72 int sourceLength = (int)sourceStream.Length;
73 int length = sourceLength - offSet;
74 byte[] buffer = new byte[length + offSet];
75 int bytesRead = sourceStream.Read(buffer, offSet, length);
76 while (bytesRead != 0)
77 {
78 destinationStream.Write(buffer, 0, bytesRead);
79 bytesRead = sourceStream.Read(buffer, 0, length);
80 length = length - bytesRead;
81 offSet = (bytesRead == 0) ? 0 : (sourceLength - length);//(length - bytesRead);
82 }
83 }
84 catch(Exception ex)
85 {
86 string error = ex.ToString();
87 return offSet;
88 }
89 finally
90 {
91 destinationStream.Close();
92 sourceStream.Close();
93 }
94 return offSet;
95 }
96 #endregion
97 }
//这里是一段上面的测试代码
private FtpClientService ftpClient;
[TestMethod]
public void UploadFileSupportFitfulTest()
{
ftpClient = new FtpClientService();
ftpClient.UploadFile(@"\\10.16.174.31\NeweggPictures\newEgg\ProdTourOff.gif", new Uri("ftp://10.16.50.189/SlaveImageServer/NewEgg/GroupFTPTest/"), 0, WebRequestMethods.Ftp.UploadFile);
}
private FtpClientService ftpClient;
[TestMethod]
public void UploadFileSupportFitfulTest()
{
ftpClient = new FtpClientService();
ftpClient.UploadFile(@"\\10.16.174.31\NeweggPictures\newEgg\ProdTourOff.gif", new Uri("ftp://10.16.50.189/SlaveImageServer/NewEgg/GroupFTPTest/"), 0, WebRequestMethods.Ftp.UploadFile);
}