理清思路:

引入了两个概念:块(block)和片(chunk)。每个块由一到多个片组成,而一个资源则由一到多个块组成

块是服务端的永久数据存储单位,片则只在分片上传过程中作为临时存储的单位。服务端会以约一个月为单位周期性的清除上传后未被合并为块的数据片

实现过程:

将文件分割,分片上传,然后合并

前端核心code:

var fileForm = document.getElementById("file");

var upstartBtn = document.getElementById('upstart');

var stopBtn = document.getElementById('stop');

var startBtn = document.getElementById('restart');

var rate = document.getElementById('rate');

var divlog = document.getElementById('divlog');

//---------------------------

const LENGTH = 1024 * 1024 * 1;

var start = 0;

var end = start + LENGTH;

var blob;

var blob_num = 1;

var is_stop = 0

var file = null;

var md5filename = '';

//-----------------------------

var upload_instance = new Upload();

fileForm.onchange = function()

{

browserMD5File(fileForm.files[0], function (err, md5) { //如果文件大,md5值生成较慢  md5值生成后才能上传处理,自己优化下吧

md5filename = md5;                                  //如果需要刷新后也能断点,可利用cookie记录,自行完善

divlog.innerHTML = '文件md5为:' + md5filename;

});

}

upstartBtn.onclick = function(){

upload_instance.addFileAndSend(fileForm);

}

stopBtn.onclick = function(){

upload_instance.stop();

}

startBtn.onclick = function(){

upload_instance.start();

}

function Upload(){

var xhr = new XMLHttpRequest();

var form_data = new FormData();

//对外方法,传入文件对象

this.addFileAndSend = function(that){

file = that.files[0];

blob = cutFile(file);

sendFile(blob,file);

blob_num += 1;

}

//停止文件上传

this.stop = function(){

xhr.abort();

is_stop = 1;

}

this.start = function(){

sendFile(blob,file);

is_stop = 0;

}

//切割文件

function cutFile(file){

var file_blob = file.slice(start,end);

start = end;

end = start + LENGTH;

return file_blob;

};

//发送文件

function sendFile(blob,file){

var total_blob_num = Math.ceil(file.size / LENGTH);

form_data.append('file',blob);

form_data.append('blob_num',blob_num);

form_data.append('total_blob_num',total_blob_num);

form_data.append('md5_file_name',md5filename);

form_data.append('file_name',file.name);

xhr.open('POST','./index.php',false);

xhr.onreadystatechange = function () {

var progress;

var progressObj = document.getElementById('finish');

if(total_blob_num == 1){

progress = '100%';

}else{

progress = (Math.min(100,(blob_num/total_blob_num)* 100 )).toFixed(2) +'%';

}

console.log('progress-----'+progress);

progressObj.style.width = progress;

rate.innerHTML = progress;

var t = setTimeout(function(){

if(start < file.size && is_stop === 0){

blob = cutFile(file);

sendFile(blob,file);

blob_num += 1;

}else{

//setTimeout(t);

}

},1000);

}

xhr.send(form_data);

}

}

后端code

class Upload{

private $filepath = './upload'; //上传目录

private $tmpPath; //PHP文件临时目录

private $blobNum; //第几个文件块

private $totalBlobNum; //文件块总数

private $fileName; //文件名

private $md5FileName;

public function __construct($tmpPath,$blobNum,$totalBlobNum,$fileName, $md5FileName){

$this->tmpPath = $tmpPath;

$this->blobNum = $blobNum;

$this->totalBlobNum = $totalBlobNum;

$this->fileName = $this->createName($fileName, $md5FileName);

$this->moveFile();

$this->fileMerge();

}

//判断是否是最后一块,如果是则进行文件合成并且删除文件块

private function fileMerge(){

if($this->blobNum == $this->totalBlobNum){

$blob = '';

for($i=1; $i<= $this->totalBlobNum; $i++){

$blob .= file_get_contents($this->filepath.'/'. $this->fileName.'__'.$i);

}

file_put_contents($this->filepath.'/'. $this->fileName,$blob);

$this->deleteFileBlob();

}

}

//删除文件块

private function deleteFileBlob(){

for($i=1; $i<= $this->totalBlobNum; $i++){

@unlink($this->filepath.'/'. $this->fileName.'__'.$i);

}

}

private function moveFile(){

$this->touchDir();

$filename = $this->filepath.'/'. $this->fileName.'__'.$this->blobNum;

move_uploaded_file($this->tmpPath,$filename);

}

//API返回数据

public function apiReturn(){

if($this->blobNum == $this->totalBlobNum){

if(file_exists($this->filepath.'/'. $this->fileName)){

$data['code'] = 2;

$data['msg'] = 'success';

$data['file_path'] = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['DOCUMENT_URI']).str_replace('.','',$this->filepath).'/'. $this->fileName;

}

}else{

if(file_exists($this->filepath.'/'. $this->fileName.'__'.$this->blobNum)){

$data['code'] = 1;

$data['msg'] = 'waiting';

$data['file_path'] = '';

}

}

header('Content-type: application/json');

echo json_encode($data);

}

