基本信息
源码名称:C# 断点传输 实例源码下载(上传)
源码大小:0.06M
文件格式:.zip
开发语言:C#
更新时间:2016-05-30
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 2 元 
   源码介绍
,好用的断点传输,

客户端代码:

/*
 * 作者:chxp
 * 
 * 本类用于客户端文件上传、获取服务器端文件大小等
 * 
 */
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Collections;

namespace UpLoadClient
{
    public  class UpLoadLib
    {
        /// <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());

                          byte[] byRemoteInfo = PostData(serverPath   "UpLoadSer.aspx", 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);
            long length = 0;
            byte[] data = new byte[0];
            byte[] byRemoteInfo = PostData(serverPath   "GetFileLength.aspx", 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;

        }


        #region 测试断点上传
        /// <summary>
        /// 测试上传100个字节(仅仅只有用于模拟断点,在真实环境中无用处)
        /// </summary>
        /// <param name="fileName">文件全路径</param>
        /// <param name="byteCount">上传时的流量控制,文件较大时,用于切割文件上传</param>
        /// <param name="msg">错误信息</param>
        /// <returns>成功或者失败</returns>
        public static bool UpLoadFileTest(string fileName, int byteCount, out string msg)
        {
            msg = ""; 
            bool result = true;
            long cruuent = 0;

            FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            BinaryReader bReader = new BinaryReader(fStream); 
            
            //模拟断点上传,第一次只上传 100 个字节
            long length = 100;

            fileName = fileName.Substring(fileName.LastIndexOf('\\')   1);

            #region 开始上传文件
            try
            {

                
                byte[] data; 
                #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());

                        byte[] byRemoteInfo = PostData(serverPath   "UpLoadSer100.aspx", data, parms);

                    }
                    catch (Exception ex)
                    {
                        msg = ex.ToString();
                        result = false;
                        break;
                    }
                #endregion
                }
            }
            catch (Exception ex)
            {
                msg = ex.ToString();
                result = false;
            }
            finally
            {
                bReader.Close();
                fStream.Close();

            }

            GC.Collect();



            #endregion

            return result;

        }
        #endregion 

    }
}

服务端代码:

/*
 * 作者:chxp
 * 
 * 断点传输时的服务器端接收页面,将客户端上传的文件流,根据指针信息,保存到同名的文件流中,体现了“ 续”
 * 
 */
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;

public partial class UpLoadSer : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //服务器端保存续传的文件
        SaveUpLoadFile();

    }

    /// <summary>
    /// 保存文件(从URL参数中获取文件名、当前指针,将文件流保存到当前指针后)
    /// 如果是第一次上传,则当前指针为0,代码执行与续传一样,只不过指针没有偏移
    /// </summary>
    public void SaveUpLoadFile()
    {

        string fileName = Request.Params["fileName"];
        long npos = Convert.ToInt64(Request.Params["npos"]);

        int upLoadLength = Convert.ToInt32(Request.InputStream.Length);
       
        string path = Server.MapPath("/UpLoadServer");
        fileName = path   "//UpLoad//"   fileName;

        FileStream fStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        //偏移指针
        fStream.Seek(npos, SeekOrigin.Begin);

        //从客户端的请求中获取文件流
        BinaryReader bReader = new BinaryReader(Request.InputStream);
        try
        {
            byte[] data = new byte[upLoadLength];
            bReader.Read(data, 0, upLoadLength);
            fStream.Write(data, 0, upLoadLength);
        }
        catch
        {
            //TODO 添加异常处理
        }
        finally
        {
            //释放流
            fStream.Close();
            bReader.Close();
        }
    }

   

}