基本信息
源码名称:C# 断点传输 实例源码下载(上传)
源码大小:0.06M
文件格式:.zip
开发语言:C#
更新时间:2016-05-30
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在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();
}
}
}