//简单的Cookie帮助函数 functionsetCookie(cname,cvalue,exdays) { var d = newDate(); d.setTime(d.getTime()+(exdays*24*60*60*1000)); var expires = "expires="+d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires; }
functiongetCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name)==0) return c.substring(name.length,c.length); } return""; } // //简单的文件HASH值计算,如果您不是十分考究,应该可以用于产品。 //由于计算文件HASH值用到了多种数据,因此在HYFileUploader系统范围内发生HASH冲突的可能性应该非常小,应该可以放心使用。 //获取文件的ID可以用任何算法来实现,只要保证做到同一文件的ID是相同的即可,获取的ID长度不要超过32字节 // functiongetFileId (file) { //给浏览器授予一个唯一的ID用于区分不同的浏览器实例(不同机器或者相同机器不同厂家的浏览器) var clientid = getCookie("HUAYIUPLOAD"); if (clientid == "") { //用一个随机值来做浏览器的ID,将作为文件HASH值的一部分 var rand = parseInt(Math.random() * 1000); var t = (newDate()).getTime(); clientid =rand+'T'+t;
setCookie("HUAYIUPLOAD",clientid,365); }
var info = clientid; if (file.lastModified) info += file.lastModified; if (file.name) info += file.name; if (file.size) info += file.size; //https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js var fileid = md5(info); return fileid; }
var fileObj = currentfile; var fileid = getFileId(fileObj); var t = (newDate()).getTime(); //通过以下URL获取文件的断点续传信息,必须的参数为fileid,后面追加t参数是避免浏览器缓存 var url = resume_info_url + '?fileid='+fileid + '&t='+t;
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function () { if(this.readyState == 4){ if (this.status == 200){ var response = this.responseText;
var result = JSON.parse(response); if (!result) { alert('服务器返回的数据不正确,可能是不兼容的服务器'); return; } //断点续传信息返回的文件对象包含已经上传的尺寸 var uploadedBytes = result.file && result.file.size; if (!result.file.finished && uploadedBytes < fileObj.size) { upload_file(fileObj,uploadedBytes,fileid); } else { //文件已经上传完成了,就不要再上传了,直接返回结果就可以了 showUploadedFile(result.file); //模拟进度完成 //var progressBar = document.getElementById('progressbar'); //progressBar.value = 100; }
/* 文件上传处理代码 fileObj : html5 File 对象 start_offset: 上传的数据相对于文件头的起始位置 fileid: 文件的ID,这个是上面的getFileId 函数获取的, */ functionupload_file(fileObj,start_offset,fileid) { var xhr = new XMLHttpRequest(); var formData = new FormData();
var blobfile;
if(start_offset >= fileObj.size){ returnfalse; }
var bitrateDiv = document.getElementById("bitrate"); var finishDiv = document.getElementById("finish"); var progressBar = document.getElementById('progressbar'); var progressDiv = document.getElementById('percent-label');
var oldTimestamp = 0; var oldLoadsize = 0; var totalFilesize = fileObj.size; if (totalFilesize == 0) return;
var uploadProgress = function (evt) { if (evt.lengthComputable) { var uploadedSize = evt.loaded + start_offset; var percentComplete = Math.round(uploadedSize * 100 / totalFilesize);
var timestamp = (newDate()).valueOf(); var isFinish = evt.loaded == evt.total;
if (timestamp > oldTimestamp || isFinish) { var duration = timestamp - oldTimestamp; if (duration > 500 || isFinish) { var size = evt.loaded - oldLoadsize;