简便无刷新文件上传系统

之前写过一个仿163网盘无刷新多文件上传系统,已经对无刷新上传文件的原理做了详细的分析。
而这次的系统主要是针对单个file控件的,便携版,使用更简单,还有更深入的分析。
ps:flash实现的效果是好得多,但这不是我研究的范围,也没什么可比性。

兼容:ie6/7/8, firefox 3.5.5, opera 10.01, safari 4.0.3, chrome 3.0

12月2号是我女朋友的生日,祝她开心快乐每一天,一起创造幸福的未来,并感谢各位的祝福!


效果预览

文件上传
选择文件 重命名 操作 状态
重置 选择文件

ps:由于需要后台,要测试系统请下载实例测试。
ps2:在完整实例文件中,还有一个文件属性查看实例。


程序说明

【upload】

程序中最重要的方法就是upload了,调用它就可以进行无刷新上传。
upload的过程是这样的,首先用stop方法停止上一次上传,并判断是否选择文件。
然后分别调用_setIframe,_setForm和_setInput,生成需要的iframe,form和input。

如果设置了timeout属性的话,会自动设置计时器:

if ( this.timeout > 0 ) {
    
this._timer = setTimeout( $$F.bind(this._timeout, this), this.timeout * 1000 );
}

ps:经测试,小于0的延时时间,ie会取消执行,而其他浏览器会当成0执行。

程序有一个_sending属性用来判断上传状态。
在stop(停止),dispose(销毁),_finis(完成),_timeout(超时)时会把它设为false。
而在上传开始前要把它设置为true。

最后提交表单就开始上传了。


【iframe】

程序使用_setIframe函数来创建无刷新需要的iframe。

由于ie中iframe的name不能修改的问题,要这样创建iframe:  

Code

ps:关于iframe的name的问题参考这里的iframe部分
ie8已经可以修改name了,但在非标准(怪辟)模式下还是不能修改。
其中使用了一个QuickUpload函数自身的_counter属性做计算器,这就能保证各个实例的iframe的name就不会重复。

为了能在文件上传完成后执行回调函数,会在iframe的onload中执行_finish函数:

Code


在ie需要用attachEvent来绑定onload,因为在ie中直接设置onload是无效的。
除了用attachEvent还可以用onreadystatechange代替。
至于原因我也不清楚,详细参考“判断 iframe 是否加载完成的完美方法”。

iframe的加载还有一个问题,测试以下代码:

Code


结果safari, chrome都会触发onload两次,而opera, ff和ie(请自行兼容)都是1次。

估计在safari和chrome在appendChild之后就进行第一次加载,并且在设置src之前加载完毕,所以触发了两次。
如果在插入body之前给iframe随便设置一个src(除了空值),间接加长第一次加载,那么也只触发一次了。
ps:不设置或空值的src相当于链接到“about:blank”(空白页)。

那么opera, ff和ie可能是第一次加载太慢,第二次覆盖了第一次的,所以只触发了一次onload。
ps:也可能是其他原因,例如浏览器优化之类的,我也不确定。

针对加载过快的问题,可以在onload的时候根据_sending确定之前是否上传状态来解决。
虽然没测试出来,会不会有_sending设置之后submit之前刚好触发第一次onload的情况呢?
针对这个问题,在upload方法中会把_sending放在submit之后设置。
那如果在submit之后_sending设置之前就触发了onload呢?(...囧)
这个情况基本不会出现,如果真的出现,就把_sending设置放到submit前面吧。

opera还有一个麻烦的问题,测试下面代码:

Code


ie和ff显示submit,onload,safari和chrome显示的是onload,submit,onload,跟上面的分析一致。
而opera却显示submit,onload,onload,两次onload都是在submit之后触发的。
这个情况就不能单纯用_sending来解决了。
是不是submit不能使iframe取消加载呢?
在appendChild之前设一个src,结果正常的只触发onload一次,看来是可以的啊。

虽然不知道原因,办法还是有的,一个是appendChild前设一个src,还可以在第一次onload中重新设置onload,像程序那样。
但这两个方法都存在不确定性,不能完全解决问题,但也找不到更好的方法了。

ff的onload还有一个问题,在出现ERROR_INTERNET_CONNECTION_RESET(文件大小超过服务器限制)之类的服务器错误时,即使加载完成也不会触发onload,暂时找不到解决办法。

iframe有一个缺陷是只能用onload判断加载完成,但没有办法判断是否加载成功。
没有类似XMLHTTP的status的东西,遇上404之类的错误也没办法判别出来。
在使用时要做好这方面的处理,例如说明允许上传文件大小,超时时间,如何处理长时间无响应等。


【form】

程序使用_setForm函数来创建用来提交数据的form。

要实现无刷新上传,要对form进行特殊的处理:

$$.extend(form, {
    target: 
this._iframe.name, method: "post", encoding: "multipart/form-data"
});

ps:详细看这里的无刷新上传部分

由于form是手动插入的,为了不影响原来页面布局还要设置一下form样式,使它“隐形”起来:

$$D.setStyle(form, {
    padding: 
0, margin: 0, border: 0,
    backgroundColor: 
"transparent", display: "inline"
});


还要注意的是,同一个表单控件只能对应一个form。
如果file控件本身已经有一个form的话,必须在提交前移除:

file.form && $$E.addEvent(file.form, "submit", $$F.bind(this.dispose, this));

dispose方法是用来销毁程序的,包括移除form。
ps:如果提交前submit被覆盖的话要手动执行一次dispose方法。

最后把form插入到dom: 

file.parentNode.insertBefore(form, file).appendChild(file);

先把form插入到file控件之前,然后把file插入到form,这样就能保证file在原来的位置上了。


【input】

如果有其他参数要传递,程序会使用_setInput函数来创建传递数据的表单控件。

由于生成的form里面只有file控件,要传递其他参数只能用程序生成了。
程序用一个_inputs集合来保存当前在form中生成的表单控件。

首先根据自定义的parameter属性创建表单控件:

Code


当form中没有对应name的控件时,会自动生成一个hidden控件插入到form中。
其中newInputs是用来记录当前生成的控件的,而oldInputs就是_inputs集合。
当设置过对应name的控件后,就从oldInputs中删除对应控件的关联。

然后移除oldInputs关联的控件:

for ( name in oldInputs ) { form.removeChild( oldInputs[name] ); }

这样就能移除上一次生成的无用的控件了。

最后重新记录当前控件到_inputs方便下次使用。


【stop】

如果想停止当前上传操作,可以调用stop方法。

一般来说当iframe发生重载时,会取消上一次的载入,那么只要重新设置src就能取消上传了。
测试以下代码:

Code


结果都能取消加载,除了opera,未知什么原因。
有两个方法解决,一个是通过form随便用一个action提交一次,还有就是直接移除iframe。
后一个方法比较方便,程序中用_removeIframe方法直接移除iframe。
ps:有更好方法的话记得告诉我。


【dispose】

当使用结束或其他原因要销毁程序时,可以调用dispose方法。

dispose里面主要做的是移除iframe和form。
移除iframe用的是_removeIframe方法,首先把onload移除,再把iframe从body移除:

var iframe = this._iframe;
$$B.ie 
? iframe.detachEvent( "onload"this._fFINISH ) : ( iframe.onload = null );
document.body.removeChild(iframe); 
this._iframe = null;

十分简单,但在ff有一个问题,测试以下代码:

Code


提交后都能移除iframe,但ff还一直显示“载入中”的状态。
不过解决方法也很简单,用setTimeout设置一个延时,让iframe执行完整就可以了。
所以在dispose中是这样调用_removeIframe的:

