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

  问题一,在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. nyoj329-循环小数

    329-循环小数 内存限制:64MB时间限制:3000msSpecial Judge: No accepted:1submit:1 题目描述: 我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循 ...

  2. 03.IO读写-1.IO介绍

    1 文件操作介绍 in: 输入,读入.从硬盘中读到内存 out: 输出.从内存写到硬盘 文件的作用: 数据存储 2 文件的打开与关闭 2.1 打开文件 在Python,使用open函数,可以打开一个已 ...

  3. Emgu cv人脸检测识别

    Emgu cv人脸检测识别 1.开发平台:WIN10 X64    VS2012    Emgucv版本:3.1 2.先给大家分享一个官网给的示例源代码: https://ncu.dl.sourcef ...

  4. Profile 动态切换环境

    一.多 Profile 文件我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml默认使用 application.properties 的 ...

  5. selenium+java处理鼠标悬停

    1.元素比较明确(可视) 2.元素隐藏,需要鼠标移动到一定地方才显现(下图为某论坛列表,需要将鼠标移动到列表才显示操作按钮)

  6. C#中的string驻留池

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: String s1 = "He ...

  7. [Design]制作磨砂效果

    比较适合运用到网页或者APP的设计当中,推荐过来和飞特的朋友们一起分享学习了,先来看看最终的效果图吧 具体的制作步骤如下:

  8. Tcl学习之--表达式

    l 数值操作数 表达式的操作数一般是整数或实数.整数可能是十进制.二进制,八进制或十六进制. 比方以下同一个整数 335               --> 十进制 0o517         ...

  9. NHibernate之旅(14):探索NHibernate中使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用 ...

  10. Tokyo Tyrant(TTServer)系列(三)-Memcache协议

    通过Memcache协议使用ttserver  通过telnet 127.0.0.1 9032 telnet连接到到启动的实例. 下面我们通过add添加key为key1和value为value1的数据 ...