chunkupload简介

chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单。

从整体上讲,chunkupload会对文件进行切片处理,每个切片4M大小,默认情况下,chunkupload不会对切片进行合并,笔者也不建议在上传文件时对切片进行合并,虽然chunkupload支持这项操作。

对于客户端(浏览器)而言,chunkupload组件会在客户端计算文件MD5,为了尽可能提高计算效率,chunkupload在客户端脚本中使用了web worker,因此,客户端兼容性会受到较为严重的影响。

对于服务端而言,通过文件MD5+文件大小,唯一确定一个文件,并且基于文件MD5前6位,每两位作为一级目录,自动生成分散的目录结构,假如文件MD5为[071287fffa974b878732a7a17858be36],那么生成的目录结构如下:[自定义的rootpath] + [/07/12/87/] +[文件MD5+文件长度]。文件目录下的文件结构如下图:

其中,文件信息中包含:文件状态(是否上传完成)、文件MD5、文件大小、切片数量、每一个切片的序号+MD5信息。

目前chunkupload通过servlet实现与浏览器的交互,完成了基于浏览器的断点续传,实际上,使用者完全可以调用chunkupload核心类库自行操作文件,比如切片合并操作。

总的来说,chunkupload具有如下特性:

· 实现断点续传。

· 对于同一个文件,允许多用户上传,并且上传的用户越多,上传越快。

· 线程安全。

· 进程安全(同一物理机,非集群环境)。

由于chunkupload目前还处于测试阶段,过多的技术细节,笔者说多了也是白费,为了不做井底之蛙,公布chunkupload有如下几个期望:

· 确定当前的模式是否符合大众需求。

· 确定是否有可能用于生产环境。

· 确定是否存在潜在的不可行因素。

· 积极改进chunkupload。

总之,希望大家能给我一些建议,笔者水平有限,希望chunkupload最终能成为一个优秀的开源项目。

感受一下chunkupload使用方法

服务端

引用chunkupload.jar包,chunkupload.jar无任何第三方依赖。

在项目web.xml中配置chunkupload servlet。

 <servlet>
