前些日子公司网站需要开发一个类似与百度文库上传文档的功能,实现文档的批量上传、展示以及继续上传的功能。开发完成后,通过在多版浏览器下的使用,发现了一系列问题,特总结于下,以免来者在这些问题上耗费太多时间。

  问题一,在IE8、9下,上传页面隐藏后无法继续上传且继续上传的按钮不再可以使用。

     原因:在IE8、9下,pupload采用的是flash上传,在上传按钮隐藏后,插件上传就会出错,也不支持在别处调用上传按钮的事件。

     解决方案:调整需求,在当前页面完成上传后再行跳转。

  问题二,在IE9下,点击上传按钮,上传返回的结果是正确的,但在脚本中无法获取到上传结果

       原因:我们开发的新功能嵌入到了老页面当中,两个页面域名不一致,需要解决跨域问题,页面一旦出现document.domain=""这种语句,就会有相应问题

解决方案:延迟使用document.domain,在上传完毕后再调用该语句。

问题三,在调用进度条事件时,返回的file对象不包含我再该对象中绑定的内容,代码如下:

      this.uploader.bind('UploadProgress', function (uploader, file) {
file.block.updateProgress(uploader.files[i]);
});

   解决方案:经过跟踪发现,在uploader参数的files中包含绑定的对象,于是搜索uploader中的相应对象,修改后的代码如下:

        //进度条事件
this.uploader.bind('UploadProgress', function (uploader, file) {
for (var i = 0; i < uploader.files.length; i++)
{
if(uploader.files[i].id===file.id)
{
uploader.files[i].block.updateProgress(uploader.files[i]);
break;
}
}
});

  以上系在开发测试过程当中遇到的主要的一些问题,下面列出我封装的上传方法,供需要的朋友参考使用:

 /*************************************
*功能:上传对象,通过该类实现上传,进度条,完成等事件的控制
*日期:2017/08/23
**************************************/
(function (d) {
var BaseUpload = function () {
this.uploader={};
this.Filelength= 0;//当前文件队列长度
this.fileDisplayArray = [];//文件节点队列
} BaseUpload.prototype = {
onload: function (option) {
this.config.bind(option);
this.fileOption = option.fileOption;//通过fileOption对象来实现上传结果的输出
this.extensions = option.extensions;//要过滤的上传内容
if (option.uploadType === "file") {
this.uploader = new plupload.Uploader(this.config);
} else if (typeof WebkitUploader !== "undefined") {
this.uploader = new WebkitUploader(this.config);
} this.uploader.init(); this.BindEvnet();
},
BindEvnet: function () {
var _this = this;
//绑定文件添加进队列事件
this.uploader.bind('FilesAdded', function (uploader, files) {
_this.FilesAdded(_this, uploader, files);
});
//进度条事件
this.uploader.bind('UploadProgress', function (uploader, file) {
for (var i = 0; i < uploader.files.length; i++)
{
if(uploader.files[i].id===file.id)
{
uploader.files[i].block.updateProgress(uploader.files[i]);
break;
}
}
});
//上传成功则回调该方法
this.uploader.callBack = function (file, jsonstr) {
_this.fileOption.complete(file, jsonstr);
};
},
FilesAdded: function (_this, uploader, files) {
if (this.fileOption.checkFiles(files, this.extensions))
{
uploader.files = this.fileOption.prepare(files);
uploader.start(); //开始自动上传
}
},
config: {
flash_swf_url: '/Content/Js/plupload/Moxie.swf',
silverlight_xap_url: '/Content/Js/plupload/Moxie.xap',
bind: function (option) {
this.url = option.url;
this.filters.extensions = option.extensions;
this.filters.init();
this.browse_button = option.browse_button;
this.multi_selection = option.multi_selection;
this.drop_element = option.drop_element;
this.init.callBack = option.callBack;
},
filters: {
init: function (extensions) {
this.mime_types = [{ title: "文档文件", extensions: this.extensions }];
},
max_file_size: '1000mb', //最大文件限制
file_size: '1250mb', //一次上传数据大小
unique_names: true, //是否自动生成唯一名称
prevent_duplicates: false //不允许队列中存在重复文件
}, multipart: true, //以multipart/form-data的形式来上传文件
multipart_params: {
'sourceid': '1'
},
max_retries: 3, //当发生plupload.HTTP_ERROR错误时的重试次数,为0时表示不重试
chunk_size: 0, //分片上传文件时,每片文件被切割成的大小,为数字时单位为字节。也可以使用一个带单位的字符串,如"200kb"。当该值为0时表示不使用分片上传功能
unique_names: false, //当值为true时会为每个上传的文件生成一个唯一的文件名,并作为额外的参数post到服务器端,参数明为name,值为生成的文件名。
file_data_name: 'file', //指定文件上传时文件域的名称,默认为file,如Request.QueryString["file"];
init: {
FileUploaded: function (up, file, info) {
if (info.response != null) {
var jsonstr = eval("(" + info.response + ")");
this.callBack(file, jsonstr);
if (!jsonstr.IsSuccess) {
$.alert(jsonstr.Message); //错误提示
};
};
},
Error: function (up, args) {
fileSize = 0;
//发生错误
if (args.file) {
if (args.file.size > 30 * 1024 * 1024) {
$.alert('上传文件大于30MB,请使用e网通上传');
}
}
this.callBack(args.file, { IsSuccess:false});
}
}
} };
window.BaseUpload = BaseUpload; })(document);

