/*
* 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);
} }) }
最新文章
- OneThink开发框架
- JavaWeb 学习003-简单登录页面功能实现
- linux /usr/bin/ld: cannot find -lxxx
- apache2.4的安装与卸载
- 云计算服务模型,第 3 部分: 软件即服务(PaaS)
- [设计模式]<;<;设计模式之禅>;>;关于依赖倒置原则
- 创业公司Playcafe关门大吉 创始人总结10大失败教训
- Ecshop图片不清晰怎么办?
- hadoop-2.6.0为分布式安装
- VB.NET 结构(Structure)和类(Class)的区别
- JavaScript之包装对象
- beanutils中Lazy
- spring-dwr注解整合
- Java实现zip压缩文件的解压
- POJ 1284:Primitive Roots(素数原根的个数)
- Uva10474-STL水题-白书
- Android 实现简单 倒计时60秒,一次1秒
- pdo的用处,用法
- Qt Creator在Windows上的调试器安装与配置
- EF直接的一對多多對多多對一的關係----也即是鏈錶查詢
热门文章
- ES6解构赋值的应用场景
- hdu 1394(线段树) 最小逆序数
- iOS.Crash.OniOS8.WhenCall[popToRootViewController]
- (O)阻止默认事件和阻止冒泡的应用场景
- LaTeX数学公式大全
- 在开发node.js中,关于使用VS2013插件出现一直读取资源的问题
- 使用Loadrunner对IBM MQ进行性能测试
- Ubuntu中文乱码问题解决方案
- Servlet 3.0 规范(二)注解驱动和异步请求
- 后期生成事件命令copy /y