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

发布时间 - 2026-01-10 22:06:05    点击率:

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

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

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

前端代码: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指定断点操作实例教程  # 上传  # 小编  # 上传文件  # 分片  # 大文件  # 首次  # 在此  # 中有  # 给大家  # 这篇  # 经常会  # 所述  # 给我留言  # 放上  # 前先  # 感谢大家  # 疑问请  # 有任何  # 下午  # 博客 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何快速搭建高效WAP手机网站?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel如何处理异常和错误?(Handler示例)  Android使用GridView实现日历的简单功能  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  高端企业智能建站程序:SEO优化与响应式模板定制开发  UC浏览器如何设置启动页 UC浏览器启动页设置方法  装修招标网站设计制作流程,装修招标流程?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  如何用低价快速搭建高质量网站?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  使用C语言编写圣诞表白程序  EditPlus中的正则表达式实战(5)  php结合redis实现高并发下的抢购、秒杀功能的实例  java中使用zxing批量生成二维码立牌  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何选择PHP开源工具快速搭建网站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Android利用动画实现背景逐渐变暗  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Firefox Developer Edition开发者版本入口  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Python进程池调度策略_任务分发说明【指导】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何在建站之星绑定自定义域名?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何在建站主机中优化服务器配置?  jQuery 常见小例汇总  Laravel模型事件有哪些_Laravel Model Event生命周期详解  如何在橙子建站上传落地页?操作指南详解