关键部分

前端用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实现大文件上传分片上传断点续传的更多相关文章

  1. 打造 html5 文件上传组件,实现进度显示及拖拽上传,支持秒传+分片上传+断点续传,兼容IE6+及其它标准浏览器

    老早就注册了博客园帐号,昨天才发现,连博客都没开,Github也是一样,深觉惭愧,赶紧潜个水压压惊`(*∩_∩*)′ 言归正传.大概许多人都会用到文件上传的功能,上传的库貌似也不少,比如(jQuery ...

  2. MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片

    MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...

  3. js实现大文件上传分片上传断点续传

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  4. php实现大文件上传分片上传断点续传

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  5. 使用webuploader实现大文件上传分片上传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  6. web实现大文件上传分片上传断点续传

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  7. java实现大文件上传分片上传断点续传

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  8. Asp.net 使用Neatupload 第三方控件上传大文件,在IIS7上无法正常工作解决

    使用环境:Window Server2008 + IIS7 更改web.config配置 1.在<configSections></configSections>节内加入: & ...

  9. 求大师点化,寻求大文件(最大20G左右)上传方案

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  10. golang gin框架中实现大文件的流式上传

    一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...

随机推荐

  1. robotFramework_Jquery语法

    向您的页面添加 jQuery 库 jQuery 库位于一个 JavaScript 文件中,其中包含了所有的 jQuery 函数.那么我们怎么判断页面中是否使用了Jquery库呢? 如下图,当页面中引入 ...

  2. [LOJ6433] [PKUSC2018] 最大前缀和

    题目链接 LOJ:https://loj.ac/problem/6433 Solution 注意到最大前缀要满足什么性质,假设序列\(a[1..n]\)的最大前缀是\(s_x\),那么显然要满足所有\ ...

  3. IDEA中搭建Maven环境

    一.maven的作用 maven是一个构建项目的工具 从项目的创建(代码.配置文件.测试代码如何存放) --> 项目代码的编译 --> 测试 -->项目发布上线 做一整套约定和解决方 ...

  4. 视频质量评估 之 VMAF

    VMAF 方法: 基本想法: 面对不同特征的源内容.失真类型,以及扭曲程度,每个基本指标各有优劣.通过使用机器学习算法(支持向量机(Support Vector Machine,SVM)回归因子)将基 ...

  5. windows下安装hexo和生成博客

    首先在电脑上安装node和git,这个只要在相关官网的下载然后一步安装即可. 然后在你的电脑上新建一个文件夹,用来存放你的博客文件,比如创建hexo 进入该文件,右键打开git bash 安装hexo ...

  6. csrf 功能 及 csrf装饰器使用

    目录 csrf 功能 及 csrf装饰器使用 简单了解csrf 防范措施 了解更多csrf点击 django 中 csrf csrf装饰器 csrf功能(执行流程) csrf 功能 及 csrf装饰器 ...

  7. iOS 静态、全局变量、常量

    关键字static 两个概念:生命周期.作用域生命周期:这个变量能存活多久,它所占用的内存什么时候分配,什么时候收回.作用域:这个变量在什么区域是可见的,可以拿来用的. static分两种情况:修饰局 ...

  8. Step by Step to create orders by consuming SAP Commerce Cloud Restful API

    Recently Jerry is working on an integration project about creating orders in Wechat platform by cons ...

  9. Typescript项目注意点和基本类型介绍

    从typescript源文件到执行的过程 执行者 步骤 说明 TSC 1. TypeScript Source -> TypeScript AST TSC将ts文件转为TS AST(abstra ...

  10. SQL月度统计

    select Convert ( VARCHAR(7),CreateTime,120) as Date ,sum(Money) as M FROM [LBAmmeterDB].[dbo].Am_Tas ...