C# 断点续传 上传、下载文件处理

用 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("FileLib类GetRemoteFileLength()中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


   }
}


原文:http://blog.csdn.net/lijiangchxp2005/archive/2008/04/22/2315105.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传 断点上传 客户端 /// <summary> /// 服务器端地址,部署时为Web端的地址,可以用配置文件实现 /// </summary> public static string serverPath; /// <summary> /// 上传文件(按照文件名称上传支持断点) /// </summary> /// <param name="fileName">待上传文件全路径</param> /// <param name="byteCount">上传时的流量控制,文件较大时,用于切割文件上传</param> /// <param name="msg">错误信息</param> /// <returns>成功或者失败</returns> public static bool UpLoadFile(string fileName, int byteCount,out string msg) { msg = ""; bool result = true; long cruuent = GetServerFileLength(fileName); FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader bReader = new BinaryReader(fStream); long length = fStream.Length; fileName = fileName.Substring(fileName.LastIndexOf('\\') + 1); #region 开始上传文件 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 { Hashtable parms = new Hashtable(); parms.Add("fileName", fileName); parms.Add("npos", cruuent.ToString()); parms.Add("method", "SaveUpLoadFile"); byte[] byRemoteInfo = PostData(serverPath, data, parms); } catch (Exception ex) { msg = ex.ToString(); result = false; break; } #endregion } } catch (Exception ex) { throw ex; } finally { bReader.Close(); fStream.Close(); } GC.Collect(); #endregion return result; } /// <summary> /// 调用服务器端方法,或者服务器端,同名称的文件,已经上传的大小 /// </summary> /// <param name="fileName">待上传文件全路径</param> /// <returns>服务器文件的大小,如果以前没有上传过,则返回0</returns> private static long GetServerFileLength(string fileName) { fileName = fileName.Substring(fileName.LastIndexOf('\\') + 1); Hashtable parms = new Hashtable(); parms.Add("fileName", fileName); parms.Add("method", "GetServerFileLength"); long length = 0; byte[] data = new byte[0]; byte[] byRemoteInfo = PostData(serverPath, data, parms); string sRemoteInfo = System.Text.Encoding.Default.GetString(byRemoteInfo); length = Convert.ToInt64(sRemoteInfo); return length; } /// <summary> /// 向服务器端提交数据 /// </summary> /// <param name="serverURL">服务器端地址</param> /// <param name="data">要发送的数据</param> /// <param name="parms">附加参数,用URL的方式将此参数附件到地址中</param> /// <returns>服务器端返回的 byte[]</returns> private static byte[] PostData(string serverURL, byte[] data, Hashtable parms) { System.Net.WebClient webClientObj = new System.Net.WebClient(); if (parms != null) { serverURL = serverURL + "?"; foreach (string key in parms.Keys) { serverURL = serverURL + key + "=" + parms[key].ToString() + "&"; } serverURL.TrimEnd('&'); } byte[] byRemoteInfo = webClientObj.UploadData(serverURL, "POST", data); return byRemoteInfo; } 接收端 /// <summary> /// 保存文件(从URL参数中获取文件名、当前指针,将文件流保存到当前指针后) /// 如果是第一次上传,则当前指针为0,代码执行与续传一样,只不过指针没有偏移 /// </summary> /// <param name="fileName">文件名</param> /// <param name="npos">当前指针偏移</param> /// <returns></returns> public int SaveUpLoadFile(string fileName, long npos) { int upLoadLength = Convert.ToInt32(HttpContext.Current.Request.InputStream.Length); string file = HttpContext.Current.Server.MapPath("/" + fileName); //string path = HttpContext.Current.Server.MapPath("/"); //fileName = path + "UpLoad\\" + fileName; FileStream fStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite); //偏移指针 fStream.Seek(npos, SeekOrigin.Begin); //从客户端的请求中获取文件流 BinaryReader bReader = new BinaryReader(HttpContext.Current.Request.InputStream); try { byte[] data = new byte[upLoadLength]; bReader.Read(data, 0, upLoadLength); fStream.Write(data, 0, upLoadLength); return 1; } catch { //TODO 添加异常处理 } finally { //释放流 fStream.Close(); bReader.Close(); } return -1; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值