后端springmvc,前端html5的FormData实现文件断点上传
前言
最近项目中有使用到文件断点上传,得空便总结总结,顺便记录一下,毕竟“好记性不如烂笔头”。
后端代码:
package com.test.controller; import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.UUID; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; @Controller
public class UploadController { @ResponseBody // 返回rest json
@RequestMapping(value = {"/rest/saveUploadFileAsChunk"}, method = RequestMethod.POST, produces = "application/json")
public File saveUploadFileAsChunk(@RequestParam(required = false) MultipartFile file,
@RequestParam(required = true) Integer chunk, // 分割块数
@RequestParam(required = true) Integer chunks, // 总分割数
@RequestParam(required = true) String tempFileName //临时文件名 必须带后缀名
) throws Exception{
if(null != file){
// 保存临时文件
String chunkName = tempFileName;
if (chunk != null) {
chunkName = chunk + "_" + tempFileName;
}
File savedFile = new File("普通存放文件的路径", chunkName);
if (!savedFile.getParentFile().exists())
savedFile.getParentFile().mkdirs();
file.transferTo(savedFile); //将MultipartFile转存到file对象
} //如果到最后一个分割块,则做合并处理
if (chunk != null && chunk + 1 == chunks) {
String newFileName = UUID.randomUUID().toString().replace("-", "").concat(".").concat(FilenameUtils.getExtension(tempFileName));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(new File("普通存放文件的路径", newFileName)));
// 遍历文件合并 chunks,循环将文件写入新的文件中,并且删除之前的临时文件
for (int i = 0; i < chunks; i++) {
File tempFile = new File("普通存放文件的路径", i + "_" + tempFileName);
byte[] bytes = FileUtils.readFileToByteArray(tempFile); //将file对象解析城byte数组
outputStream.write(bytes);
outputStream.flush();
tempFile.delete();
}
outputStream.flush();
outputStream.close();
File reallyFile = new File("普通存放文件的路径", newFileName); //reallyFile即最后合并的文件
return reallyFile;
}
return null;
}
}
前端代码:
var setsize = 10 * 1024; //1024字节 = 1KB * 10 即每次10k /** *参数filepath就是本地文件路径,主要就是用于放在localStorage中确定唯一性
file : js的Blob对象
*/
function uplaod(filepath,file){
var filesize = file.size;
var filecount = filesize/setsize; //计算出可以分成几块 var i = localStorage.getItem(filepath);
i = (i!=null && i!="")?parseInt(i):0; if(i < filecount){
//新建一个FormData对象
var formData = new FormData(); //++++++++++
var blobfile;
if((filesize - i * setsize) > setsize){
blobfile = file.slice(i*setsize,(i+1)*setsize);
}else{
//代表是最后一此了
blobfile = file.slice(i*setsize,filesize);
} formData.append('chunk', i); //++++++++++当前文件块
formData.append('chunks', Math.ceil(filecount)); //++++++++++ 总块数
formData.append("tempFileName",fileName); //临时文件名 带uuid的
formData.append('file', blobfile); if(i < filecount){
$.ajax({
url: PATROL_CONSTANTS.SRV_URL+"/rest/saveUploadFileAsChunk",
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function (responseStr) {
localStorage.setItem(filepath,i+1);
var rs = filecount <= 0 ? "0%" : (Math.round((i+1) / Math.ceil(filecount) * 10000) / 100.00 + "%");
console.log("进度百分比:"+rs); uploadFile(filepath,file); //递归调用
},
error: function (responseStr) {
console.log("上传失败,重复尝试!");
console.log(responseStr);
uploadFile(filepath,file);
}
});
}else{
//上传完成后,则将对应的localStorage移除掉
localStorage.removeItem(filepath);
}
}
转发请标注原文地址:http://www.cnblogs.com/dinglinjie/p/7458901.html
阿杰de博客,qq群:112465270
后端springmvc,前端html5的FormData实现文件断点上传的更多相关文章
- 文件断点上传,html5实现前端,java实现服务器
断点上传能够防止意外情况导致上传一半的文件下次上传时还要从头下载,网上有很多关于断点的实现,这篇文章只是从前到后完整的记录下一个可用的实例,由于生产环境要求不高,而且就是提供给一两个人用,所以我简化了 ...
- 前端利用webuploader实现超大文件分片上传、断点续传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- java HTTP文件断点上传
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- asp.net 如何实现大文件断点上传功能?
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- jsp文件断点上传
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- jsp+servlet怎么实现文件断点上传下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- JSP如何实现文件断点上传和断点下载?
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- Android中Socket大文件断点上传
原文:http://blog.csdn.net/shimiso/article/details/8529633 什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一 ...
- java文件断点上传
1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...
随机推荐
- Luogu P1629 邮递员送信
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- 蓝桥-区间K大数查询
问题描述: 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个 ...
- 【codeforces 509C】Sums of Digits
[题目链接]:http://codeforces.com/contest/509/problem/C [题意] 给你一个数组b[i] 要求一个严格升序的数组a[i]; 使得a[i]是b[i]各个位上的 ...
- noip模拟赛 radius
分析:这道题实在是不好想,一个可以骗分的想法是假定要求的那个点在中心点上,可以骗得不少分.但是在边上的点要怎么确定呢?理论复杂度O(﹢无穷).答案一定是和端点有关的,涉及到最大值最小,考虑二分最大值, ...
- 清北学堂模拟赛d4t4 a
分析:感觉和dp的状态转移方式有点类似,对于一个数,你不能看有多少个状态能转移到它,你要看它能转移到多少个状态,相当于刷表法和填表法的区别,对于这道题也是一样,我们不能看有多少个数是x的倍数,而是每次 ...
- 洛谷—— P2424 约数和
https://www.luogu.org/problem/show?pid=2424 题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f ...
- 洛谷——P2925 [USACO08DEC]干草出售Hay For Sale
https://www.luogu.org/problem/show?pid=2925 题目描述 Farmer John suffered a terrible loss when giant Aus ...
- thymeleaf模板引擎基础使用(转)
刚好项目上用到这个模板引擎,记录以下基础用法. thymeleaf介绍 简单说, Thymeleaf是一个跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP .相比其他的模板 ...
- Android:让Link始终保持在程序的WebView中跳转
在Android的WebView中,当点击调用网页的链接时,默认的动作是跳转到系统设定的默认浏览器中.如果想让链接始终在当前WebView中跳转的话,就需要添加以下代码: WebView webVie ...
- Clojure:导入lein项目到IntelliJ IDEA
首先,我们需要先创建一个lein项目(废话..) lein new [项目名称] 然后生成Maven的pom.xml文件 cd [项目目录] lein pom 最后,在InteliJ IDEA中选择导 ...