<servlet-name>ChunkUpload</servlet-name>
<servlet-class>com.iyangyuan.chunkupload.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChunkUpload</servlet-name>
<url-pattern>/chunkupload/*</url-pattern>
</servlet-mapping>

客户端(浏览器)

引用dawn.js,用于计算文件MD5,dawn.js算是chunkupload的一个附属项目。

引用chunkupload.js,用于与服务端进行交互,chunkupload.js核心思想是只关注交互,不关注具体UI展现,因为各个产品UI不尽相同,chunkupload.js不对UI做过多限制、干扰。

无任何第三方依赖。

 <html>
<head>
<title>ChunkUpload 文件上传示例</title>
<meta charset="utf-8">
<meta name="viewport" id="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<style>
body{
font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body > div {
width: 200px;
margin: 20px auto 0 auto;
}
body > div.form {
text-align: center;
}
body > div.form > input {
margin-top: 12px;
border: 1px dashed #dcdcdc;
padding: 4px 8px;
cursor: pointer;
background-color: transparent;
color: #686868;
font-family: inherit;
outline: none;
}
body > div.form > input.button {
font-size: 15px;
line-height: 29px;
padding: 0 10px;
}
body > div.form > input:hover {
background-color: #f5f5f5;
}
div.info > div{
margin: auto;
height: 31px;
width: 88px;
background: url('data:image/gif;base64,R0lGODlhWAAfAMMBAAAAAP////XcoPDLdfTboP+dzv+z2f+AwP9brfPZoAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFFAAKACwAAAAAWAAfAAAE/xDISau9OOvNd/hgKI5kaZ5oWkqB4L5wLM90bd+4PLB57//A2g7QChqPyNiwmGw6c8undKrj/STULC3qAxQAMKw0IUiYyy6yWf3j5rwGsMsrd5JfdzQelre5bxIFcROCdUBneWx6aHd9UFY1hAaTAJQTRo6LfYl8i0KQMoGCk6Slg0FsnGmdq3uZSpBiAnCmtaWGqK4yiq2eVURzwbS2pBK3hzabezOvLlxyYMPEg5aXWk1uWNLTxaOU10lR2oHckwcHlIWn4Ed/c97ECOfocJWy7EDus/C28udx8HAlaZYP1ItttRAgKEYBGS9NelL10LevnC2BR1RhM3iwAD9uGE5/NBvpg+IcLx5BhvTxiiDBGSYPivJI0xo+JzHfZfjyxNHDGC9/MaFhb0bRmzg5hoqE9EnOpk2XDJhKtarVq1izat3KtSvWDmDDih0LNgIAIfkEBRQACgAsAwAGADEAFgAABJ9QyEmrBMDqzbsFRTZh3pacZQUaogC2qZRQc4oVLLbCaS2XOpyBNdTxYjPf5iYcOp+kmCfqaj6vUClHlFlhr5is9nOpfsGAonGs6lrPUOvR1r3BnYdDEZemskdvWAh5ejs5fyqBV4N5LHKIiXcGCAhORnMmAkoUXpJgkEsFimeYPVsgond+oEtMoq86rJpTIZdBpbIjLBp9spu8W7nCshEAIfkEBRQACgAsAwAFADoAFgAABLdQyEmrAMDqzWXySdhZQJFN2KhS30oWxnmZrtp++IrB2B7XNmAPZogVezKgJidobXbEonSaUjaZE2erOpt6vz+gk5VFSTIlsBdDFTffnRM6qo4Bjkirbl4Hp6VJHTdxaD59BgcHRzx2ei5/dQiJiml3XI5xdGCSiTF0gZhPml8ICIB5oSqQh22pjwWjdaAuOWNjJCWwfZeuWoS5sME9rh4VtxolSMo0vXqWyGHESyOzZ9LHx9LaAhEAIfkEBRQACgAsAgAFAEQAFgAABMtQyEmrvTjrmmT63VYBgGieVIhSQFFO5CpPYWefrfEK7T5fto+g9iMVdKSc75dqOlWZ5NGgoyaXK6HqNvR4vxbjlEoux2ZQcHrL2uXK8DhWdGODo5LSO24GmJlqXSIvemN8Vn5ISVkaaRgxe4dwkXOAGpBGkmQHB1ZHfmeWRYZ8CJydSkiiTJGlpzqGlauDpHEICGRXsrMbrZq5THVPXcJhBbWSu2g0MmLIucona4BSx9YuoaKOzBbbMNi6RtHaRToXoLyO3nfneLw/EQAh+QQFFAAKACwCAAUASwAXAAAE3lDISau9OOtdE/9gKI4aAJDo5qUSUJyTyVJeYgtrfeesa8ACF5C1khSLuEkNZSr8TL4haKdMWpM8o/YDdRp+X6iUg9xer2VR0/ttu2Wh5bFKP5eAPrd+P55W00t2FjAneXtvAG9xGkhzHIRBbIdhiU9QM5gxhZKTb5J9mSAyXZ1tBwdhTolwoZiGkwinqFFPrZmvh7GnP5+haTSinHsICG1ioBdywFo8WRu4pcaZjslqBcKdyGQYv2ZcLtelrCS/3YKia9fql7btgy/HXdofZYHVTD8Xq+78FMjz/TBEAAA7') no-repeat center center;
padding: 2px;
box-sizing: border-box;
}
div.info > div > p{
text-align: right;
font-size: 12px;
margin: 0;
}
</style>
</head>
<body>
<!-- 表单部分 -->
<div class="form">
<input id="bigFile" type="file" placeholder="选择一个文件" />
<input id="execBtn" class="button" type="button" value="上传" />
</div>
<!-- 上传进度展示 -->
<div class="info">
<div>
<!-- 提示文本 -->
<p id="text"></p>
<!-- 执行进度 -->
<p id="progress"></p>
</div>
</div>
</body>
<script src="/static/lib/dawn/dawn.js"></script>
<script src="/static/lib/chunkupload/chunkupload.js"></script>
<script>
var fileInput = document.getElementById("bigFile"),
execBtn = document.getElementById("execBtn"),
text = document.getElementById("text"),
progress = document.getElementById("progress"); execBtn.addEventListener("click", function(e) {
var file, cu;
file = fileInput.files[0];
cu = new ChunkUpload(file);
cu.upload({
"success": function(block){
/**
* 上传成功后,会返回一个block对象
* 通过block对象,可以在一定程度上管理文件,目前支持:
* 获取文件信息(参见info_example.html)
* 删除文件(参见delete_example.html)
*/
text.innerText = "上传完成";
},
"error": function(e){
text.innerText = e;
progress.innerText = "";
},
"md5Progress": function(n){
text.innerText = "计算MD5";
progress.innerText = n + "%";
},
"uploadProgress": function(n){
text.innerText = "正在上传";
progress.innerText = n + "%";
}
});
});
</script>
</html>

