`

参考qqfileuploader写个js iframe式的上传文件

 
阅读更多

js代码——依赖base.js和jquery

/**
* Begin class defination Uploader : 上传文件类
*/
var Uploader = Base.extend({
	constructor : function(btn, params){
		this.input_id = btn;
		if(params)
			Utils.extend(this._options, params);

		this.init_upload();
	}, 

	_options : {
		input_file_name : 'qqfile', 
		action : 'upload.do', 
		params : {}, 

		allow_ext_ll : ['txt', 'doc'], 
		size_limit : 1024 * 1024 * 5, 

		messages : {
			type : '不支持的文件类型!', 
			empty : '请选择上传文件!', 
			size : '上传文件大小超过限制!'
		}, 

		on_complete : function(file_name, json){}, 
		on_progress : function(){}
	}, 

	// button 
	input_id : 'btn_uploader', 
	_el : null, 
	_input : null, 

	init_upload : function(){
		this._el = $("#" + this.input_id);
		if(this._el.size() == 0){
			throw new Error('上传按钮目标不存在!');
		}
		this._el.css({
			position: 'relative',
			overflow: 'hidden',
			// Make sure browse button is in the right side
			// in Internet Explorer
			direction: 'ltr'
		});

		this.input_reset();
	}, 

	input_reset : function(){
        if(this._input){
			this._input.remove();   
        }                
        this._input = Uploader.create_input(this._el, this._options['input_file_name']);
		_self = this;
		this._input.change(function(){
			_self.input_change();
		});
	}, 

	input_change : function(){
		var r = this.file_valid(this._input[0]);
		if (r.error){  
			alert(this._options.messages[r.error]);
		}else{
			this.upload(this._options.params);                                    
		}
        this.input_reset();
	}, 

	file_get_name : function(){
		return this._input.val().replace(/.*(\/|\\)/, "");
	}, 

    file_valid : function(file){
        var name,size,ext;
 
        if (file.value){
            // it is a file input            
            // get input value and remove path to normalize
            name = file.value.replace(/.*(\/|\\)/, "");
			ext = name.substring(name.lastIndexOf('.') + 1);
        } else {
            // fix missing properties in Safari
            name = file.fileName != null ? file.fileName : file.name;
            size = file.fileSize != null ? file.fileSize : file.size;
        }

        if (!this._options.allow_ext_ll.contains(ext)){            
            return {error: 'type'};
        } else if (size === 0 || !name || name.trim() == ''){            
            return {error: 'empty'};
        } else if (size && this._options.size_limit && 
			size > this._options.size_limit){            
            return {error: 'size'};        
        }
        return {error: false};                
    },

    upload: function(params){                        
        var file_name = this.file_get_name();
                
        var _iframe = Uploader.create_iframe(this.input_id);
        var _form = Uploader.create_form(_iframe, 
			this._options.action, params);
        _form.append(this._input);

		_self = this;

		_iframe.load(function(){
			iframe = _iframe[0];
            if (!iframe.parentNode){
                return;
            }
            if (iframe.contentDocument &&
                iframe.contentDocument.body &&
                iframe.contentDocument.body.innerHTML == "false"){
                return;
            }

			_self._options.on_complete(file_name, 
				Uploader.get_json_iframe(iframe));
            
            // timeout added to fix busy state in FF3.6
            setTimeout(function(){
               _iframe.remove();
            }, 1);
        });

        _form.submit();        
        _form.remove();       
    },

    cancel: function(){        
        var _iframe = $("iframe[name='" + this.input_id + "']");
        if (_iframe.size() > 0){
            // to cancel request set src to something else
            // we use src="javascript:false;" because it doesn't
            // trigger ie6 prompt on https
            _iframe.attr('src', 'javascript:false;');
            _iframe.remove();
        }
    }

	},{
	// static properties and methods
	tpl : '<tr class="tr_nc">' + 
		'<td><input type="checkbox" name="chx_files" value="${0}" /></td>' + 
		'<td>${1}</td>' + 
		'<td>${2}</td>' + 
		'<td>${3}</td>' + 
		'<td>${4}</td>' + 
		'</tr>', 

	btn_uploader_del : function(url){
		var _chxs = $("input[name='chx_files']:checked");
		if(_chxs.size() > 0){
			if(confirm('确定要删除所选附件么?')){
				var ids = _chxs.map(function(){
					return $(this).val();
				}).get().join(',');
				$.get(url, {file_ids: ids}, function(data){
					if(data.error){
						alert(data.error);
					}else{
						_chxs.parents("tr.tr_nc").remove();
					}
				});
			}
		}else{
			alert('请选择要删除的附件!');
		}
	}, 

    create_iframe : function(id){
        var _iframe = $('<iframe src="javascript:false;" name="' + id + '" />');
        // src="javascript:false;" removes ie6 prompt on https
        _iframe.attr('id', id).css('display', 'none');
        $(document.body).append(_iframe);
        return _iframe;
    },

    create_form : function(_iframe, action, params){
        var _form = $('<form method="post" enctype="multipart/form-data"></form>');
        var query_str = '?';
        for (var key in params){
            query_str += '&' + key + '=' + encodeURIComponent(params[key]);
        }

        _form.attr('action', action + query_str);
        _form.attr('target', _iframe.attr('name'));
		_form.css('display', 'none');
        $(document.body).append(_form);
        return _form;
    }, 

    create_input : function(_el, name){                
        var _input = $("<input />");
        
        _input.attr("type", "file");
        _input.attr("name", name);
        // IE and Opera, unfortunately have 2 tab stops on file input
        // which is unacceptable in our case, disable keyboard access
        if (window.attachEvent){
            // it is IE or Opera
            _input.attr('tabIndex', "-1");
        }   
		
        _input.css({
            position: 'absolute',
            // in Opera only 'browse' button
            // is clickable and it is located at
            // the right side of the input
            right: 0,
            top: 0,
            'z-index': 1,
            'font-size': '13px',
            margin: 0,
            padding: 0,
            cursor: 'pointer',
            opacity: 0
        });
        
        _el.append(_input);
        return _input;            
    },

    get_json_iframe: function(iframe){
        // iframe.contentWindow.document - for IE<7
        var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document,
            response;
        try{
            response = eval("(" + doc.body.innerHTML + ")");
        } catch(err){
            response = {error: doc.body.innerHTML};
        }
        return response;
    }
});

 

	<script language="javascript">
		var upload_callback = function(file_name, json){
			if(typeof json == 'string'){
				alert(json);
			}else if(json.error){
				alert(json.error);
			}else{
				var tr_tpl = Uploader.tpl.format(
					json['file_id'], 
					json['file_name'], 
					json['file_ext'], 
					json['upload_date'], 
					json['file_des']);
				$("#upload_file_ll").append(tr_tpl);
			}
		}

		$(function(){
			$("#btn_uploader_remove").click(function(){
				Uploader.btn_uploader_del('remove_upload2.gy');
			});

			new Uploader('file_uploader', {
				action : 'upload2.gym', 
				on_complete : upload_callback
			});
		});
	</script>

	<table id="upload_file_ll" class="table_n">
		<tr class="tr_nh">
			<td></td>
			<td>
				文件名
			</td>
			<td>
				附件类型
			</td>
			<td>
				上传时间
			</td>
			<td>
				附件说明
			</td>
		</tr>
	</table>
	<table class="table_n">
		<tr>
			<td colspan="3" style="text-align:center;">
				<input type="button" class="button1" value=" 查看附件 " />&nbsp;&nbsp;
				<input type="button" class="button1" value=" 删除附件 " id="btn_uploader_remove" />&nbsp;&nbsp;
				<input type="button" class="button1" value=" 上传附件 " id="btn_uploader" />&nbsp;&nbsp;
			</td>
		</tr>
		<tr>
			<td width="48%"></td>
			<td style="text-align:center;">
			<span id="file_uploader" class="button1">Uploader</span>
			</td>
			<td width="48%"></td>
		</tr>
	</table>

 

 

后台处理文件上传的代码例子(我做了封装):只是返回数据让js回调而已。

	def Map upload2(){
		if(params._files){
			def item = params._files.getOne('qqfile')
			if(item){
				def ff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
				return [json: true,
					file_id: 123, 
					upload_date: ff.format(new Date()),  
					file_ext: item.fileExt, 
					file_size: item.binary.size(), 
					file_name: item.fileName]
			}
		}
		return [json: true, file_size: 0]
	}
 

 

 

分享到:
评论

相关推荐

    js加iframe轻松实现异步图片上传 可以预览 兼容FF,chrome,ie9

    2. 当用户选择文件后,创建一个隐藏的IFrame元素,设置其`src`为一个服务器上的接口地址,这个接口会接收并处理上传的文件。 3. 创建一个`&lt;form&gt;`元素,将用户选择的文件作为`&lt;input type="file"&gt;`的一部分,将`...

    ajax iframe jsp 无刷新上传文件.zip

    总结,"ajax iframe jsp 无刷新上传文件.zip"包含的知识点涵盖了Ajax与Iframe结合的文件上传技术,JSP服务器端处理,JavaScript字符串操作,Struts2的验证和链接标签,以及Spring入门和JSP请求Action的方法。...

    javascript写的可拖动的iframe

    然后,我们关注到"ifrWin.js",这是一个JavaScript文件,实现了iframe的拖动逻辑。在这个文件中,我们需要创建一个类来处理iframe的拖动事件。这个类可能包含初始化方法、事件监听器(如`mousedown`、`mousemove`和`...

    动态加载js、css等文件跨iframe实现

    1、动态加载js,css文件(用原生js和jquery) iframe结构: frame0(父) frame2(子) frame3(子) frame2中触发事件,动态的向frame3中 加载js、css文件和 dom元素? *同级之间可以调用,可以 通过 子-父-子 的方式...

    js iframe 打印 打印预览 页眉页脚的设置

    在JavaScript(JS)中,利用iframe进行打印和打印预览是常见的需求,特别是在网页开发中。这个场景下,我们可能需要自定义页眉和页脚,以提供更专业的打印效果。下面将详细介绍如何通过JS实现这个功能。 首先,我们...

    js处理iframe的系列问题

    ### JavaScript处理iframe的相关知识点 在Web开发中,`iframe`(Inline Frame)是一种常见的HTML元素,用于嵌入另一个HTML文档到当前文档中。利用JavaScript可以实现对`iframe`中的元素进行操作,例如读取或修改...

    js自定义方法通过隐藏iframe实现文件下载

    - 通过js修改iframe的src属性,将包含文件下载链接的URL设置给iframe。 - 由于iframe是隐藏的,用户不会看到文件内容,但浏览器会处理该文件请求,并根据MIME类型自动开始下载文件。 - 实现隐藏下载的关键是创建...

    HTML5 postMessage+iframe实现文件跨域异步上传

    首先,我们创建一个包含文件上传表单的页面,表单需要设置`target`属性为一个`iframe`的ID,这样提交后会把结果加载到`iframe`中,而不会刷新整个页面。例如: ```html 上传 &lt;iframe id="uploadFrame" style=...

    js调用-嵌入iframe

    其中,"js调用-嵌入iframe"是JS在处理页面元素,特别是与IFrame(内联框架)交互时的一个重要技术。IFrame允许在单一网页中嵌入另一个网页,从而实现内容的复用或隔离。下面我们将详细探讨这一主题。 **1. IFrame...

    js调用iframe实现打印页面内容的方法

    通过上述介绍,我们可以了解到使用JS调用iframe实现页面内容打印的方法主要分为以下几个步骤:准备打印内容、创建并配置iframe、调用打印功能以及处理打印后的清理工作。这些技术手段为网页开发者提供了灵活的方式来...

    通用iframe下载excel的javascript和Java封装程序

    标题中的“通用iframe下载excel的javascript和Java封装程序”指的是一个使用JavaScript和Java技术实现的通用文件下载解决方案,特别适用于处理Excel文件下载。这个方法利用了iframe的技术来规避浏览器的安全限制,...

    jQuery-1.8.3(&2.1.4).min.js&jquery;.fileupload&jquery;.iframe-transport

    由于浏览器的安全策略,某些情况下普通的Ajax上传可能无法工作,这时Iframe Transport通过创建一个隐藏的iframe来模拟表单提交,从而实现跨域和大文件的无刷新上传。这种技术对于那些不支持FormData或XMLHttpRequest...

    基于js的iframe 可关闭tab标签组件使用方法

    在网页开发中,JavaScript(js)经常被用来增强用户体验,特别是在构建动态交互式的用户界面时。本教程将详细讲解如何使用JavaScript实现一个可关闭的iframe内嵌tab标签组件。这个组件能够帮助用户在同一个页面中...

    php之表单文件iframe异步上传

    服务器处理完文件后,响应会被`&lt;iframe&gt;`接收,然后JavaScript可以读取`&lt;iframe&gt;`的内容,从而获取上传状态和返回数据。 以下是实现步骤: 1. 创建一个包含`&lt;iframe&gt;`的HTML页面,设置`iframe`的`name`属性,以便...

    ckeditor 自己写的一个简单的image上传js 运用iframe的ajax上传

    "ckeditor 自己写的一个简单的image上传js 运用iframe的ajax上传"是一个关于CKEditor自定义插件的实践案例,通过JavaScript实现了图片上传功能。下面将详细阐述这一知识点及其相关技术。 首先,CKEditor是一款开源...

    dojo_iframe无刷新上传文件demo.rar

    实例VS2010代码 dojo_iframe无刷新上传文件demo.rar dojo_iframe无刷新上传文件demo.rar dojo_iframe无刷新上传文件demo.rar dojo_iframe无刷新上传文件demo.rar dojo_iframe无刷新上传文件demo.rar

    用js互相调用iframe页面内的js函数

    在这个场景下,涉及到的一个常见需求就是如何用JavaScript在主页面与`iframe`页面之间互相调用函数,以便于进行更复杂的交互。 标题提到的问题是在各种浏览器中,尤其是考虑到跨浏览器兼容性时,如何用JS实现主页面...

    获取iframe值 文件下载

    ### 获取iframe值与文件下载知识点详解 #### 一、引言 在Web开发过程中,`iframe`(Inline Frame)是一种非常实用的技术,它允许在当前页面内嵌入另一个HTML文档,实现网页局部刷新或者加载其他网页内容的效果。...

    解决JS跨域访问IFrame的解决方案

    在Web开发中,JavaScript(JS)的同源策略限制了不同源之间进行交互,包括从一个页面中的脚本访问另一个不同源的IFrame内容。"解决JS跨域访问IFrame的解决方案"这一主题关注的就是如何克服这个限制,使得在JSP页面中...

    JS去除iframe滚动条的方法

    在介绍JS去除iframe滚动条的方法之前,首先需要理解iframe元素在HTML中的作用。iframe元素代表了一个嵌入的网页,允许在一个HTML页面中嵌入另一个文档,这在多种场景下非常有用,比如页面中嵌入第三方应用的界面等。...

Global site tag (gtag.js) - Google Analytics