用 C# 写的 文件断点续传、下载的类

本用例是 采用 C# 上传、Servlet 进行接收

 

C#作为客户端、Servlet  作为服务器进行文件断点下载

 

有调试不通过的,给我 Mail:lijiangchxp@sina.com.cn

 

using System;

using log4net;

using System.Collections;

using System.Text;

using System.IO;

using System.Net;

using log4net.Config;

using Chxp.Business;

namespace Chxp.Service

{

   public class FileLib

    {

        #region 属性

        private string fileName = "";

        public string FileName

        {

            get { return fileName; }

            set { fileName = value; }

        }

     

        #endregion 

      

       private static readonly ILog LOG = LogManager.GetLogger(typeof(FileLib));

 

        #region 文件上传

      

       /// <summary>

       /// 上传文件(自动分割)

       /// </summary>

       /// <param name="filePath">待上传的文件全路径名称(@"E:/FTP/ftproot/20070228DQCK.zip")</param>

       /// <param name="hostURL">服务器的地址</param>

       /// <param name="byteCount">分割的字节大小</param>       

       /// <param name="userID">主机用户ID</param>

       /// <param name="cruuent">当前字节指针</param>

       /// <returns>成功返回"";失败则返回错误信息</returns>

        public string UpLoadFile(string filePath, string hostURL, int byteCount,string userID,long cruuent)

        {

            string tmpURL = hostURL;

            byteCount = byteCount * 1024;

            //http://localhost:8080/fism/app?service=fileupload&beanId=com.cfcc.fism.service.upload.CollFileSaveServiceImpl&action=upload&filename=AI1215900000020051130411.zip&userid=test&npos=333

            //action=length

 

            System.Net.WebClient WebClientObj = new System.Net.WebClient();

            FileStream fStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

            BinaryReader bReader = new BinaryReader(fStream);

            long length = fStream.Length;          

            string sMsg = "版式上传成功";

            string fileName = filePath.Substring(filePath.LastIndexOf('//') + 1);          

            try

            {

 

                #region 续传处理

                byte[] data;

                if (cruuent > 0)

                {

                    fStream.Seek(cruuent, SeekOrigin.Current);

                }

                #endregion 

 

                #region 分割文件上传

                for (; cruuent <= length; cruuent = cruuent + byteCount)

                {

                    if (cruuent + byteCount > length)

                    {

                        data = new byte[Convert.ToInt64((length - cruuent))];

                        bReader.Read(data, 0, Convert.ToInt32((length - cruuent)));

                    }

                    else

                    {

                        data = new byte[byteCount];

                        bReader.Read(data, 0, byteCount);

                    }

 

                    try

                    {

                        LOG.Debug(data);

 

                        //***

                        hostURL = tmpURL + "&action=upload" + "&filename=" + fileName + "&userid=" + userID + "&npos=" + cruuent.ToString();

                        byte[] byRemoteInfo = WebClientObj.UploadData(hostURL, "POST", data);

                        string sRemoteInfo = System.Text.Encoding.Default.GetString(byRemoteInfo);

 

                      //  获取返回信息

                        if (sRemoteInfo.Trim() != "")

                        {

                            sMsg =  sRemoteInfo;

                            break;

 

                        }

                    }

                    catch (Exception ex)

                    {

                        sMsg =  ex.ToString();

                        break;

                    }

                #endregion

 

                }

            }

            catch (Exception ex)

            {

                sMsg = sMsg + ex.ToString();

            }

            try

            {

                bReader.Close();

                fStream.Close();

            }

            catch (Exception exMsg)

            {

                sMsg =  exMsg.ToString();

            }

 

            GC.Collect();

            return sMsg;

        }

        #endregion

 

        #region 获取文件大小

       /// <summary>

       /// 获取远程服务器文件字节大小

       /// </summary>

       /// <param name="filePath">待上传的文件全路径名称</param>

       /// <param name="hostURL">服务器的地址</param>

       /// <param name="userID">主机用户ID</param>

       /// <returns>远程文件大小</returns>

        public long GetRemoteFileLength(string filePath, string hostURL, string userID)

       {

           long length = 0;

           System.Net.WebClient WebClientObj = new System.Net.WebClient(); 

          

           string fileName = filePath.Substring(filePath.LastIndexOf('//') + 1);

          

           hostURL = hostURL +"&action=length" + "&filename=" + fileName + "&userid=" + userID + "&npos=0" ;

          

           byte[] data = new byte[0];

           byte[] byRemoteInfo = WebClientObj.UploadData(hostURL , "POST", data);

           string sRemoteInfo = System.Text.Encoding.Default.GetString(byRemoteInfo);//主系统没有作异常处理

           try

           {

               length = Convert.ToInt64(sRemoteInfo);

           }

           catch (Exception exx)

           {

               LOG.Error("FileLibGetRemoteFileLength()length = Convert.ToInt64(sRemoteInfo)语句异常:" + exx.Message);//我们强制处理异常

               length = 0;

           }

           GC.Collect();

 

           return length;

 

       }

 

       /// <summary>

       /// 获得本地文件字节大小

       /// </summary>

       /// <param name="filePath">本地文件全路径</param>

       /// <returns>本地文件字节大小</returns>

       public long GetLocalFileLength(string filePath)

       {

           long length = 0;

           try

           {

               string fileName = filePath.Substring(filePath.LastIndexOf('//') + 1);

               FileStream s = new FileStream(filePath, FileMode.Open);

               length = s.Length;

               s.Close();

           }

           catch(Exception ex)

           {

               LOG.Error("FileLib类中获取本地文件大小异常:"+ex.Message);

           }

           return length;

 

       }

        #endregion

 

       #region 文件下载

       public bool DownLoadFile(string localPath, string hostURL, int byteCount, string userID, long cruuent)

       {

          

           bool result = true;

          

          

           string tmpURL = hostURL;

         

           byteCount = byteCount * 1024;

           hostURL = tmpURL + "&npos=" + cruuent.ToString();

          

           System.IO.FileStream fs; 

           fs = new FileStream(localPath, FileMode.OpenOrCreate);

           if (cruuent > 0)

           {

               //偏移指针

               fs.Seek(cruuent, System.IO.SeekOrigin.Current);

           }

 

 

           System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(hostURL);

           if (cruuent > 0)

           {

               request.AddRange(Convert.ToInt32(cruuent));    //设置Range

           }

 

           try

           {

               //向服务器请求,获得服务器回应数据流

               System.IO.Stream ns = request.GetResponse().GetResponseStream();

 

               byte[] nbytes = new byte[byteCount];

               int nReadSize = 0;

               nReadSize = ns.Read(nbytes, 0, byteCount);

             

               while (nReadSize > 0)

               {

                   fs.Write(nbytes, 0, nReadSize);

                   nReadSize = ns.Read(nbytes, 0, byteCount);

                 

               }

               fs.Close();

               ns.Close();

           }

           catch(Exception ex)

           {

               LOG.Error("下载" + localPath + "的时候失败!" + "原因是:" + ex.Message);

               fs.Close();

               result = false;

           }

       

 

           return result;

        

       }

       #endregion

 

 

   }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值