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;

 

 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     }

//这里是一段上面的测试代码
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);
        }
posted @ 2007-04-25 09:36  charles  阅读(4876)  评论(7编辑  收藏  举报