JS异步文件分片断点上传的实现思路


Posted in Javascript onDecember 25, 2016

在项目中有时会遇到大文件上传,经常会出现链接超时的问题,所以就需要使用文件分片上传的方式来上传大文件。实现原理就是,在前端将文件分成指定大小的“文件块”,分成多次上传,每次上传前先向后台查询已经上传成功的文件的大小,然后从指定的位置切割一块文件,进行上传,后台接收到文件块后追加到指定的文件中。

这篇博客适合有一些后台基础的朋友,或者有后台配合的前端。

这里需要后台提供两个接口,一个上传文件的接口,一个查询已上传文件大小的接口。

JS异步文件分片断点上传的实现思路

前端代码:https://github.com/li5454yong/FileUpload.git

这里放上后台主要代码

package com.fs.controller;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.Iterator;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.csource.ClientGlobal;
import org.csource.common.MyException;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.Test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import com.alibaba.fastjson.JSON;
import com.fs.entity.UploadedFileInfo;
import com.fs.util.UploadUtil;
/**
 * @author admin
 *
 * 2016年12月20日下午8:59:38
 */
@Controller
public class FastDFSUpLoadController {
 @Resource
 private UploadUtil uploadUtil;
 @RequestMapping(value = "v1/uploadSize", method = RequestMethod.POST)
 @ResponseBody
 public Long uploadSize(HttpServletRequest request) {
  String name = request.getParameter("name");
  Long size = Long.parseLong(request.getParameter("size"));
  try {
   JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.0.12");
   Jedis jedis = new Jedis(jedisShardInfo);
   String str = jedis.get(name);
   UploadedFileInfo uploadedFileInfo = null;
   // 如果首次上传,已上传大小为 0
   if (StringUtils.isEmpty(str)) {
    uploadedFileInfo = new UploadedFileInfo();
    jedis.set(name, JSON.toJSONString(uploadedFileInfo));
    jedis.close();
    return 0L;
   }
   uploadedFileInfo = JSON.parseObject(str, UploadedFileInfo.class);
   jedis.close();
   //已经全部上传
   if(size <= uploadedFileInfo.getSize()){
    System.out.println("上传完成");
   }
    //UploadUtil.getFileInfo(uploadedFileInfo.getFileId());
   return uploadedFileInfo.getSize();
  } catch (Exception e) {
   e.printStackTrace();
   return 0L;
  }
 }
 @RequestMapping(value = "v1/uploadFile", method = RequestMethod.POST)
 @ResponseBody
 public int upload(HttpServletRequest request) {
  // CommonsMultipartResolver resolver = new
  // CommonsMultipartResolver(request.getSession().getServletContext());
  MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
  Iterator<String> t = multiRequest.getFileNames();
  MultipartFile fileDetail = multiRequest.getFile(t.next());
  String name = request.getParameter("name");
  JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.0.12");
  Jedis jedis = new Jedis(jedisShardInfo);
  UploadedFileInfo uploadedFileInfo = JSON.parseObject(jedis.get(name), UploadedFileInfo.class);
  uploadedFileInfo.setFileName(name);
  String path = "d:/testUpload";
  File file = new File(path);
  if (!file.exists() && !file.isDirectory()) {
   boolean b = file.mkdirs();
  }
  RandomAccessFile randomFile = null;
  try {
   randomFile = new RandomAccessFile(path+"/"+name, "rw");
   randomFile.seek(randomFile.length());
   randomFile.write(fileDetail.getBytes());
   uploadedFileInfo.setLocalPath(path+"/"+name);
   uploadedFileInfo.setSize(randomFile.length());
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   try {
    randomFile.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  // 将上传文件信息保存到redis
  jedis.set(name, JSON.toJSONString(uploadedFileInfo));
  jedis.close();
  return 0;
 }
}

以上所述是小编给大家介绍的JS异步文件分片断点上传的实现思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
特殊字符、常规符号及其代码对照表
Jun 26 Javascript
javascript闭包(Closure)用法实例简析
Nov 30 Javascript
获取阴历(农历)和当前日期的js代码
Feb 15 Javascript
Bootstrap自定义文件上传下载样式
May 26 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
通过原生JS实现为元素添加事件的方法
Nov 23 Javascript
详解用webpack2.0构建vue2.0超详细精简版
Apr 05 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
详谈vue中router-link和传统a链接的区别
Jul 22 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
Oct 27 Javascript
JavaScript分页组件使用方法详解
Jul 26 Javascript
BootStrop前端框架入门教程详解
Dec 25 #Javascript
半个小时学json(json传递示例)
Dec 25 #Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 #Javascript
JS如何生成一个不重复的ID的函数
Dec 25 #Javascript
js Canvas实现的日历时钟案例分享
Dec 25 #Javascript
ES6概念 Symbol toString()方法
Dec 25 #Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 #Javascript
You might like
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php强制运行广告的方法
2014/12/01 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
一些mootools的学习资源
2010/02/07 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
初学python数组的处理代码
2011/01/04 Python
Python生成随机验证码的两种方法
2015/12/22 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
杭州-DOTNET笔试题集
2013/09/25 面试题
武汉某公司的C#笔试题面试题
2015/12/25 面试题
应届毕业生自我鉴定范文
2013/12/27 职场文书
安全演讲稿开场白
2014/08/25 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
员工手册编写范本
2015/05/14 职场文书
毕业证明模板
2015/06/19 职场文书
车位出租协议书范本
2016/03/19 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers