dropzone.js重写断点续传功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dropzone.js重写断点续传功能相关的知识,希望对你有一定的参考价值。


js文件:

var uploaddropzone = new Dropzone("#uploaddropzone",{

url: ctx + "/slider/fileUploadContinue",

acceptedFiles: "",

maxFiles: 1,

autoDiscover : false,

addRemoveLinks: true,

dictRemoveFile: ‘x‘,

dictDefaultMessage: ‘Drop file here or click to upload‘,

dictInvalidFileType: "你不能上传该类型文件,文件类型只能是",

thumbnailHeight:100,

thumbnailWidth:256,

customUpload: function(files,xhr){  // 重写了 dropzone.js  源码,  主要功能是在dropzone发送文件请求的时候进行拦截,以另一种方式进行.

var file=files[0];

fileUploadCheckAjax(file,xhr);//file 需要上传的文件,xhr  监听事件

},

init:function(){

this.on("addedfile", function(file) {

$("#uploadChoose").attr("disabled",true);

});

this.on("success", function(file) {

$("#fileResource").html(file.xhr.responseText);

$("#uploadChoose").attr("disabled",false);


});

this.on("complete", function(data) {

          if(data.status == "error"){

          promptPop("warning","上传失败");

          }

});

}

});

function fileUploadCheckAjax(file,xhr){ 

xhr.onreadystatechange = function() {//上传状态监听 xhr.responseText 返回值,由 后台提供

console.log(xhr.readyState + "-" + xhr.status + "-" + xhr.responseText);

if (xhr.readyState == 4 && xhr.status == 200) {

if(xhr.responseText=="error"){

alert(‘失败‘);

}else{

alert(‘成功‘);

}

}

};

var load=0;//上传进度百分比

var param = "fileName=" + file.name + "&fileSize=" + file.size + "&fileType="

+ file.type + "&fileLastModified=" + file.lastModified; //文件信息

var xhrCheck = new XMLHttpRequest();//检查请求 第二个监听 主要监听文件的上传情况

xhrCheck.onreadystatechange = function() {//检查状态监听,成功后执行发送上传请求

if (xhrCheck.status == 200 && xhrCheck.readyState == 4) {

load = parseInt(xhrCheck.responseText);

xhr.open("POST", ctx+"/slider/fileUploadContinue?" + param, true);//上传文件方法实现

xhr.send(file.slice(load, file.size, file.type));//通过File.slice方法获得未上传过的数据信息,再上传(重点)

xhr.upload.uploadprogress = function(e) {//上传进度监听

this.emit("uploadprogress", file, 100, file.upload.bytesSent)

};

}

};

xhrCheck.open("POST", ctx+"/slider/fileUploadCheck?" + param, true);// 监听请求地址,该方法主要返回已上传文件的大小

xhrCheck.send();//发送检查请求

}


dropzone.js 修改:


Dropzone.prototype.uploadFiles 方法,

在  return xhr.send(formData); 之前加如下代码:

 if(this.options.customUpload!=null) {

     return this.options.customUpload(files,xhr);

 }//如果定义了customUpload方法,则返回customUpload方法,否则按照原方法实现。这也就是为何要在js里面增加customUpload 的原因。

 

 java:

 fileUploadCheck方法:以上传文件的名字,类型,大小和最后修改时间来判定是否为同一个文件,在指定的临时存储的路径检索该文件并且返回该文件已上传的大小。

 

@ResponseBody

@RequestMapping(value="/fileUploadCheck",method = RequestMethod.POST)

public Long fileUploadCheck(FileVo fileVo) throws Exception {

String sysPath=this.getFileUpLoadPath("upload.file.tmp");

// 通过name、size、type、lastModified四个属性来确定文件唯一性——MD5散列值。

String fileID = EncoderByMd5(fileVo.getFileName()+fileVo.getFileSize()+ fileVo.getFileType() + fileVo.getFileLastModified());

String fileName = DateUtils.getCurrentDate("yyyyMMDD")+fileID +fileVo.getFileName().substring(fileVo.getFileName().lastIndexOf("."));

File dir = new File(sysPath);

//判断文件夹是否存在 不存在则创建

if (!dir.exists()) {

dir.mkdir();

}

File file =new File(sysPath+File.separator  + fileName);

if (!file.exists()) {

return 0l;

} else {

return  file.length();

}

}

EncoderByMd5方法:  对指定字符串进行MD5编码

public String EncoderByMd5(String str){

try {

           // 生成一个MD5加密计算摘要

           MessageDigest md = MessageDigest.getInstance("MD5");

           // 计算md5函数

           md.update(str.getBytes());

           // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符

           // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值

           return new BigInteger(1, md.digest()).toString(16);

       } catch (Exception e) {

           e.printStackTrace();

           return str;

       }

}

 fileUploadContinue:方法 以复写的形式上传文件到临时路径,

 @ResponseBody

@RequestMapping(value="/fileUploadContinue",method = RequestMethod.POST)

public String fileUploadContinue(ModelMap map,HttpServletRequest request,FileVo fileVo) throws Exception {

ServletInputStream is = request.getInputStream();//输入流,由前端提供,

String sysPath=this.getFileUpLoadPath("upload.file.tmp");//系统配置的文件临时存储路径

// 通过name、size、type、lastModified四个属性来确定文件唯一性——MD5散列值。

String fileID = EncoderByMd5(fileVo.getFileName()+fileVo.getFileSize()+ fileVo.getFileType() + fileVo.getFileLastModified());

String fileName = DateUtils.getCurrentDate("yyyyMMDD")+ fileID +fileVo.getFileName().substring(fileVo.getFileName().lastIndexOf("."));

FileOutputStream os = null;

File file = null;

try {

BufferedInputStream bis = new BufferedInputStream(is);

byte[] b = new byte[1024 * 1024];

file =new File(sysPath+File.separator  + fileName);

if (!file.exists()) {

file.createNewFile();

}

os = new FileOutputStream(file, true);// append

int n = 0;

while ((n = bis.read(b)) > 0) {

os.write(b, 0, n);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

os.close();

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

InputStream  newIs=new FileInputStream(new File(sysPath+File.separator  + fileName)); // newIs 新的文件流

 

}

 

 

 

     


以上是关于dropzone.js重写断点续传功能的主要内容,如果未能解决你的问题,请参考以下文章

用C实现断点续传的功能,详细点的实现原理是啥嘞

如何用Java实现HTTP断点续传功能

如何让 chrome 断点续传

Android多线程断点续传下载原理及实现

chrome 怎么http断点续传

如何实现HTML5文件断点续传