if ( $$B.firefox ) {
    setTimeout($$F.bind(
this._removeIframe, this), 0);
else {
    
this._removeIframe();
}


至于form的移除就比较简单,在_removeForm这样处理:

var form = this._form, parent = form.parentNode;
if ( parent ) {
    parent.insertBefore(
this.file, form); parent.removeChild(form);
}
this._form = this._inputs = null;


要判断一下parentNode,否则如果parentNode不存在的话后面的会执行出错。


【file的reset】

在实例里,有一个用来重置file控件的ResetFile函数。

重置file控件一般的办法是使所在的form执行reset,但问题是会把其他表单控件也重置了。
以前由于安全问题,file的value是不允许修改的。
但现在ff,chrome和safari可以把它设为空值来实现重置:

file.value = "";

当然其他值还是不允许的。
ps:记忆中以前是不行的,不知有没有记错。

对于opera,有一个变通的方法,利用它的type属性:

file.type = "text"; file.type = "file";

通过修改type得到的file控件,value会自动还原成空值,这样就间接把file控件清空了。
ps:利用这个方法可以间接得到文件路径,但由于变回去后值就清空了,所以没什么用。

而ie的表单控件的type设置后是不允许修改的,不能用opera的办法。
不过还是有以下方法解决:
1,新建一个form,把file插进入后reset,再移除:

with(file.parentNode.insertBefore(document.createElement('form'), file)){
    appendChild(file); reset(); removeNode(
false);
}

好处是使用原生的reset,稳定可靠,但效率低。
ps:removeNode只有ie和opera支持,如需兼容可改用removeChild的方式。

2,利用outerHTML,重建一个file控件:

file.outerHTML = file.outerHTML;

好处是高效,但由于是新创建的file控件,之前关联的东西都丢失了。
ps:ff支持不支持outerHTML。

3,利用cloneNode,复制一个file控件:

file.parentNode.replaceChild(file.cloneNode(false), file);

跟上一个方法差不多,但效率更低。

4,利用select方法选中file控件的文本域,再进行清空:

file.select(); document.selection.clear();

file.select(); document.selection.clear();

看来没什么问题,但file必须能被select(不能是隐藏状态)。
ps:这两个方法都只能在ie使用。

由于程序中file是需要关联的,所以方法2和3都不能用。
方法4貌似也不错,但有一个致命问题,在ie测试以下代码:

Code


执行到submit会显示“拒绝访问”的错误,原因不清楚,不知是ie故意的还是bug。

看来也只能使用方法1了:

Code

ps:有更好方法的话记得告诉我啊。

这个函数并不够通用,最好还是根据实际情况选择需要的方法。


使用技巧

【上传文件数】

在文件上传实例中,各个文件是同时上传的。
经测试,浏览器能同时上传的文件数如下:
ie 2
ff 8
opera 8
chrome 6
safari 6
由于ie最多同时只能传2个,所以设置更多文件也只能排队,而不能达到同时上传的效果的。
ps:只是目测结果,有错请提出。

【传递参数】

上传文件实例中,可以传递对应的修改文件名,在使用“一般上传”多个文件一起上传时也能找到对应的文件名。
因为表单控件值传递到后台后,获取数据的顺序跟前台表单控件的排列顺序是一致的。
只要保证前台file控件跟对应表单控件的排列顺序一致就能利用这个特性获取对应的值了。
详细参考后台代码。

【回调函数】

有两个方法可以响应上传完成回调函数。
一种是后台上传完成后,在iframe输出并执行回调函数或通过parent调用父窗口的回调函数。
这种比较方便,但必须在iframe里面执行处理,例如文件属性查看实例。
另一种是在iframe的onload中执行回调函数。
好处是可以把所有处理放在父窗口,iframe可以不做任何处理或用来反馈信息。
缺点是有兼容性问题,而且会有加载后没有触发onload的情况(上面的iframe部分有说明)。
上传文件实例中就是在onFinish中处理在iframe中输出的数据。
由于可能出现一些意外情况导致响应很久,甚至没有响应,所以一定要设置timeout以防万一。

【处理返回数据】

上面提到,可以在onFinish中处理在iframe中输出的数据。
要从iframe的body中获取数据,有以下几个方法:
iframe.contentWindow.document.body.innerHTML
iframe.contentDocument.body.innerHTML
window.frames[iframename].document.body.innerHTML
其中前两种差不多,后者比较简便,但ie不支持contentDocument,可惜。
第三种是利用frames对象来获取,注意这样获取的对象直接就是window对象。
由于程序能直接获得iframe对象,所以用的是第一种方式。
不过有一个问题在iframe的部分也提过,就是返回错误信息页面的问题。
在上传文件实例中,在iframe中输出的是json形式的文件信息数据。
在onFinish中是这样处理的:

try{
    
var info = eval("(" + iframe.contentWindow.document.body.innerHTML + ")");
    show(
"上传完成");
}
catch(e){
    show(
"上传失败"); stop(); return;
}

只有返回正确的json格式数据才能正常运行,否则就抛出错误,间接地排除了404等错误信息。
ps:有更好方法的话欢迎提出。

【销毁程序】

程序中有不少dom操作,在不需要继续使用的时候最好执行一次dispose方法来销毁程序。
例如移除file之后,关闭窗口之前,提交表单之前,历遍表单元素前等等。
既可以节省资源,防止dom的内存泄漏,又能避免表单嵌套时的冲突问题。

【可用性】

看过“ppk谈javascript”后,更加注重了可用性。
上传实例在浏览器不支持js的情况下也能正常上传,各位可以自行测试。

【编码】

上一个无刷新上传系统,很多人反映上传后文件名乱码,后来发现是编码的问题。
当有中文信息传递时,要注意前后台的编码必须统一,包括charset,文件编码,web.config的配置等。

【asp版本】

asp版本跟.net版本功能是一样的,使用无组件上传类。
不过上传类本身有一个缺陷导致提交同名file控件的话会出错,经过修改后现在可以正常使用了。


使用说明

实例化时,第一个必要参数是file控件对象:

new QuickUpload(file);


第二个可选参数用来设置系统的默认属性,包括
属性:    默认值//说明
parameter: {},//参数对象
action:  "",//设置action
timeout: 0,//设置超时(秒为单位)
onReady: function(){},//上传准备时执行
onFinish: function(){},//上传完成时执行
onStop:  function(){},//上传停止时执行
onTimeout: function(){}//上传超时时执行

还提供了以下方法:
upload:执行上传操作;
stop:停止上传操作;
dispose:销毁程序。


程序源码

Code



完整实例下载
完整实例下载(asp版本)


相关应用:JavaScript 图片上传预览效果

转载请注明出处:http://www.cnblogs.com/cloudgamer/

如有任何建议或疑问,欢迎留言讨论。

如果觉得文章不错的话,欢迎点一下右下角的推荐。

程序中包含的js工具库CJL.0.1.min.js,原文在这里

posted @ 2009-12-01 08:49 cloudgamer 阅读(58018) 评论(154) 编辑 收藏

评论共2页: 上一页 1 2 
 回复 引用   
#55楼 2009-12-03 18:43 fzy667[未注册用户]
好东西啊,顶个先
 回复 引用   
#56楼 2009-12-04 03:07 小马哥1[未注册用户]
安全性不知道怎样
提几个建议:
1、能通过一个参数限制上传文件类型就好了
2、可以设定上传后文件的存放目录或文件命名方式(例如按时间设定目录或文件名)
3、同名文件上传没有做处理,会覆盖。

 回复 引用 查看   
#57楼[楼主] 2009-12-04 08:17 cloudgamer      
@fzy667
谢谢支持

 回复 引用 查看   
#58楼[楼主] 2009-12-04 08:59 cloudgamer      
@小马哥1
首先我虽然说的是系统,但主要关注的还是前端部分
安全性,存放目录还是要后台来做的,我做的是例子不是实际项目
上传文件类型,同名文件可以在onReady里面自己扩展,我这里只做核心功能

 回复 引用   
#59楼 2009-12-04 09:39 mengshan[未注册用户]
楼主其实可以用flash做前台啊!比如网易、qq的无刷上传控件现在都是flash 了。
 回复 引用 查看   
#60楼[楼主] 2009-12-04 09:42 cloudgamer      
@mengshan
flash也可以啊,那是不同的方向
不过我不懂
呵呵

 回复 引用 查看   
#61楼 2009-12-04 17:21 Ling.Mary.Ma      
关于input file的清空问题,真是受教了。
 回复 引用 查看   
#62楼 2009-12-07 13:18 ITbird      
为了用户更好的体验,应该使用Flash
 回复 引用 查看   
#63楼[楼主] 2009-12-07 13:39 cloudgamer      
@ITbird
我不反对用flash啊

@Ling.Mary.Ma
谢谢支持

 回复 引用 查看   
#64楼 2009-12-07 15:06 軒轅劍      
服务器怎么设置iis 里得吗?
 回复 引用   
#65楼 2009-12-07 15:53 FeeLiN[未注册用户]
其实干脆把上传用的form也放到iframe里要来的更方便。
 回复 引用 查看   
#66楼 2009-12-07 17:29 Ling.Mary.Ma      
楼主好。
有没有关于客户端判断文件的大小的好建议呢?
我最近正在困惑于,在客户端获得文件大小,同时又需要兼容浏览器的问题。
在firefox中,问题倒是不大,可以通过objFile.files[0].fileSize来获得,而ie中,我想到的方式,是创建一个image对象,根据dynsrc属性加载这个文件,然后读取image对象的fileSize属性值。可是,在ie8中,会出现针对image对象的dynsrc属性拒绝访问的错误。

 回复 引用   
#67楼 2009-12-07 20:20 mohe[未注册用户]
祝你们幸福!
 回复 引用   
#68楼 2009-12-07 20:22 mohe[未注册用户]
忘了谢谢你分享知识!
 回复 引用 查看   
#69楼[楼主] 2009-12-08 08:52 cloudgamer      
@軒轅劍
web.config就设置httpRuntime
iis的话你可以搜索iis 上传文件大小

 回复 引用 查看   
#70楼[楼主] 2009-12-08 08:55 cloudgamer      
@mohe
谢谢支持

@Ling.Mary.Ma
这个我也没研究,研究出来的话告诉我吧

@FeeLiN
也可以啊

 回复 引用   
#71楼 2009-12-09 13:17 lizi[未注册用户]
lz女友生日怎么和我一样啊 !
 回复 引用   
#72楼 2009-12-10 10:19 GB[未注册用户]
祝你们幸福吧.哈哈
 回复 引用 查看   
#73楼 2009-12-10 14:33 商务开拓先烈      
楼主功力深厚,不错。
 回复 引用   
#74楼 2009-12-10 14:38 hahadddd[未注册用户]
@乌卡卡
引用GB:祝你们幸福吧.哈哈

haha

 回复 引用 查看   
#75楼[楼主] 2009-12-11 09:35 cloudgamer      
@hahadddd
@商务开拓先烈
@GB
@lizi
谢谢支持!

 回复 引用 查看   
#76楼 2009-12-15 22:06 不悔的青春      
拿源代码测试了一下,为什么会上传不了啊!顺祝你女友生日快乐,说的有点晚,哈哈!
 回复 引用 查看   
#77楼 2009-12-15 22:07 不悔的青春      
我之前做了一个,是用第三方组件实现的,可以实现多文件上传,而且有进度条,上传大小为1G左右。感觉还不错。
 回复 引用 查看   
#78楼[楼主] 2009-12-15 22:59 cloudgamer      
@不悔的青春
应该可以吧
我主要还是研究前端的部分
或许以后会研究一下怎么做进度条

 回复 引用 查看   
#79楼 2009-12-22 00:34 Jayan      
评论怎么看不了了呢?
 回复 引用 查看   
#80楼 2009-12-22 17:09 showbo      
楼主js用得越来越上手了啊,过来a点文章过去。。hoho~~
 回复 引用 查看   
#81楼[楼主] 2009-12-22 17:23 cloudgamer      
@Jayan
看到啊

 回复 引用 查看   
#82楼[楼主] 2009-12-22 17:25 cloudgamer      
@showbo
在csdn受你不少教育
一起加油
呵呵

 回复 引用 查看   
#83楼 2009-12-23 09:42 且行且思      

呵呵,确实历害。。
我也转载了你一篇文章,交流能进步很多,开放的心态更让人感动,
祝福楼主事业更上一层楼。

 回复 引用   
#84楼 2009-12-24 09:59 蜗牛1028[未注册用户]
邮箱好像不对吧?
我的问题可能比较菜,但是希望你能给我解答一下。$$.extend(this, this._setOptions(options))中的$$.extend是什么意思啊?
对了,能不能给个及时通讯方式,qq或msn什么的的

 回复 引用 查看   
#85楼[楼主] 2009-12-24 10:31 cloudgamer      
@且行且思
谢谢支持

 回复 引用 查看   
#86楼[楼主] 2009-12-24 10:34 cloudgamer      
@蜗牛1028
邮箱对的啊
你把[at]改为@

这个应该不难理解
看看原文件应就知道了
http://files.cnblogs.com/cloudgamer/CJL.0.1.js

 回复 引用 查看   
#87楼 2009-12-25 23:19 itliyi      
楼主js 博大精深 很好奇楼主js一路是怎么走过来的 忘赐教
 回复 引用 查看   
#88楼[楼主] 2009-12-26 08:19 cloudgamer      
@itliyi
主要还是兴趣吧
呵呵

 回复 引用 查看   
#89楼 2009-12-28 11:27 小艹儿      
ZL 我下了个源码测试,可是咋出问题了?

请检查Uninet9.config中Dbtype节点数据库类型是否正确,例如:SqlServer、Access、MySql

还要怎么配置呀 ~ 5555

 回复 引用 查看   
#90楼[楼主] 2009-12-28 11:59 cloudgamer      
@小艹儿
我这个不需要这些东西的啊
重新建一个环境测试吧

 回复 引用 查看   
#91楼 2009-12-30 22:00 清茶      
很好,很人性化!
学习了!

 回复 引用 查看   
#92楼 2010-02-02 12:40 五味子      
下来看看咋样
 回复 引用 查看   
#93楼 2010-02-07 14:36 skyaspnet      
请教楼主,如何实现form的提交?例如当我选择好文件后马上进行上传,这应该要触发一个提交事件?期待您的解答,祝新年快乐!谢谢!
 回复 引用 查看   
#94楼[楼主] 2010-02-08 00:56 cloudgamer      
@skyaspnet
第一个例子就是选择好文件后马上进行上传的
你看看

 回复 引用   
#95楼 2010-03-01 15:21 郁闷~~~~[未注册用户]
简单无刷上传程序如果上传超大点的东西就会失败。。。
郁闷啊。。。
测试了下,上传小图片文件还行,上传个30M的压缩包就不行了。上传失败。。。

 回复 引用 查看   
#96楼[楼主] 2010-03-01 15:32 cloudgamer      
@郁闷~~~~
支持多大的文件要在后台服务器设置的
web.config就设置httpRuntime
iis的话你可以搜索iis 上传文件大小

 回复 引用 查看   
#97楼 2010-04-07 09:43 小铃子      
要是能支持断点上传就完美了
 回复 引用 查看   
#98楼[楼主] 2010-04-07 10:28 cloudgamer      
@小铃子
这个没办法
浏览器没提供这个功能

 回复 引用   
#99楼 2010-04-12 16:57 jingyong001[未注册用户]
很不错,为什么点击急速上传的时候,页面出错呢?说files.ashx名称以无效的字符开头。
 回复 引用 查看   
#100楼[楼主] 2010-04-12 17:26 cloudgamer      
@jingyong001
你是测试下载的实例的吗
我这里没问题哦

 回复 引用 查看   
#101楼 2010-04-23 10:40 ASP0000      
效果不错。急速上传和普通上传好像差不多。没太大区别。
 回复 引用 查看   
#102楼[楼主] 2010-04-23 11:52 cloudgamer      
@ASP0000
极速是用无刷新的
一般上传没有

佩服啊,,,强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~强~
 回复 引用 查看   
#104楼[楼主] 2010-04-23 14:25 cloudgamer      
@想说爱你的人~!
不用写这么多吧

 回复 引用   
#105楼 2010-04-28 10:08 qq448707945[未注册用户]
怎样可以限制上传jpg.gif.png格式
 回复 引用 查看   
#106楼[楼主] 2010-04-28 13:38 cloudgamer      
@qq448707945
执行upload之前先判断一下后缀就行了
判断可以参考
http://www.cnblogs.com/cloudgamer/archive/2008/10/20/1314766.html

 回复 引用   
#107楼 2010-06-01 22:24 cicna[未注册用户]
老大向你学习了...
 回复 引用 查看   
#108楼 2010-06-22 15:34 版主      
高手啊
 回复 引用 查看   
#109楼 2010-09-16 17:58 Yoyior Lee      
祝你女朋友生日快乐
还想请教你js 文件上传

 回复 引用 查看   
#110楼[楼主] 2010-09-16 22:48 cloudgamer      
@cicna
@版主
@Yoyior Lee
谢谢支持

 回复 引用   
#111楼 2010-09-17 09:51 windy木头[未注册用户]
“执行到submit会显示“拒绝访问”的错误,原因不清楚,不知是ie故意的还是bug。”这个是IE的安全限制,type=“file”的控件是不能操作value的,不然是不能提交的。

楼主写得不错,哈哈~~~

 回复 引用 查看   
#112楼[楼主] 2010-09-17 10:58 cloudgamer      
@windy木头
你说的我知道
但我并没有直接修改value而且出错是在submit不是在clear
如果像你说的应该在clear时就出错了
我估计是在submit时会执行一个检测程序发现file控件有异常所以报错

 回复 引用   
#113楼 2010-09-19 09:39 ALIN[未注册用户]
试了下,感觉不错,不过站长问你个事 有什么办法 不让一个特定的 文件名 不能上传
 回复 引用 查看   
#114楼[楼主] 2010-09-19 15:07 cloudgamer      
@ALIN
从value就能判断文件名
当然后台也要判断

 回复 引用 查看   
#115楼 2010-10-11 12:33 billrobin      
兄弟,生日之际,打一炮!!!
 回复 引用   
#116楼 2010-10-16 19:30 kenny001[未注册用户]
跨域问题怎么解决?
 回复 引用 查看   
#117楼[楼主] 2010-10-16 22:41 cloudgamer      
@billrobin
呵呵

 回复 引用 查看   
#118楼[楼主] 2010-10-16 22:43 cloudgamer      
@kenny001
跨域也可以传文件
用些方法获取地址就行
网上有很多方法

 回复 引用 查看   
#119楼 2010-10-20 11:35 康熙爷      
好东西学习了 ~谢谢
 回复 引用   
#120楼 2010-10-26 22:38 chaoguang[未注册用户]
这个系统做得很好,谢谢分享,有个问题请教一下楼主,.net版单独运行没问题,但加到另一个系统里就上传失败啊?
 回复 引用 查看   
#121楼[楼主] 2010-10-26 23:07 cloudgamer      
@康熙爷
谢谢支持

 回复 引用 查看   
#122楼[楼主] 2010-10-26 23:08 cloudgamer      
@chaoguang
这只能你自己调试了

 回复 引用 查看   
#123楼 2010-10-29 20:32 fener      
真强大。在下佩服啊
 回复 引用 查看   
#124楼 2010-11-01 15:16 蜗牛中的霸主      
先感谢提供这么好的东西,可是我下载不了呀。
 回复 引用 查看   
#125楼[楼主] 2010-11-01 15:21 cloudgamer      
@fener
谢谢支持

 回复 引用 查看   
#126楼[楼主] 2010-11-01 15:22 cloudgamer      
@蜗牛中的霸主
貌似要登陆才能下载

 回复 引用 查看   
#127楼 2010-11-01 15:26 蜗牛中的霸主      
@cloudgamer
谢谢老师,我已经可以上载了。发现是迅雷的问题。再次感谢老师!!

 回复 引用   
#128楼 2010-11-08 10:30 小鱼陆上游[未注册用户]
上传200多M的文件时,才几秒钟就报超时了。。。楼主,什么原因呢?
 回复 引用 查看   
#129楼[楼主] 2010-11-08 11:58 cloudgamer      
@小鱼陆上游
timeout: 0,//设置超时(秒为单位)

 回复 引用   
#130楼 2010-11-08 17:32 小鱼陆上游[未注册用户]
改过的,但还是报超时,不过,文件夹里还是有这文件了。只是页面报超时,没有显示上传成功
 回复 引用 查看   
#131楼[楼主] 2010-11-08 17:51 cloudgamer      
@小鱼陆上游
你的超时是什么超时
是程序提示还是出错

 回复 引用   
#132楼 2010-12-02 11:39 xiell[未注册用户]
你好博主,在程序info = eval("(" + iframe.contentWindow.document.body.innerHTML + ")");这段info获取不到值,请问是怎么回事?
 回复 引用 查看   
#133楼[楼主] 2010-12-02 15:54 cloudgamer      
@xiell
你是用哪个版本
实例中的应该可以

 回复 引用   
#134楼 2010-12-02 18:29 xiell[未注册用户]
你好,博主问题解决了!呵呵不好意思,还有个问题就是.net中使用了母版页,在母版页已经有了form,这样就存在了2个form了,发现【一般上传】就没法使用了,要怎么解决呢?用框架吗?还有一个问题是,上传成功后,页面就出现了js的错误“null为空或不是对象”,出现在页面的eval code文件,断点在【event.pageX=event.clientX+D.getScrollLeft();】是不是和其他的js冲突了呢,人为刷新就OK了,感谢博主!
 回复 引用   
#135楼 2010-12-02 21:34 xiell[未注册用户]
行: 236错误: 'null' 为空或不是对象:
function __doPostBack(eventTarget, eventArgument) {
<b>if (!theForm.onsubmit || (theForm.onsubmit() != false)) {</b>
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
是这个地方有问题,请问博主是什么原因呢?

 回复 引用   
#136楼 2010-12-02 21:35 xiell[未注册用户]
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
这一句,不好意思

 回复 引用 查看   
#137楼[楼主] 2010-12-03 08:33 cloudgamer      
@xiell
一般上传就是普通的上传
你可以看看一般file表单时怎么上传的

看错误应该是theForm是null了你可以自己调试一下看看

 回复 引用   
#138楼 2010-12-28 18:24 美好人生3[未注册用户]
好东西
 回复 引用   
#139楼 2011-02-13 08:21 xxx234[未注册用户]
可惜,为什么不是脱离form的无刷新文件上传系统
因为在大多的应用中,基本都是做为表单的一部分存在。

 回复 引用 查看   
#140楼[楼主] 2011-02-13 11:35 cloudgamer      
@xxx234
没form怎么上传?
而且我的form是动态生成的 不明白你的意思

 回复 引用 查看   
#141楼[楼主] 2011-02-13 11:36 cloudgamer      
@美好人生3
谢谢支持

 回复 引用 查看   
#142楼 2011-03-05 15:35 赵连斌      
写的太到位了、全面啊、转了留下来了自己用、嘿嘿、顶了
 回复 引用 查看   
#143楼 2011-03-05 15:40 Framework Coding      
太好了,学习了
 回复 引用 查看   
#144楼 2011-03-05 15:43 Framework Coding      
如果有Jquery版本的源码就更好了
 回复 引用 查看   
#145楼[楼主] 2011-03-05 17:16 cloudgamer      
@赵连斌
@Framework Coding
谢谢支持

 回复 引用 查看   
#146楼 2011-03-21 17:10 书僮      
楼主,请教一个问题,我把这个上传程序放入一个iframe里面,结果下面的上传返回函数中的iframe.contentWindow.document.body.innerHTML就获取不到了,在IE中是好的,其他浏览器,比如chrome中就提示上传失败TypeError: Cannot read property 'body' of undefined,后面是我把e错误显示出来的;
只要不放入iframe,就是好的,具体是什么原因呢?万分感谢。
try{
var info = eval("(" + iframe.contentWindow.document.body.innerHTML + ")");
show("上传完成");
}catch(e){
show("上传失败"); stop(); return;
}

 回复 引用 查看   
#147楼[楼主] 2011-03-21 17:24 cloudgamer      
@书僮
这个要调试看看才知道

 回复 引用 查看   
#148楼 2011-06-13 10:39 水淼      
我安装你的方法写了个,但是我把它放在母版也中 就不行了,jquery也找到相应的html标签了,
function uploadIma(id, image, file) {
jQuery("#" + id).upload({
url: "/DZ/User/UserImages/", //1,url是上传地址
type: "s", //Type操作类型,s是上传,d是删除
ImageName: image, //imageName上传图片Id
up: file, //up上传file的name值
defultImage: "/Images/no_pic.gif", //defultImage图片显示的默认图片
height: "120", //缩略图高度
width: "120", //缩略图宽度
mode: "HW", // 缩略图类型
WaterPic: "n" //是否添加水印 y是添加,n是不添加
});
}
这个方法直接报错,就不往upload里面走了,我用的都不是服务器空间啊,希望楼主给予指导谢谢了??

 回复 引用 查看   
#149楼[楼主] 2011-06-29 15:45 cloudgamer      
@水淼
可能form的问题 看文章

 回复 引用 查看   
#150楼 2011-09-01 10:05 进来学习学习      
我要怎么样使用这个文件呢?我是个初学者麻烦多多指导。我下载了你的代码在点击“一般上传的时候”出现file.asp文件的代码是怎么回事?
 回复 引用 查看   
#151楼 2011-09-07 14:21 进来学习学习      
下载之后怎么不可以使用呢??一直在上传的那个界面
 回复 引用 查看   
#152楼 2011-10-07 13:44 幸福调品牌设计      
表示支持
www.xingfudiao.com
专业网站美工

 回复 引用 查看   
#153楼 2011-12-20 17:11 小腼腆      
太厉害了,好好研究一下
 回复 引用 查看   
#154楼 2012-01-30 15:04 不做懒人      
ie 9 下创建iframe时有问题。如下修改即可。

var isIE = ($$B.ie) ? true : false; //这里仅仅简单的对是否是IE进行判断,详细浏览器判断:请参考浏览器类型侦测
var ua = navigator.userAgent.toLowerCase().match(/msie ([0-9]+)/)[1];
if (ua == "9") {
isIE = false;
}

iframe = document.createElement(isIE ? "<iframe name=\"" + iframename + "\">" : "iframe");

评论共2页: 上一页 1 2 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1614228 TUjizISHR00=