项目作者: dungang

项目描述 :
分片上传项目是根据AJAX文件上传前端框架 fex-team/webuploader 开发的后台,如果您的前端组件也满足该组件的上传机制,也是可以通用的
高级语言: Java
项目地址: git://github.com/dungang/chunked-uploader.git
创建时间: 2018-07-12T02:37:51Z
项目社区:https://github.com/dungang/chunked-uploader

开源协议:

下载


Chunked Uploader

分片文件上传,本项目是根据AJAX文件上传前端框架 fex-team/webuploader 开发的后台,如果您的前端组件也满足该组件的上传机制,也是可以通用的。

本项目适合分片上传图片的场景,如果您是普通上传文件,本项目暂时不支持,建议直接使用您的项目所使用的framework提供的文件上传更加高效。

注意事项

  • 不支持删除文件(完成开发)
  • 不支持列出文件(废弃,通过读取磁盘获取文件的列表效率不高,不如用数据库存储文件的存储相对路径,通过数据查询更加方便,开发者可以自己实现)

maven

  1. <dependency>
  2. <groupId>com.geetask</groupId>
  3. <artifactId>chunked-uploader</artifactId>
  4. <version>1.0.2</version>
  5. <!--exclusions>
  6. <exclusion>
  7. <groupId>org.slf4j</groupId>
  8. <artifactId>slf4j-api</artifactId>
  9. </exclusion>
  10. <exclusion>
  11. <groupId>org.slf4j</groupId>
  12. <artifactId>slf4j-log4j12</artifactId>
  13. </exclusion>
  14. <exclusion>
  15. <groupId>javax.servlet</groupId>
  16. <artifactId>javax.servlet-api</artifactId>
  17. </exclusion>
  18. </exclusions-->
  19. </dependency>

关于uploadId

  • 全局唯一
  • 最好每次打开上传的窗口重新生成
  • 如果网站的上传图片并发不高,可以使用UUID来生成
  • 如果并发高可以考虑面向服务的全局id生成器,比如snowflake算法

使用方法

1.实例化storage

后端以springboot为例

  1. @Bean
  2. public AbstractStorage storage() {
  3. return new FileStorage();
  4. }
  1. 获取文件上传的服务器参数
参数 required 说明
name 必须 原始文件名称,包括文件后缀
type 必须 文件类型,image/jpeg
timestamp 必须 时间戳,同一个页面可以使用同一个时间戳

前端以fex-webuploader 为例

  1. //当前页面,生成时间戳
  2. int timestamp = Math.round(new Date().getTime()/1000);
  3. //每次发送文件的时候,获取上传的初始化参数
  4. WebUploader.Uploader.register({'before-send-file':'initUpload'},{
  5. initUpload:function(file) {
  6. var deferred = $.ajax({
  7. method:'post',
  8. url:'/init',
  9. dataType:'json',
  10. data: {
  11. name: file.name,
  12. type: file.type,
  13. timestamp: timestamp
  14. }
  15. }).then(function(res){
  16. console.log(res);
  17. file.uploadId = res.uploadId
  18. file.key = res.key
  19. });
  20. return deferred.promise();
  21. }
  22. });

后端以springboot为例

  1. @Controller
  2. public class UploaderController {
  3. @Autowired
  4. private AbstractStorage storage;
  5. @PostMapping("/init")
  6. @ResponseBody
  7. public InitResponse initUpload(HttpServletRequest request, HttpServletResponse response) {
  8. return storage.initUpload("test", request, response);
  9. }
  10. }

结果类似

  1. {
  2. "uploadId":"370af9d2-c565-4b8e-9fa4-186d150affab",
  3. "key":"uploader\\test\\905cd7faa06cee41e0deb1a0502a868c.jpg"
  4. }

3.处理上传的数据

参数 required 说明
uploadId 必须 每次发起上传文件前获取一个服务器全局唯一id,每个文件的uploadId是不同的
key 必须 是在服务器分配uploadId的时候同步返回的,是文件最终存储的路径
name 必须 原始文件名称,包括文件后缀
size 必须 原始文件的大小
type 必须 文件类型,image/jpeg
chunks 分片时必须 分片总数量
chunk 分片时必须 本次请求的分片的序号,从0开始

前端以fex-webuploader 为例

  1. // 每个分片 发送之前
  2. // 很重要, 配合最开始注册的 promise . 'before-send-file':'initUpload'
  3. uploader.on('uploadBeforeSend',function(block,data,headers){
  4. data.uploadId = block.file.uploadId;
  5. data.key = block.file.key;
  6. });

后端以springboot为例

  1. @Controller
  2. public class UploaderController {
  3. @Autowired
  4. private AbstractStorage storage;
  5. @PostMapping("/uploader")
  6. @ResponseBody
  7. public ChunkResponse handle(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException {
  8. return storage.upload(file.getInputStream(),file.getSize(),request, response);;
  9. }
  10. }

结果

  1. {
  2. "key":"uploader\\test\\905cd7faa06cee41e0deb1a0502a868c.jpg",
  3. "uploadId":"370af9d2-c565-4b8e-9fa4-186d150affab",
  4. "completed":false //表示还没完成此文件所有的分片上传
  5. }
  6. {
  7. "key":"uploader\\test\\905cd7faa06cee41e0deb1a0502a868c.jpg",
  8. "uploadId":"370af9d2-c565-4b8e-9fa4-186d150affab",
  9. "completed":true //表示已完成此文件所有的分片上传
  10. }

Demo

dungang/chunked-uploader-demo