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

这篇博客适合有一些后台基础的朋友,或者有后台配合的前端。
这里需要后台提供两个接口,一个上传文件的接口,一个查询已上传文件大小的接口。
前端代码: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小时内与您取得联系。