上传页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>大文件上传</title>
</head>
<body>
<input type="file" onchange="file(this)">
<button onclick="uplo()">上传</button>
</body>
</html>
<script>
//文件的大小
var size = '';
function file(e){
var file = e.files;
//文件的对象
fileList = file[0];
//总大小
size = fileList.size;
//每个接片的大小
setsize = 1000*1024;
//总分数
filecount = size/setsize;
i=0;
}
function uplo(){
console.log(i);
var ajax = new XMLHttpRequest();
var form = new FormData();
if((size-i*setsize)>setsize){
//前一个 与 后一个 (间距)
form.append('file',fileList.slice(i*setsize,(i+1)*setsize))
}else{
//最后的半个 与 最后一个(间距)
form.append('file',fileList.slice(i*setsize,size));
//最后一个的 总分数向下取整
form.append('lastone',Math.floor(filecount));
}
//form里追加 一个切片的 名字
form.append('blobname',i);
//文件名
form.append('filename',fileList.name);
ajax.open('POST','1.php');
//发送过去的数据
ajax.send(form);
ajax.onreadystatechange = function(){
if(ajax.readyState==4 && ajax.status==200){
if(ajax.responseText==1){
alert(1)
}
//判断切片数 是否小于总数
if(i<filecount){
uplo();
}
}
};
i=i+1;
}
</script>
后台处理的文件名 1.php
<?php
//接受文件名
$filename = $_POST['filename'];
//把文件名加密变成文件夹名 再生成路径
$dir = 'uploads/'.md5($filename);
if(!file_exists($dir)){
mkdir($dir,0777,true);
}
//小文件要移动的位置
$path = $dir.'/'.$_POST['blobname'];
//移动文件
move_uploaded_file($_FILES['file']['tmp_name'],$path);
//判断lastone是否存在
if(isset($_POST['lastone'])){
//lastone也是份数
$count = $_POST['lastone'];
//打开大文件
$fp = fopen($_POST['filename'],'abw');
for($i=0;$i<=$count;$i++){
//打开小文件
$handle = fopen($dir.'/'.$i,'rb');
//读取小文件
$read = fread($handle,filesize($dir.'/'.$i));
//写入 小文件写入大文件
fwrite($fp,$read);
//关闭小文件
fclose($handle);
//删除小文件
unlink($dir.'/'.$i);
}
//关闭大文件
fclose($fp);
}