jquery无刷新文件上传 解决IE安全性问题

很多项目中都需要有文件上传的功能,一般文件上传有几种方式,input file表单上传,flash上传。

flash就不说了,能接受flash的就用吧。

下面介绍的这种是基于input file控件的无刷新上传文件方案。

一般上传是用iframe表单提交的方式,页面中的iframe刷新是不会刷新整个页面的,所以由iframe利用input
file提交表单上传到服务器在主页面看起来就是无刷新的。

大家能想到的方法无外乎:

1.在页面新建一个iframe和一个form

2.form的target指向iframe

3.form中新建一个input file

4.点击form中的input选择文件之后提交form实现上传,返回上传到服务器的文件地址,获取到地址返回到主页面(注意:IE中必须由用户自己点击input才能提交form。否则报拒绝访问的错误)

5.主页面获得地址展示

这里有一个小小的问题用户必须自己点击input选择文件才能提交!(只有IE会有问题,但是这是不能忽视的)也就是说让用户点击的input嵌套在一个form中。

form与主页面之间还要做各种交互。

这无论对于按钮布局样式还是程序便捷性都是不好的。

然后我去网站找了很多很优秀的上传插件,不是说不好,一是我觉得太重量级,二是自定义程度不高,第三个原因呢不知道是不是我太笨的缘故
教程看不懂啊!没有很好的demo也是造成很多使用者的困扰!索性自己写一个吧。

基本原理就是上述的那样 做了以下调整:

在主页面中添加input由用户去点击选择文件,input的change事件把input本身复制到form中并提交form,iframe的load事件得到返回的地址之后回调方法。

然后方法做了一些优化方便使用者调用


/*
通用文件上传类
version 1.00
code by chenfeng during 2014年6月5日
link [email protected]

Demo:
$("#filepost1").Uploader({////上传控件的ID
action: "/ajax/uploaderajax.ashx",//上传到服务器的路径 默认:/ajax/uploaderajax.ashx
params: "action=uploadpic",//特殊参数 随同文件一起提交到后台,以&号分隔 默认:action=uploadpic
maxsize: 1024 * 500,//文件最大尺寸 默认:500K
exts: ".jpg|.png|.gif|.jpeg",//文件格式限制 默认:.jpg|.png|.gif|.jpeg
callback: function (file, urlpath) { //上传完成之后回调函数 返回 控件实例和文件服务器路径
}
});
*/
$(function () {
var Uploader = function (file, options) {
var defaults = {
action: "/ajax/uploaderajax.ashx",
params: "action=uploadpic",
maxsize: 1024 * 500,
exts: ".jpg|.png|.gif|.jpeg",
callback: function (fileid, urlpath) { }
};
if (options == "remove") {
Uploader.Remove(file);
return;
}
var opts = $.extend(defaults, options);
var params = opts.params.split("&");
var form = $(‘<form action="‘ + opts.action + ‘" enctype="multipart/form-data" method="post" target="ifr_‘ + $(file).attr("id") + ‘" name="form_‘ + $(file).attr("id") + ‘" id="form_‘ + $(file).attr("id") + ‘" style="display: none;"/>‘);
for (var i = 0; i < params.length; i++) {
var values = params[i].split("=");
$(form).append(‘<input type="hidden" name="‘ + values[0] + ‘" value="‘ + values[1] + ‘"/>‘);
}
var iframe = $(‘<iframe name="ifr_‘ + $(file).attr("id") + ‘" id="ifr_‘ + $(file).attr("id") + ‘" style="position: absolute; top: -999px;"></iframe>‘);
$(file).change(function (e) {
if ($(this).val() != "" && $(this) != undefined) {
if (!Uploader.BeforeCheck(file, opts)) {
return;
}
var pfile = $(this).parent();
$(form).append($(this));
$(form).submit();
$(pfile).append($(this));
}
});
$(iframe).load(function () {
var contents = $(this).contents().get(0);
var data = $(contents).find(‘body‘).html();
if (data == "") { return; }
data = window.eval(‘(‘ + data + ‘)‘);
if (data.code != 200) {
alert(data.message);
return;
}
var picUrl = data.data.path;
opts.callback(file, picUrl);
});
$("body").append(form);
$("body").append(iframe);

}
Uploader.BeforeCheck = function (file, opts) {
var fileName = "";
var f = null;
if ($.browser.msie) {
f = document.getElementById($(file).attr("id"));
}
else {
f = document.getElementById($(file).attr("id")).files[0];
}
if (!$.browser.msie && f.size > opts.maxsize) {
alert(Uploader.ErrorTip.MaxSize);
return false;
}
fileName = $(file).val();
var exts = opts.exts.split("|");
var isExt = false;
for (var i = 0; i < exts.length; i++) {
if (fileName.indexOf(exts[i]) >= 0) {
isExt = true;
break;
}
}
if (!isExt) {
alert(Uploader.ErrorTip.Ext);
return false;
}
return true;
}
Uploader.ErrorTip = {
MaxSize: "文件超过尺寸",
Ext: "文件格式错误"
}
Uploader.Remove = function (file) {
$(file).remove()
$("#form_" + $(file).attr("id")).remove();
$("#ifr_" + $(file).attr("id")).remove();
}
$.fn.Uploader = function (options) {
return new Uploader(this, options);
}
})

