b/s实现大文件上传分片上传断点续传
关键部分
前端用file.slice()分块
前端用FileReader获取每一分块的md5值
后端用MultipartFile接受分块文件
后端用FileOutputStream拼装分块文件
话不多说,直接上代码,我想这是你们最喜欢的
工程截图

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String clientCookie = request.getHeader("Cookie");
%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>up6.2-MySQL演示页面</title>
<link href="js/up6.css" type="text/css" rel="Stylesheet"/>
<script type="text/javascript" src="js/jquery-1.4.min.js"></script>
<script type="text/javascript" src="js/json2.min.js" charset="utf-8"></script>
<script type="text/javascript" src="js/up6.config.js" charset="utf-8"></script>
<script type="text/javascript" src="js/up6.app.js" charset="utf-8"></script>
<script type="text/javascript" src="js/up6.edge.js" charset="utf-8"></script>
<script type="text/javascript" src="js/up6.file.js" charset="utf-8"></script>
<script type="text/javascript" src="js/up6.folder.js" charset="utf-8"></script>
<script type="text/javascript" src="js/up6.js" charset="utf-8"></script>
<script language="javascript" type="text/javascript">
var cbMgr = new HttpUploaderMgr();
cbMgr.event.md5Complete = function (obj, md5) { /*alert(md5);*/ };
cbMgr.event.fileComplete = function (obj) { /*alert(obj.pathSvr);*/ };
cbMgr.Config["Cookie"] = 'JSESSIONID=<%=request.getSession().getId()%>';
cbMgr.Config.Fields["test"] = "test";
$(function()
{
cbMgr.load_to("FilePanel");//加载控件
});
</script>
</head>
<body>
<p>up6.2多文件上传演示页面</p>
<div id="FilePanel"></div>
<div id="msg"></div>
</body>
</html>
文件MD5计算
/**
* 把文件转成md5字符串
* @param file
* @return
*/
public static String fileToMD5(File file) {
if(file == null) {
return null;
}
if(file.exists() == false) {
return null;
}
if(file.isFile() == false) {
return null;
}
FileInputStream fis = null;
try {
//创建一个提供信息摘要算法的对象,初始化为md5算法对象
MessageDigest md = MessageDigest.getInstance("MD5");
fis = new FileInputStream(file);
byte[] buff = new byte[1024];
int len = 0;
while(true) {
len = fis.read(buff, 0, buff.length);
if(len == -1){
break;
}
//每次循环读取一定的字节都更新
md.update(buff,0,len);
}
//关闭流
fis.close();
//返回md5字符串
return bytesToHex(md.digest());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
文件夹文件夹名称生成逻辑
package up6.biz;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import up6.model.FileInf;
public class PathBuilderUuid extends PathBuilder{
/* 生成文件夹存储路径,完全与客户端文件夹结构保持一致
* 格式:
* upload/2016/05/17/uuid/folder_name
* 更新记录:
* 2016-03-01 upload/uid/folders/uuid/folder_name
* 2016-05-17 将格式改为日期格式
*
*/
public String genFolder(int uid,String nameLoc) throws IOException
{
SimpleDateFormat fmtDD = new SimpleDateFormat("dd");
SimpleDateFormat fmtMM = new SimpleDateFormat("MM");
SimpleDateFormat fmtYY = new SimpleDateFormat("yyyy");
Date date = new Date();
String strDD = fmtDD.format(date);
String strMM = fmtMM.format(date);
String strYY = fmtYY.format(date);
String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-","");
String path = this.getRoot() + "/";
path = path.concat(strYY);
path = path.concat("/");
path = path.concat(strMM);
path = path.concat("/");
path = path.concat(strDD);
path = path.concat("/");
path = path.concat(uuid);
path = path.concat("/");
path = path.concat(nameLoc);
return path;
}
/* 保留原始文件名称,不检查文件是否重复
* 格式:
* upload/uid/年/月/日/uuid/file_name
* @see Xproer.PathBuilder#genFile(int, Xproer.xdb_files)
*/
public String genFile(int uid,FileInf f) throws IOException{
String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-", "");
SimpleDateFormat fmtDD = new SimpleDateFormat("dd");
SimpleDateFormat fmtMM = new SimpleDateFormat("MM");
SimpleDateFormat fmtYY = new SimpleDateFormat("yyyy");
Date date = new Date();
String strDD = fmtDD.format(date);
String strMM = fmtMM.format(date);
String strYY = fmtYY.format(date);
String path = this.getRoot() + "/";
path = path.concat(strYY);
path = path.concat("/");
path = path.concat(strMM);
path = path.concat("/");
path = path.concat(strDD);
path = path.concat("/");
path = path.concat(uuid);
path = path.concat("/");
path = path.concat(f.nameLoc);
return path;
}
}
文件上传的效果

文件保存位置及逻辑
在up6中有两种保存模式,一种是md5一种是uuid。
md5由PathBuilderMd5生成存储路径。md5主要提供给文件使用,可在服务器端保存唯一的文件,有效避免重复文件。
uuid由PathBuilderUuid生成存储路径。uuid主要提供给文件夹使用,可以与本地文件夹结构完全保持一致。使用uuid模式上传文件夹时秒传功能会失效。
文件默认保存位置在项目路径下:

demo会自动生成upload文件夹
规则:upload/年/月/日/md5

代码截图:



文件逻辑:

生成文件服务器存储路径

文件夹逻辑:


生成文件夹存储路径

生成子文件路径

生成子目录路径

详细信息可以参考这篇文章:http://blog.ncmem.com/wordpress/2019/11/20/net%e4%b8%8a%e4%bc%a0%e5%a4%a7%e6%96%87%e4%bb%b6%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/
b/s实现大文件上传分片上传断点续传的更多相关文章
- 打造 html5 文件上传组件,实现进度显示及拖拽上传,支持秒传+分片上传+断点续传,兼容IE6+及其它标准浏览器
老早就注册了博客园帐号,昨天才发现,连博客都没开,Github也是一样,深觉惭愧,赶紧潜个水压压惊`(*∩_∩*)′ 言归正传.大概许多人都会用到文件上传的功能,上传的库貌似也不少,比如(jQuery ...
- MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片
MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...
- js实现大文件上传分片上传断点续传
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- php实现大文件上传分片上传断点续传
前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...
- 使用webuploader实现大文件上传分片上传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- web实现大文件上传分片上传断点续传
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- java实现大文件上传分片上传断点续传
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- Asp.net 使用Neatupload 第三方控件上传大文件,在IIS7上无法正常工作解决
使用环境:Window Server2008 + IIS7 更改web.config配置 1.在<configSections></configSections>节内加入: & ...
- 求大师点化,寻求大文件(最大20G左右)上传方案
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- golang gin框架中实现大文件的流式上传
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...
随机推荐
- example
import pandas as pd import numpy as np import os,sys df = pd.read_excel("C:\\Users\\ryanzhang\\ ...
- Feign 失败降级未生效和超时配置优先级问题
一.问题: 生产环境服务A 通过feign调用 服务B,服务A报警信息如下: 详细分析发现问题 (1)服务A调用服务B失败,未触发声明的失败降级操作 (2)同时配置ribbon和feign超时时间,优 ...
- Linux环境python3.6.5
安装python3.6可能使用的依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel r ...
- Web SSH远程连接利器:gotty
Web SSH远程连接利器:gotty 这个东东能让你使用浏览器连接你远程的机器! 一. 环境准备 下载https://github.com/yudai/gotty. 请先配置好 Golang 环境, ...
- 【转】使用Dockerfile构建镜像并push到私有仓库
环境:OS X 10.10.5 maven 3.3.9 Docker version 1.12.2 docker-machine version 0.8.2 程序示例为http://www.cnblo ...
- vue刷新页面出现闪烁
在容器里添加v-cloak <div class="box" id="call-no-list" v-cloak></div> 然后在c ...
- Thread-specific data(TSD)线程私有数据
Thread-specific data(TSD)线程私有数据 http://blog.chinaunix.net/uid-26885237-id-3209913.html linux多线程编程中引入 ...
- MyBatis 中#和$符号的区别
#相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...
- 返璞归真——OO第四单元总结暨学期总结
本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...
- 一分钟读懂低功耗蓝牙(BLE)连接数据包
一分钟读懂低功耗蓝牙(BLE)连接数据包 1.概述 BLE 连接过程中有三个重要的数据包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ. SCAN_REQ: 扫描请求,由主设备(M ...