客户端 /// <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; }
- 1
- 粉丝: 55
- 资源: 32
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于python开发使用深度学习去预测股票后续的价格+源码+文档(毕业设计&课程设计&项目开发)
- flowable-designer-5.22.0.zip
- threadmanager.cpp
- 腾讯云小程序 - 一站式开发与部署平台
- 基于JSP+Java+Servlet采用MVC模式开发的购物网站+源码(毕业设计&课程设计&项目开发)
- fastgestures安装包,模拟mac的触控板收拾,两指代表右击, 三指拖拽
- 基于组态王的升降式横移立体车库控制系统+源码(毕业设计&课程设计&项目开发)
- 基于python+Django和协同过滤算法的电影推荐系统+源码(毕业设计&课程设计&项目开发)
- 环境配置 vscode+jupyter
- 项目全部代码,还包含使用到的图片