pupload上传插件问题整理的更多相关文章

  1. Plupload上传插件简单整理

    Plupload Plupload是有TinyMCE的开发者开发的,为您的内容管理系统或是类似上传程序提供一个高度可用的上传插件.Plupload 目前分为一个核心API 和一个jQuery上传队列部 ...

  2. JQuery上传插件uploadify整理(Events)

    Arguments fileThe file object being cancelled onCancel:调用calcel方法.$('#upload').uploadify('cancel'); ...

  3. JQuery上传插件uploadify整理(Options)

    下载  现在有两个版本了,我此次使用的依然是Flash版本的,虽然现在绝大部分浏览器都兼容HTMKL5,目前位置,除了做手机项目外,一般我们项目中不允许使用HTML5标签. 属性介绍(Options) ...

  4. Bootstrap FileInput 多图上传插件 文档属性说明

    Bootstrap FileInput 多图上传插件   原文链接:http://blog.csdn.net/misterwho/article/details/72886248?utm_source ...

  5. 7 款基于 JavaScript/AJAX 的文件上传插件

    本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1.  jQuer ...

  6. Bootstrap FileInput 上传 中文 API 整理

    Bootstrap FileInput 上传  中文 API 整理 上传插件有很多 但是公司用的就是 Bootstrap FileInput 自己就看了看  会用就行 自己都不知道每个值是干嘛用的就问 ...

  7. ajax如何上传文件(整理)

    ajax如何上传文件(整理) 一.总结 一句话总结:用FormData,FormData+ajax=异步上传二进制文件 <form enctype="multipart/form-da ...

  8. 强大的flash头像上传插件(支持旋转、拖拽、剪裁、生成缩略图等)

    今天介绍的这款flash上传头像功能非常强大,支持php,asp,jsp,asp.net 调用 头像剪裁,预览组件插件. 本组件需要安装Flash Player后才可使用,请从http://dl.pc ...

  9. 强大的支持多文件上传的jQuery文件上传插件Uploadify

    支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...

随机推荐

  1. CSS - display:inline-block 相邻元素间有4px的空白间距

    取消“display:inline-block 相邻元素间有4px的空白间距” Demo:http://jsfiddle.net/JSDavi/p6gcx6nx/ 例子: <div sytle= ...

  2. N3-1 - 数组 - convert-sorted-array-to-binary-search-tree

    题目描述: Given an array where elements are sorted in ascending order, convert it to a height balanced B ...

  3. redis实现集群加主从复制

    a)原理 (1)前提背景:如何解决redis横向扩展的问题----redis集群实现方式 (2)介绍redis 集群 ① Redis 集群是一个提供在多个Redis间节点间共享数据的程序集 ② 优势: ...

  4. HTML5学习(一)

    HTML5学习 HTML5的基本结构 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content ...

  5. 移植Mplayer到OK6410开发板

    移植Mplayer到OK6410开发板 作者:vasage 项目需要,需要将Mplayer移植到开发板上,所以今天花了一下下午成功移植,其中参考很多文档,后发现许多文档陈旧,些许文档有少量错误,所以这 ...

  6. 【ACM-ICPC 2018 南京赛区网络预赛 E】AC Challenge

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个DP 设f[j]表示已经做的题的状态为j的情况下接着选能获得的最大分数. 显然是个倒推. 记忆化搜索一波 dfs(i,j) 表示 ...

  7. Hibernate-原生SQL查询

    HQL尽管容易使用,但是在一些复杂的数据操作上功能有限.特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务. 1.使用 ...

  8. Guava工具类

    原文链接:http://blog.csdn.net/mnmlist/article/details/53425865 Objects类 Objects类有几个比较不错的方法,toString.hash ...

  9. NEFU 2

    其实就是筛选素数. 如,若能被2是质数,则2的倍数全是合数.如此循环. #include <iostream> #include <math.h> #include <c ...

  10. gem update --system

    gem update --system 修改完gem sources之后,进行gem update: gem update --system 之后的输出: C:\Sites\test01>gem ...