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 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
js 处理数组重复元素示例代码
Dec 27 Javascript
学习javascript面向对象 理解javascript对象
Jan 04 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
Aug 25 Javascript
原生JS下拉加载插件分享
Dec 26 Javascript
bootstrap组件之导航组件使用方法
Jan 19 Javascript
JS异步文件上传(兼容IE8+)
Apr 02 Javascript
详解用webpack2.0构建vue2.0超详细精简版
Apr 05 Javascript
JavaScript运动框架 多物体任意值运动(三)
May 17 Javascript
vue元素实现动画过渡效果
Jul 01 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 Javascript
vue实现可移动的悬浮按钮
Mar 04 Vue.js
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生成PDF方法详解
2015/01/23 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
php微信公众号开发模式详解
2016/11/28 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
入党自荐书范文
2014/03/09 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
狮子林导游词
2015/02/03 职场文书
怎样写辞职信
2015/02/27 职场文书
简历中自我评价范文
2015/03/11 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书