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. 【从零开始学BPM,Day1】工作流管理平台架构学习

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第一天课程] Step 1 软件下载:H3 BPM10.0全开 ...

  2. 解决:SharePoint当中的STP网站列表模板没有办法导出到其它语言环境中使用

    首在在你的英文版本上,导出列表或是网站的模板,这个文件可能是这样滴:template.stp 把这个文件 template.stp 命名为 template.cab 解压 这个 *.cab 文件 在解 ...

  3. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  4. 项目游戏开发日记 No.0x000001

    14软二杨近星(2014551622) 既然已经决定了开发软件, 时不时就要练练手, 还要时不时的去寻找素材, 因为开发的人物设定就是DotA2里面的祈求者, 所以, 就去找了他的相关人物图片和模型, ...

  5. 如何使用RobotFramework编写好的测试用例

    如何使用Robot Framework编写优秀的测试用例 概述 命名 测试套件命名 测试用例命名 关键字命名 setup和teardown的命名 文档 测试套件文档 测试用例文档 用户关键字文档 测试 ...

  6. Vue.js——60分钟组件快速入门(下篇)

    概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子组件中定义props,可以让父组件的数据传递下来,这就好比子组件告诉父组件:"嘿,老哥,我开 ...

  7. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  8. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  9. 疯狂的JSONP

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...

  10. Spring Boot -- Start Up

    做Java Web的同学,都知道项目启动需要放到servlet容器里面运行,无论是使用哪一款IDE,都是非常麻烦的一件事情.在很早之前,一个servlet容器下可以放下很多的项目,并一起运行,而到现在 ...