/*
* js
*/
function PostFile(file, i, t) { console.log(1); var name = file.name, //文件名 size = file.size, type = file.type, //总大小shardSize = 2 * 1024 * 1024, shardSize = 2 * 1024 * 1024, //以2MB为一个分片,每个分片的大小 shardCount = Math.ceil(size / shardSize); //总片数 if (i >= shardCount) { return; } //console.log(size,i+1,shardSize); //文件总大小,第一次,分片大小// var start = i * shardSize; var end = start + shardSize; var packet = file.slice(start, end); //将文件进行切片 /* 构建form表单进行提交 */ var form = new FormData(); form.append("data", packet); //slice方法用于切出文件的一部分 form.append("lastModified", file.lastModified); //最后的额修改时间 form.append("name", name); form.append("type", type); form.append("totalsize", size); form.append("total", shardCount); //总片数 form.append("index", i + 1); //当前是第几片 form.append("_cfs", $.cookie('_cfc')); $.ajax({ formData: { _cfs: $.cookie('_cfc') }, url: uploaddo_url, type: "POST", data: form, //timeout:"10000", async: true, //异步 dataType: "json", processData: false, //很重要,告诉jquery不要对form进行处理 contentType: false, //很重要,指定为false才能形成正确的Content-Type success: function(msg) { console.log(msg.status); /* 表示上一块文件上传成功,继续下一次 */ if (msg.status == 201) { form = ''; i++; PostFile(file, i, t); } else if (msg.status == 502) { form = ''; /* 失败后,每2秒继续传一次分片文件 */ setInterval(function() { PostFile(file, i, t) }, 2000); console.log("上传失败"); } else if (msg.status == 200) { console.log("上传成功"); } else if (msg.status == 500) { console.log('第' + msg.i + '次,上传文件有误!'); } else { console.log('未知错误'); } }, error: function(msg) { console.log(2); console.log(msg.status); } }) }
php代码示例
public function video(){ $files = $_FILES['data']; $arr['i'] = $this->input->post('index'); $arr['shardCount'] = $this->input->post('total'); $arr['totalsize'] = $this->input->post('totalsize'); $arr['fileName'] = $this->input->post('name'); $arr['type'] = $this->input->post('type'); if($files['error'] > 0) { $arr['status'] = 502; exit(json_encode($arr)); } /* 检测第一次上传的时候已经有同文件时,删除原来的文件 */ if ($arr['i'] == 1 && is_file(UPLOAD_PATH. $arr['fileName']) && filesize(UPLOAD_PATH. $arr['fileName']) == $arr['totalsize']){ unlink(UPLOAD_PATH. $arr['fileName']); } // 否则继续追加文件数据 if (!file_put_contents(UPLOAD_PATH.$arr['fileName'],file_get_contents($files['tmp_name']),FILE_APPEND)) { $arr['status'] = 501; exit(json_encode($arr)); } // 在上传的最后片段时,检测文件是否完整(大小是否一致) if ($arr['i'] == $arr['shardCount']) { if(filesize(UPLOAD_PATH. $arr['fileName']) == $arr['totalsize']){ $arr['status'] = 200; $this->CI =& get_instance(); $this->CI->load->library('OssLibrary'); $files = array(); $content = file_get_contents(UPLOAD_PATH. $arr['fileName']); $files[] = OssLibrary::putObject($content, $arr['fileName'], $arr['totalsize'], $arr['type']); if ($files) { unlink(UPLOAD_PATH. $arr['fileName']); // 插入数据库 $this->db_isnert($files); } $arr['data'] = $files; }else{ $arr['status'] = 501; } exit(json_encode($arr)); } $arr['status'] = 201; exit(json_encode($arr)); }
function
PostFile(
file,
i,
t) {
console.
log(
1);
var
name =
file.
name,
//文件名
size =
file.
size,
type =
file.
type,
//总大小shardSize = 2 * 1024 * 1024,
shardSize =
2 *
1024 *
1024,
//以2MB为一个分片,每个分片的大小
shardCount =
Math.
ceil(
size /
shardSize);
//总片数
if (
i >=
shardCount) {
return;
}
//console.log(size,i+1,shardSize); //文件总大小,第一次,分片大小//
var
start =
i *
shardSize;
var
end =
start +
shardSize;
var
packet =
file.
slice(
start,
end);
//将文件进行切片
/* 构建form表单进行提交 */
var
form =
new
FormData();
form.
append(
"data",
packet);
//slice方法用于切出文件的一部分
form.
append(
"lastModified",
file.
lastModified);
//最后的额修改时间
form.
append(
"name",
name);
form.
append(
"type",
type);
form.
append(
"totalsize",
size);
form.
append(
"total",
shardCount);
//总片数
form.
append(
"index",
i +
1);
//当前是第几片
form.
append(
"_cfs",
$.
cookie(
'_cfc'));
$.
ajax({
formData: {
_cfs:
$.
cookie(
'_cfc')
},
url:
uploaddo_url,
type:
"POST",
data:
form,
//timeout:"10000",
async:
true,
//异步
dataType:
"json",
processData:
false,
//很重要,告诉jquery不要对form进行处理
contentType:
false,
//很重要,指定为false才能形成正确的Content-Type
success
:
function(
msg) {
progressall(
i +
1,
shardCount);
console.
log(
msg.
status);
/* 表示上一块文件上传成功,继续下一次 */
if (
msg.
status ==
201) {
form =
'';
i++;
PostFile(
file,
i,
t);
}
else
if (
msg.
status ==
502) {
form =
'';
/* 失败后,每2秒继续传一次分片文件 */
setInterval(
function() {
PostFile(
file,
i,
t) },
2000);
console.
log(
"上传失败");
}
else
if (
msg.
status ==
200) {
console.
log(
"上传成功");
done(
msg.
data,
t)
}
else
if (
msg.
status ==
500) {
console.
log(
'第' +
msg.
i +
'次,上传文件有误!');
}
else {
console.
log(
'未知错误');
}
},
error
:
function(
msg) {
console.
log(
2);
console.
log(
msg.
status);
}
})
}