很多项目中都需要有文件上传的功能,一般文件上传有几种方式,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. jupyter中添加conda环境

    安装完Anaconda利用conda创建了虚拟环境,但是启动jupyter notebook之后却找不到虚拟环境. 实际上是由于在虚拟环境下缺少kernel.json文件,解决方法如下: 首先安装ip ...

  2. Python基础(10)——类进阶(静态方法、类方法、属性方法)

    以下方法为高级方法,一般来说没什么卵用 1.静态方法 @staticmethod 相当于把类内的函数从类内独立出来,只是名义上归类管,实际上不可以调用类内的变量和函数 通过@staticmethod装 ...

  3. UPF Usage

    在 multi-voltage design 中,当涉及到多个power supply 时,需要 upf 文件来描述power细节,现将 upf 中的基本概念和使用方法记录如下: upf 中的基本概念 ...

  4. aips初步设想

    2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...

  5. C++之new和delete操作符

    在C语言中的动态分配和释放内存的函数是malloc calloc 和 free , 而在C++中要用 new new[] delete delete[] 来申请动态空间和释放空间. 注意:的是new. ...

  6. Android放大镜效果的简单实现

    package com.example.myapi.pictobig; import com.example.myapi.R; import android.content.Context; impo ...

  7. Linux服务-openssh

    目录 1. 使用 SSH 访问远程命令行 1.1 OpenSSH 简介 1.2 SSH 版本 1.3 SSH 认证方式 1.4 openSSH 的工作模式 1.5 Secure Shell 示例 1. ...

  8. 20155239吕宇轩 Exp1 PC平台逆向破解(5)M

    20155239 网络对抗 Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程器 (1分) ...

  9. VBA how to crack Excel Password

    来源 更多vba相关 vba教程 VBA cheat sheet 1. VBA how to crack Excel Workbook/Worksheet password To remove the ...

  10. 【python笔记】使用matplotlib,pylab进行python绘图

    一提到python绘图,matplotlib是不得不提的python最著名的绘图库,它里面包含了类似matlab的一整套绘图的API.因此,作为想要学习python绘图的童鞋们就得在自己的python ...