拉不拉稀肚拉稀 发表于 2024-8-15 12:24:14

Java 中怎样实现 HTTP 断点续传,超大文件上传服务器,附源码!

var fileObj = currentfile;
var fileid = getFileId(fileObj);
var t = (new Date()).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;
}
}else {
alert(‘获取文件断点续传信息失败’);
}
}
}
ajax.open(‘get’,url,true);
ajax.send(null);
以上是通过 jQuery-file-upload组件的实现,通过原始Javascript的实当代码请参见demos目录的h4resume.html样本代码。
三、执行上传
在查询完文件的断点续传信息后,如果文件确实以前已经上传,服务器将返回已经上传过的文件尺寸,我们接着从已经上传的文件尺寸位置开始上传数据即可。
html5的File对象的 slice 可以用于从文件切取片断来上传。
定义和用法
slice() 方法可提取字文件的某个部分,并以新的字符串返回被提取的部分。
语法
File.slice(start,end)
参数 描述
start 要抽取的片断的起始下标。如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。
end 紧接着要抽取的片断的末端的下标。若未指定此参数,则要提取的子串包罗 start 到原字符串末端的字符串。
如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。
实现分片文件上传的代码如下:
/*
文件上传处理惩罚代码
fileObj : html5 File 对象
start_offset: 上传的数据相对于文件头的起始位置
fileid: 文件的ID,这个是上面的getFileId 函数获取的,
*/
function upload_file(fileObj,start_offset,fileid)
{
var xhr = new XMLHttpRequest();
var formData = new FormData();
var blobfile;
if(start_offset >= fileObj.size){
return false;
}
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 = (new Date()).valueOf();
var isFinish = evt.loaded == evt.total;
if (timestamp > oldTimestamp || isFinish) {
var duration = timestamp - oldTimestamp;
if (duration > 500 || isFinish) {
var size = evt.loaded - oldLoadsize;
var bitrate = (size * 8 / duration /1024) * 1000; //kbps
if (bitrate > 1000)
bitrate = Math.round(bitrate / 1000) + ‘Mbps’;
else
bitrate = Math.round(bitrate) + ‘Kbps’;
var finish = evt.loaded + start_offset;
if (finish > 1048576)
finish = (Math.round(finish / (1048576/100)) / 100).toString() + ‘MB’;
else
finish = (Math.round(finish / (1024/100) ) / 100).toString() + ‘KB’;
progressBar.value = percentComplete;
progressDiv.innerHTML = percentComplete.toString() + ‘%’;
bitrateDiv.innerHTML = bitrate;
finishDiv.innerHTML = finish;
oldTimestamp = timestamp;
oldLoadsize = evt.loaded;
}
}
}
else {
progressDiv.innerHTML = ‘N/A’;
}
}
xhr.onreadystatechange = function(){
if ( xhr.readyState == 4 && xhr.status == 200 ) {
console.log( xhr.responseText );
}
else if (xhr.status == 400) {
}
};
var uploadComplete = function (evt) {
progressDiv.innerHTML = ‘100%’;
var result = JSON.parse(evt.target.responseText);
if (result.result == ‘success’) {
showUploadedFile(result.files);
}
else {
alert(result.msg);
}
}
var uploadFailed = function (evt) {
alert(“上传文件失败!”);
}
var uploadCanceled = function (evt) {
alert(“上传被取消大概欣赏器断开了毗连!”);
}
//设置超时时间,由于是上传大文件,因此千万不要设置超时
//xhr.timeout = 20000;
//xhr.ontimeout = function(event){
//  alert(‘文件上传时间太长,服务器在规定的时间内没有相应!’);
//}
xhr.overrideMimeType(“application/octet-stream”);
var filesize = fileObj.size;
var blob = fileObj.slice(start_offset,filesize);
var fileOfBlob = new File(, fileObj.name);
//附加的文件数据应该放在哀求的前面
formData.append(‘filename’, fileObj.name);
//必须将fileid信息传送给服务器,服务器只有在获得了fileid信息后才对文件做断点续传处理惩罚
formData.append(‘fileid’, fileid);
//请将文件数据放在最后的域
//formData.append(“file”,blob, fileObj.name);
formData.append(‘file’, fileOfBlob);
xhr.upload.addEventListener(“progress”, uploadProgress, false);
xhr.addEventListener(“load”, uploadComplete, false);
xhr.addEventListener(“error”, uploadFailed, false);
xhr.addEventListener(“abort”, uploadCanceled, false);
xhr.open(‘POST’, upload_file_url);
//
xhr.send(formData);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里不停到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索发展大概是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技能故步自封!
因此网络整理了一份《2024年Java开发全套学习资料》,初志也很简单,就是希望可以或许资助到想自学提升又不知道该从何学起的朋侪,同时减轻各人的负担。https://i-blog.csdnimg.cn/blog_migrate/4fa47c5ada9ddd4de1cfe1e3a5cda53b.jpeg
https://i-blog.csdnimg.cn/blog_migrate/f4087f39a5fcfcf218351f11abd515c4.png
https://i-blog.csdnimg.cn/blog_migrate/f024c33212de13960aeaee6edd55b220.png
既有适合小白学习的零基础资料,也有适合3年以上履历的小搭档深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点内里都包含大厂面经、学习条记、源码课本、实战项目、讲解视频,并且会连续更新!
如果你觉得这些内容对你有资助,可以扫码获取!!(备注Java获取)
https://i-blog.csdnimg.cn/blog_migrate/f12e204d5f63a5845d699213c924b8b3.jpeg 结语

小编也是很有感触,如果不停都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难到达高级架构师的技能和认知高度。向厉害的人去学习是最有用减少时间摸索、精力浪费的方式。
我们选择的这个行业就不停要连续的学习,又很吃青春饭。
虽然各人可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是著名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小搭档,用来提升自己。
https://i-blog.csdnimg.cn/blog_migrate/bf8343ad68ec02c7f7ea5cdb6893ea65.png
   本文到这里就结束了,喜欢的朋侪可以资助点赞和评论一下,感谢支持!
《一线大厂Java面试题解析+核心总结学习条记+最新讲解视频+实战项目源码》,点击传送门即可获取!
/>
结语

小编也是很有感触,如果不停都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难到达高级架构师的技能和认知高度。向厉害的人去学习是最有用减少时间摸索、精力浪费的方式。
我们选择的这个行业就不停要连续的学习,又很吃青春饭。
虽然各人可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是著名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小搭档,用来提升自己。
[外链图片转存中…(img-KZGeXUli-1711976039014)]
   本文到这里就结束了,喜欢的朋侪可以资助点赞和评论一下,感谢支持!
《一线大厂Java面试题解析+核心总结学习条记+最新讲解视频+实战项目源码》,点击传送门即可获取!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java 中怎样实现 HTTP 断点续传,超大文件上传服务器,附源码!