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 'ejs'的解决办法
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
Python进程池调度策略_任务分发说明【指导】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在建站之星绑定自定义域名?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
如何在建站主机中优化服务器配置?
jQuery 常见小例汇总
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何在橙子建站上传落地页?操作指南详解