注意:上传图片服务器返回数据json格式是

{code:200,message:"成功",data:{path:"XX/XX/XX.jpg"}}

这是默认可解析的格式,当然自己可以改写

经本人测试支持以下浏览器:

IE6.0+,firefox,chrome,safari其他暂时没有测试

时间: 2024-10-05 20:10:35

jquery无刷新文件上传 解决IE安全性问题的相关文章

Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认"拿来主义",只是我个人更喜欢凡是求个所以然.本篇将阐述通过Html,IHttpHandler和 IHttpAsyncHandler实现文件上传和上传进度的原理,希望对你有多帮助. 效果图: 本文涉及到的知识点:1.前台用到Html,Ajax,JQuery,JQuery UI 2.后台用到一般处理程序(IHttpHandler)和

ie8实现ajax无刷新文件上传

ie8由于无法使用FormData,想要无刷新上传文件就显得比较麻烦.这里推荐使用jQuery-File-Upload插件,它能够很方便的解决ie8无刷新文件上传问题.(最低兼容到ie6) jQuery-File-Upload的github:https://github.com/blueimp/jQuery-File-Upload 这里简单介绍一下jQuery-File-Upload的使用. 使用jQuery-File-Upload的基本功能需要引入四个文件: jquery.jquery.ifr

【JS】ajax 实现无刷新文件上传

一.摘要 最近在做个东西,需要实现页面无刷新文件上传,目前看到的方法有两种 1) 通过隐藏iframe 实现页面无刷新,适用于不关心上传结果 1 <form target="hiddenFrame" method="post" enctype="multipart/form-data" action='xx'> 2 <input value=""/> 3 <iframe name="hi

使用PHP和HTML5 FormData实现无刷新文件上传教程

无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现. 在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单请求,并通过 XMLHttpRequest 来发送.通过 FormData 对象发送文件也是可以的,如此则无刷新上传就变的非常简单了. 那么 FormData 怎么使用呢?下面phpstudy对此进行简单的介绍. 1. 构造 FormData 对象 想得到一个FormData对象,很简单: var

无刷新文件上传

无刷新文件上传 ajax的FormData对象完成无刷新操作 ajax level 2 标准 可以对文件操作,但是只支持新的浏览器(不兼容低版本的IE),是H5标准 注意事项: 表单大小 单个文件上传大小 ? 实操: 写一个form表单,但是需要注意的是,不为form表单设置 enctype属性 为上传的按钮绑定一个点击事件,完成ajax提交上传文件 利用FormData收集form表单里面的数据(普通数据 + 上传域里面的) 要利用ajax对象的upload成员的onprogress句柄来监控

jsp开发无刷新文件上传程序代码

原文:jsp开发无刷新文件上传程序代码 源代码下载地址:http://www.zuidaima.com/share/1550463484660736.htm 无刷新文件上传程序代码 源代码截图

基于jQuery Ajax实现无刷新文件上传

最近因项目需求更改,需要实现选择文件后即时上传至服务器,然后提交后,加载xls表格内容到jqgrid表格中,文件上传功能实现示例: 前端jsp页面: <form id="uploadForm" enctype="multipart/form-data"> <!-- 声明文件上传 --> <input id="file_upload" type="file" name="pic"

Javascrpt无刷新文件上传

最近工作中遇到上传文件问题,主要需求是一步点击上传,兼容ie8+,当时用的dojox/form/uploader控件,这两天扒了一下源码,明白了原理拿出来分享一下. 总体思路如下: 1.对于支持XMLHttpRequest2的浏览器使用FormData通过ajax上传 2.对于ie10一下的浏览器使用iframe异步上传,还需后台服务器做相应处理,这部分也是dojo/request/iframe上传文件的原理. 一.使用FormData上传文件 FormData最频繁使用的功能就是表单序列化及创

easyui+ajaxfileupload,无刷新文件上传

头文件引用 <link href="easyui/themes/default/easyui.css" rel="stylesheet" type="text/css" /> <link href="easyui/themes/icon.css" rel="stylesheet" type="text/css" /> <script src="ea