很多项目中都需要有文件上传的功能,一般文件上传有几种方式,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 zhaoyunfei9271@163.com 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其他暂时没有测试

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

  1. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)

    Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...

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

    相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...

  3. ie8实现无刷新文件上传

    ie8由于无法使用FormData,想要无刷新上传文件就显得比较麻烦.这里推荐使用jQuery-File-Upload插件,它能够很方便的解决ie8无刷新文件上传问题.(最低兼容到ie6) jQuer ...

  4. SpringMVC ajax技术无刷新文件上传下载删除示例

    参考 Spring MVC中上传文件实例 SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传 Spring MVC 文件上传下载 (FileOperateUtil.ja ...

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

    无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现. 在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单 ...

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

    一.摘要 最近在做个东西,需要实现页面无刷新文件上传,目前看到的方法有两种 1) 通过隐藏iframe 实现页面无刷新,适用于不关心上传结果 <form target="hiddenF ...

  7. 实用ExtJS教程100例-009:ExtJS Form无刷新文件上传

    文件上传在Web程序开发中必不可少,ExtJS Form中有一个filefield字段,用来选择文件并上传.今天我们来演示一下如何通过filefield实现ExtJS Form无刷新的文件上传. 首先 ...

  8. jquery ajax file upload NET MVC 无刷新文件上传

    网上有各种各样的文件上传方法,有基于JS框架的.也有基于flash swf插件的. 这次分享一个比较简单而且实用能快速上手的文件上传方法,主要步骤: 1.引用Jquery包,我用的是jquery-1. ...

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

    最近因项目需求更改,需要实现选择文件后即时上传至服务器,然后提交后,加载xls表格内容到jqgrid表格中,文件上传功能实现示例: 前端jsp页面: <form id="uploadF ...

随机推荐

  1. Jquery属性练习

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  2. golang postgresql CRUD

    package main import ( "database/sql" "fmt" "log" _ "github.com/li ...

  3. Postman无法正常启动解决办法

    问题描述: 应用程序窗口能够打开,但就是这样一直空白,什么都不显示.接下来,主窗口以纯白色加载,不显示任何其他内容. 接下来主窗口背景米色加载和菜单栏加载和工作.应用程序将永远保持这样, 有时界面会变 ...

  4. 07-django项目

    1.sql注入,xss攻击,csrf, sql注入 把sql命令插入到web表单,然后提交到所在页面请求,从而达到欺骗服务器执行恶意的sql命令 解决方法:不要使用动态拼接sql,把指令和数据分开,参 ...

  5. noi.ac 257 B

    链接 题目 区间[l,r]是连续满足,[l,r]中的数字的权值区间是一段连续的.多次询问可以完包含一个区间的连续区间.区间长度尽量小,如果有多个输出左端点靠左的. 分析: [l,r]区间是连续的,当且 ...

  6. ubuntu安装微信客户端

    安装linux微信: apt-get install git git clone https://github.com/geeeeeeeeek/electronic-wechat.git cd ele ...

  7. mybatis 异常 too many connections 解决方案 mysql

    参考: https://blog.csdn.net/u011628250/article/details/54017481 https://www.cnblogs.com/baby123/p/5710 ...

  8. [CF966F]May Holidays[分块+虚树]

    题意 给定 \(n\) 个点的树,初始所有颜色都是 \(0\) ,每个点有一个阈值 \(t\) ,每次可能会让一个点的颜色异或1,问每次操作之后有多少个点满足子树内的颜色为 \(1\) 的点的个数 \ ...

  9. Security4:授予查看定义,执行SP和只读数据的权限

    SQL Server数据库有完善的权限管理机制,对于存储过程,其权限分为查看定义,执行和修改,查看SP定义的权限是:VIEW DEFINITION ,执行存储过程的权限是:EXECUTE,修改SP的权 ...

  10. mongodb分片集群

    第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...