js不分
/***
* 断点续传
* @param obj
*/
//创建文件、进度、按钮等
function progressUpload(obj){
var files = obj.files;
var p = new Promise(function(resolved){
$(obj).parents(".fileDiv").eq(0).parent().find(".partitionUpload").remove();
if (files.length) {
let str = '<div class="col-xs-12 partitionUpload" >';
for (var i = 0; i < files.length; i++) {
var file = files[i];
str += '<div class="col-xs-10 '+file.lastModified+'" style="position:relative; left: 16.3%; padding-bottom: 10px;" >';
str += "<span>"+file.name+"</span>"
str += "<span>"
+"<i ><b style='padding: 12px; color: #00cc33;'>0%</b></i>"
+"</span>"
str += "<span>"
+"<a style='color: #d9534f;background-color: transparent;border: #d9534f 1px solid; border-radius: 3px; padding: 2px 7px; font-size: 12px;' href='javascript:void(0);' class='upload1' οnclick=\"pauseUpload1('"+file.lastModified+"','"+file.name+"',this)\">暂停</a> "
+"<a style='color: #d9534f;background-color: transparent;border: #d9534f 1px solid; border-radius: 3px; padding: 2px 7px; font-size: 12px; display:none' href='javascript:void(0);' class='upload2' οnclick=\"pauseUpload2('"+file.lastModified+"','"+file.name+"',this)\">继续</a> "
+"<a style='color: #d9534f;background-color: transparent;border: #d9534f 1px solid; border-radius: 3px; padding: 2px 7px; font-size: 12px;' href='javascript:void(0);' οnclick=\"deleteItem('"+file.lastModified+"','"+file.name+"',this)\">删除</a>"
+"</span>"
+'</div>';
}
str += '<div>';
//加载上传样式
$(obj).parents(".fileDiv").after(str);
resolved("wo成功了");
}
}) ;
p.then(function(result){
window.setTimeout(function(){
//开始上传
pload(files,obj)
},100)
});
}
//循环文件,上传
function pload(files,obj){
for (var i = 0; i < files.length; i++) {
//上传
var file = files[i];
uploadItem(file,obj);
}
}
//切片大小 1M
var paragraph = 1024 *1024;
// 从start字节处开始上传
function uploadItem(file,obj) {
if(file){
var endSize = getLastestUploadEndSize(file);
var part = getLastestUploadPart(file);
var uploadState = getLastestUploaduploadState(file);
var fd = new FormData();
if(uploadState == 1 && endSize <= file.size){
startSize = endSize;
if(paragraph > (file.size - endSize)){
endSize = file.size;
}else{
endSize += paragraph ;
}
//新建一个FormData对象
fd.append("fileName",file.name);
fd.append("lastModified",file.lastModified);
fd.append("functionFileName","partitionUpload");
fd.append("part",part);
fd.append("file",file.slice(startSize, endSize));
if(endSize == file.size){
fd.append("end",1);
}else{
fd.append("end",0);
}
//上传
uploadBuffer(fd,obj);
//更新进度
uploadProgress(endSize,file);
var progress = localStorage.getItem(file.lastModified + "_" + file.name+"progress")
$(obj).parents(".fileDiv").next().find("."+file.lastModified).find("b").text(progress+"%");
//如果是最后一部分,则结束迭代
if(endSize == file.size ){
//上传完毕,暂停按钮关闭
$(obj).parents(".fileDiv").next().find("."+file.lastModified).find(".upload1").hide();
}else{
window.setTimeout(function(){
//迭代执行本方法
uploadItem(file,obj);
},300)
}
}
}
}
//【暂停/继续】 状态
function getLastestUploaduploadState(uploadFile){
var uploadState = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name+"uploadState");
if(uploadState == null){
uploadState = 1;
}
return uploadState ;
}
//上传的第几部分
function getLastestUploadPart(uploadFile){
var time = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name+"time");
if(time == null){
time = 1;
}
return time ;
}
//暂停
function pauseUpload1(lastModified,name,obj){
localStorage.setItem(lastModified + "_" + name+"uploadState",2);
$(obj).hide();
$(obj).next().show();
}
//继续
function pauseUpload2(lastModified,name,obj){
localStorage.setItem(lastModified + "_" + name+"uploadState",1);
$(obj).hide();
$(obj).prev().show();
var inputObject = $(obj).parents(".partitionUpload").eq(0).prev().find("[type=file]");
var files = inputObject[0].files;
var targetfile ;
for(var i =0;i<files.length;i++){
var file =files[i];
if(file.lastModified == lastModified){
targetfile = file;
}
}
uploadItem(targetfile,$(inputObject));
}
//删除
function deleteItem(lastModified,name,obj){
localStorage.removeItem(lastModified + "_" + name);
localStorage.removeItem(lastModified + "_" + name+"uploadState");
localStorage.removeItem(lastModified + "_" + name+"time");
$(obj).parents(".col-xs-12").eq(0).remove();
}
/**
* 从localStorage检查最后一次上传的字节
*/
function getLastestUploadEndSize(uploadFile){
var lastestLen = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name);
if(lastestLen){
return parseInt(lastestLen);
}else{
localStorage.removeItem(uploadFile.lastModified + "_" + uploadFile.name);
return 0;
}
}
//显示处理进程
function uploadProgress(uploadLen,uploadFile) {
var percentComplete = Math.round(uploadLen * 100 / (uploadFile.size));
// document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
localStorage.setItem(uploadFile.lastModified + "_" + uploadFile.name+"progress",percentComplete);
var time = localStorage.getItem(uploadFile.lastModified + "_" + uploadFile.name+"time");
if(time == null){
time = 1;
}
//保存到LocalStorage一边下次传输,可以记忆起这个断点
localStorage.setItem(uploadFile.lastModified + "_" + uploadFile.name, uploadLen);
localStorage.setItem(uploadFile.lastModified + "_" + uploadFile.name+"time", parseInt(time)+1);
}
// 往后台传参
function uploadBuffer(formData,obj){
$.ajax({
url:'../intelligenceDataThird/partitionUpload.do',
type:'post',
async:false,
data:formData,
processData:false, //tell jQuery not to process the data
contentType: false,
success:function(d){
if(formData.get("end") == 1){
var name = $(obj).attr("name");
var lastModified= formData.get("lastModified")
$(obj).parents(".fileDiv").next().find("."+lastModified).find(".upload1").before("<input type='hidden' name='"+name+"' value='"+d.url+"'>");
localStorage.setItem(lastModified + "_end" ,"end");
var files = obj.files;
var isOver=true;
for(var i =0;i<files.length;i++){
var file =files[i];
var endflag = localStorage.getItem(file.lastModified + "_end")
if(endflag != "end"){
isOver=false;
break
}
}
if(isOver){
//结束后清除localStorage
localStorage.removeItem(file.lastModified + "_" + file.name);
localStorage.removeItem(file.lastModified + "_" + file.name+"uploadState");
localStorage.removeItem(file.lastModified + "_" + file.name+"time");
localStorage.removeItem(file.lastModified + "_end");
$(obj).val("");
}
}
}
})
}
后台代码
/**断点续传
* @param file
* @param fileName
* @param part
* @return
*/
@ResponseBody
@RequestMapping("/partitionUpload.do")
public Map<String,Object> partitionUpload(HttpServletResponse response ,@RequestParam("file") MultipartFile file,String fileName,String functionFileName,Integer part,Integer end) {
// 定义上传路径
MyUtils myUtils = new MyUtils();
String fileUplodPath = myUtils.getWechatProperty("fileUploadPath", "config");
String uploadDirectory=myUtils.getWechatProperty("fileAccessApacheUrl", "config");
if(StringUtils.isNotBlank(functionFileName)){
functionFileName ="partitionUpload";
}
Map<String,Object> map = new HashMap<>();
try {
if (file != null ) {
String time =String.valueOf(new Date().getTime());
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd");
String date = formatter.format(new Date());
String suffix = fileName.substring(fileName.lastIndexOf("."));;
if(part.equals(1) && end.equals(1)){
//文件小,没有分割
String tempFile = fileUplodPath + functionFileName + File.separator + time+suffix;
File localFile = new File(tempFile);
localFile.mkdirs();
file.transferTo(localFile);
map.put("url", uploadDirectory+ functionFileName +File.separator +time+suffix+"|"+fileName);
}else{
if(end.equals(1)){
map.put("url", uploadDirectory+ functionFileName +File.separator + date + File.separator + fileName +"|"+fileName);
}
String tempFile = fileUplodPath + functionFileName + File.separator + date + File.separator + fileName;
File localFile = new File(tempFile);
if(!localFile.exists()){
//第一次传输,创建文件
localFile.mkdirs();
file.transferTo(localFile);
}else{
//续写文件
InputStream inputStream =file.getInputStream();
//true,则表示追加
@SuppressWarnings("resource")
FileOutputStream output = new FileOutputStream(localFile,true);
int b = 0;
byte[] bytes = new byte[inputStream.available()];
while (b != -1){
b = inputStream.read(bytes);
//4.写到输出流(out)中
output.write(bytes,0,b);
}
}
}
}
}catch (Exception e) {
e.printStackTrace();
return map;
}
return map;
}