全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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异步文件分片断点上传的实现思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # 异步上传  # 断点上传  # 使用Chrome调试JavaScript的断点设置和调试技巧  # 使用Firebug对js进行断点调试的图文方法  # js调试系列 断点与动态调试[基础篇]  # 基于JavaScript实现前端文件的断点续传  # javascript调试之DOM断点调试法使用技巧分享  # JavaScript代码判断点击第几个按钮  # Chrome调试折腾记之JS断点调试技巧  # 前端js实现文件的断点续传 后端PHP文件接收  # chrome浏览器如何断点调试异步加载的JS  # JavaScript指定断点操作实例教程  # 上传  # 小编  # 上传文件  # 分片  # 大文件  # 首次  # 在此  # 中有  # 给大家  # 这篇  # 经常会  # 所述  # 给我留言  # 放上  # 前先  # 感谢大家  # 疑问请  # 有任何  # 下午  # 博客 


相关文章: 如何快速选择适合个人网站的云服务器配置?  如何在建站之星绑定自定义域名?    如何将凡科建站内容保存为本地文件?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  网站企业制作流程,用什么语言做企业网站比较好?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  独立制作一个网站多少钱,建立网站需要花多少钱?  香港服务器如何优化才能显著提升网站加载速度?  建站之星后台管理如何实现高效配置?  宝塔新建站点报错如何解决?  宝塔建站无法访问?如何排查配置与端口问题?  内网网站制作软件,内网的网站如何发布到外网?  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  如何高效配置香港服务器实现快速建站?  如何通过多用户协作模板快速搭建高效企业网站?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  PHP 500报错的快速解决方法  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  ,sp开头的版面叫什么?  海南网站制作公司有哪些,海口网是哪家的?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何快速搭建虚拟主机网站?新手必看指南  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  动图在线制作网站有哪些,滑动动图图集怎么做?  javascript中的try catch异常捕获机制用法分析  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  C#怎么使用委托和事件 C# delegate与event编程方法  b2c电商网站制作流程,b2c水平综合的电商平台?  5种Android数据存储方式汇总  如何通过cPanel快速搭建网站?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  高端建站三要素:定制模板、企业官网与响应式设计优化  历史网站制作软件,华为如何找回被删除的网站?  建站主机与服务器功能差异如何区分?  香港服务器租用费用高吗?如何避免常见误区?  如何快速使用云服务器搭建个人网站?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  XML的“混合内容”是什么 怎么用DTD或XSD定义  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  python的本地网站制作,如何创建本地站点?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  建站之星安装失败:服务器环境不兼容?  建站之星导航配置指南:自助建站与SEO优化全解析  香港服务器选型指南:免备案配置与高效建站方案解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。