通过以下四个回调,与UI进行交互,完成文件上传。

·success上传成功回调

·error 异常回调

·md5Progress MD5计算进度回调

·uploadProgress 上传进度回调

目前项目基本完成,注释详尽,发布指日可待~

chunkupload文件上传断点续传组件(java)的更多相关文章

  1. chunkupload 文件上传断点续传组件(java) - 正式发布

    chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. chunkupload实现如下功能: ·  实现断点续传 ·  ...

  2. Asp.net mvc 大文件上传 断点续传

    Asp.net mvc 大文件上传 断点续传 进度条   概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...

  3. 文件上传plupload组件使用

    这段时间一直在使用文件上传,简要的介绍一下文件上传的组件使用,先上一段代码. var uploader = new plupload.Uploader( { //用来指定上传方式,指定多个上传方式请使 ...

  4. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  5. java基础篇---文件上传(smartupload组件)

    文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本篇主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用 ...

  6. java 大文件上传 断点续传 完整版实例 (Socket、IO流)

    ava两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...

  7. JAVA大文件上传断点续传解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  8. H5+JAVA的文件上传,断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  9. js文件上传下载组件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

随机推荐

  1. OSGi规范的C#实现开源

    这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...

  2. Spring(三)__aop编程

    aop( aspect oriented programming ) 面向切面编程,是对所有对象或者是一类对象编程 几个重要的概念: 1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面 ...

  3. iOS 后台处理

    iOS 后台处理的常见用途 1.进入后台时候删除资源:应用处于挂起状态的时候所占用的资源越少,该应用被iOS终止的风险就越低.通过从内存中清理那些易于重新创建的资源,可以增加应用驻留内存的机会,因此可 ...

  4. BPM费控管理解决方案分享

    一.方案概述费用是除经营成本外企业的最主要支出,费用管理是财务管理的核心之一,加强企业内控管理如:费用申请.费用报销.费用分摊.费用审批.费用控制和费用支付等,通过科学有效的管理方法规范企业费用管理, ...

  5. 读过MBA的CEO更自私?《哈佛商业评论》2016年第12期。4星

    老牌管理杂志.每期都值得精度.本期我还是给4星. 以下是本书中的一些内容的摘抄: 1:他们发现在Airbnb上,如果客人姓名听起来像黑人,那么比名字像白人的客人的接受率会低16%.#45 2:对立组织 ...

  6. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  7. 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)

    前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...

  8. Webgl的2D开发方案(一)spritebatcher

    使用TypeScript 和 webgl 开发   第一步:实现了SpriteBatcher 例子如下 http://oak2x0a9v.bkt.clouddn.com/test/index.html ...

  9. Html5 Json应用

    本文主要说明Json的基本概念,和一个在Html中使用Json给元素赋值的小例子,属于基础性信息 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Obj ...

  10. 基于Caffe的DeepID2实现(下)

    小喵的唠叨话:这次的博客,真心累伤了小喵的心.但考虑到知识需要巩固和分享,小喵决定这次把剩下的内容都写完. 小喵的博客:http://www.miaoerduo.com 博客原文: http://ww ...