private function touchDir(){

if(!file_exists($this->filepath)){

return mkdir($this->filepath);

}

}

private function createName($fileName, $md5FileName){

return $md5FileName . '.' . pathinfo($fileName)['extension'];

}

}

$upload = new Upload($_FILES['file']['tmp_name'],$_POST['blob_num'],$_POST['total_blob_num'],$_POST['file_name'],$_POST['md5_file_name']);

$upload->apiReturn();

java视频上传方法_java大视频上传实现相关推荐

  1. java 上传断点续传_JAVA大文件上传断点续传解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 Save 改进后的代码不需要for ...

  2. java中的开方方法_java 大整数开方模板与常用方法

    BigInteger开方: public static BigInteger Sqrt(BigInteger xx) { BigDecimal x=new BigDecimal(xx); BigDec ...

  3. 怎么样将摄像头视频接入到你的大屏上

    怎么样将摄像头视频接入到你的大屏上 摄像头属于传统安防设备,一般是接入到NVR中,通过NVR进行视频的存储或投到电视墙上面.但是在很多智慧园区,农业,水务,市场监管.电力等行业解决方案上,领导们喜欢在 ...

  4. asp.net实现ftp上传代码(解决大文件上传问题)

    asp.net实现ftp上传代码(解决大文件上传问题) 参考文章: (1)asp.net实现ftp上传代码(解决大文件上传问题) (2)https://www.cnblogs.com/LYunF/ar ...

  5. java 大文件上传_JAVA大文件上传分片上传方法(附带demo)

    最近在做视频上传展示的相关业务!但是因为最开始使用的是单文件上传所以一旦遇到大文件上传的速度就非常慢!为此在网上一直找寻分片的方法!得到了思路! 直接讲一下我这边看了那么多文档加上自己理解写的demo ...

  6. java大文件 索引_JAVA 大文件上传解决方案(500M以上)

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  7. java的sftp文件传输_java使用SFTP上传文件到资源服务器方法详解

    java使用SFTP上传文件到资源服务器 本文实例为大家分享了java实现SFTP上传文件到资源服务器工具类,供大家参考,具体内容如下 首先得创建连接sftp服务器的公共类MySftp.java: p ...

  8. java图片上传下载_java web 文件上传与下载

    组件工作流程:WEB服务器request ServletFil eupLoad DiskFileItem Factory代表普通字段的FileItem代表上传文件1FileItem代表上传文件2Fil ...

  9. java 刷浏览量代码_Java刷视频浏览量点赞量的实现代码

    说明 这几天班主任一直让我们访问一个网页来观察看视频,增加访问次数.每个班级还有指定的名额...而且经过我的测试,点赞次数是在观看视频一会才出现的.. 可是身为计算机专业的 肯定不想一直点啊 点啊 于 ...

  10. java中上传文件_Java中文件上传下载 --使用Minio

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...

最新文章

  1. PortICASetDefaults.exe /o命令返回为空
  2. 我看过且非常喜欢的《电影》和书
  3. Activity service 通信
  4. 17年三月计算机二级,2017年3月计算机二级考试攻略
  5. python修改xpath节点_Xpath python在特定文本后查找节点
  6. JavaScript——正则表达式
  7. windows应用x64和x86运行效率_现在你可以在 Windows 中运行 Linux 应用了 | Linux 中国...
  8. 记录一个表,COUNT多列的写法
  9. 三维扫描仪[3]——标定·理论
  10. C语言 两种方法优化:输入一个日期的年、月、日,计算并输出这天是该年的第几天。
  11. navicat 导入dmp文件
  12. SpringBoot 教程核心功能-Web 开发(请求处理)
  13. 微信公众号支付(二)
  14. 微信世界争霸服务器,微信世界争霸小程序进不去游戏怎么办
  15. 【OBS-STUDIO】OBSApp: OBS入口类
  16. 蓝桥杯嵌入式史上最全最详细教程教你快速入门
  17. oracle数据库中的虚拟表,Oracle10g中的虚拟专用数据库(VPD)
  18. 阅读笔记《Changer: Feature Interaction is What You Need for Change Detection》
  19. Excel函数不生效的一种情况
  20. java基于ssm+vue智慧餐厅点餐管理系统element

热门文章

  1. 稳压二极管 参数说明
  2. 5款Mac极速下载工具推荐和下载
  3. win10系统中如何把自带的IE11降级回IE8?
  4. 关于ie浏览器的降级问题
  5. Java和Python哪个更适合初学者的问题
  6. 模糊数学 计算机智能,吴国平:如果“模糊数学”没有出现,人工智能或许就无从谈起...
  7. Win10电脑微软应用商店打不开怎么办
  8. mathorcup数据大赛
  9. w3school和w3cschool两个网站有什么关系和区别?
  10. 机器学习的数学基础——线性代数篇(一)