仿163网盘无刷新多文件上传系统

这个仿163网盘无刷新多文件上传系统,并没有用使用.net的控件,完全的手工制作。前台基本上是静态的,跟后台没有关系,所以后台用什么语言做都可以(后面有各个版本的实例下载)。
本来觉得这个系统会很复杂,但把每个部分都分析清楚后,其实需要的技术并不高。不过当我把各个功能函数都整理好准备进行封装时,却发现要把程序封装不是那么容易,因为程序跟html的耦合度太高。然后我逐步把程序中操作html相关的部分分离出来,首先把简单的分离,接着是文件列表,然后是file控件,最后是一些提示性程序。经过几次尝试才把整个结构封装好,现在程序结构应该算比较清晰,有什么不明白的地方欢迎留言。


效果预览

上传文件
添加文件:
文件路径
温馨提示:最多可同时上传 个文件,只允许上传 文件。
   

这里的预览只是前台的效果,要整个系统测试请下载完整实例。


程序说明

【无刷新上传

要实现文件上传,form必须设置几个属性:
1.action:设为要处理数据的页面地址;
2.method:设为"post";
3.enctype/encoding:必须设为"multipart/form-data",这里要注意的是在ie中用js修改form的enctype属性是没有效果的,只能修改encoding;

后面两个属性程序初始化时都有设置:

this.Form.method = "post";
this.Form.encoding = "multipart/form-data";


要注意这里的无刷新不是ajax哦,而是利用“古老”的iframe。
由于ajax提交数据必须先获取数据,而js(一般情况下)是不能操作客户端文件,要获取文件数据就更不用说了,所以只能用iframe来做。
先说说iframe实现无刷新上传的原理:利用form的target属性,把数据提交到页面中一个(通常为隐藏的)iframe上直观点说就是把“刷新”留给iframe。
其实原理跟一般用iframe实现无刷新提交表单是一样的,只是这里换成是文件。
这里关键就是把form的target设为iframe的name:

this.Form.target = this._FrameName;


【iframe

如果没有自定义iframe,程序在初始化时会自动创建无刷新所需的iframe的。
首先必须选择一个iframe名,这在无刷新时是必须的,为了每个实例能创建各自的iframe,这里用了一个随机数:

this._FrameName = "uploadFrame_" + Math.floor(Math.random() * 1000);


也可以用一个递增的计算器来代替随机数。

接着创建iframe,本以为用document.createElement("iframe")创建再设置它的name属性就行了。
却发现这样设置的name在ie居然不认(有说name是只读属性),还好在网上找到一个方法:“IE 创建元素,还有一个特点,就是可以连同属性一同创建”。
例如我想给动态创建的iframe设置name,可以这样:

document.createElement("<iframe name=\"" + this._FrameName + "\">")

不过这个方式在ff会报错:
uncaught exception: String contains an invalid character (NS_ERROR_DOM_INVALID_CHARACTER_ERR)
估计是用createElement时不能带name,标准应该也是这样,所以兼容的方式这样写:

Code

关于这方面更详细的内容请看这里

创建完还需要插入到body中,一般的做法是使用document.body.appendChild,但在ie中会有“已终止操作”错误,可以用下面这段代码测试:

Code

网上找到一个解析:“原来FF下的实现机制是当页面还没有完全读取完时body元素就已经存在了,而IE只有页面完全读取结束body元素才会存在,所以在页面中插入上面这条语句在IE下就会出现错误”。
我在web开发未解之谜中也提到了这个现象,我这里使用了insertBefore代替:

document.body.insertBefore(oFrame, document.body.childNodes[0]);

在服务器端文件传送完(或失败)之后,怎么通知客户端呢?
这里说说我的方法,首先我在客户端定义一个函数:

function Finish(msg){ alert(msg); location.href = location.href; }

很简单,就是显示提示并重新加载页面(如果使用reload会导致ff中iframe重复加载数据)。
那服务器端如何通知客户端的问题,就是iframe如何跟主页面交互。
答案是通过window.parent或window.top,在iframe中parent和top属性“分别返回立即父窗口和最上层的祖先窗口”。
例如我在服务器端处理完数据之后会输出:

context.Response.Write("<script>window.parent.Finish('" + _msg + "');</script>");

就会执行主页面的Finish函数了。


【多文件上传】

对于多文件上传,这里的目的是如何做到163网盘那样,只用一个file控件就实现多文件上传。
这里参考了163网盘的思路,下面说说如何实现:
首先必须有一个文件空间(我自己定的名字),例如程序中的"idFile"对象,这个空间不需要内容甚至一个div就可以,主要是用来存放file控件,程序中Folder属性就是这个文件空间对象。
ps:这里的要求是把file控件都控制在文件空间里,即使不是单file控件的情况。
再说说Files属性,这个属性放的是file控件集合,方便获取file控件,在下面“文件列表”就会用到。

处理这些file控件的程序主要在Ini函数中:
首先是处理文件空间中的file控件:

Code

可以看到这里主要是把file控件放入到Files中,并执行附加函数onIniFile,我是这样定义这个函数的:

onIniFile: function(file){ file.value ? file.style.display = "none" : this.Folder.removeChild(file); }

这里为了实现单file控件,把原来有值的file都隐藏了,还有那个“单file控件”呢?
别急,接着就在文件空间插入一个新的file控件:

Code

可以看到file控件的name是FileName属性的值,默认是空的,如果服务器端需要这个name的话就可以设置。
这里可以看到每个file控件都有onchange来执行检测函数Check,这样每次选择文件后都会用Check检测一次,这里说说这个Check函数:

Code

里面有一个检测变量bCheck,然后进行空值、文件数限制、后缀名、相同文件的检测,当其中一个步骤不通过bCheck就会设为false,一个常用的检测结构。
这里说说检测后缀名,由于js不能像后台那样获取文件的文件类型,所以只能根据后缀名来判断,例如用正则判断:

/\.(jpg|gif)$/i.test(file.value)

这样判断显然是不够的,所以如果要做文件类型判断的话一定要在后台用ContentType再判断一次。
最后如果没有通过检测就会执行onFail函数:

!bCheck && this.onFail(file);

我在onFail函数中设定了移除没有通过检测的file控件:

onFail: function(file){ this.Folder.removeChild(file); }


这样就基本实现(正确的说是模拟)了单file控件上传多个文件的效果了。


【文件列表】

在上面的Ini函数中,最后执行了一个附加函数onIni,这个函数是用户自己定义的,我就在这个函数中添加文件列表。

在之前先说说添加文件列表的函数AddList,这个函数是用来把file控件的值列在一个table里面。
函数的参数是一个二维数组,其中第一维是行(tr),第二维是列(td)。
首先获取列表对象FileList,再定义一个文档碎片oFragment来操作dom:

var FileList = $("idFileList"), oFragment = document.createDocumentFragment();

然后用两个Each把二维数组插入到文档碎片中:

Code

其中用了一个判断if(typeof o == "string"),如果是文本就直接用innerHTML插入td,如果不是文本(这里不是文本就是一个对象)就用appendChild插入到td。
当数据都插入到文档碎片,就准备把文档碎片插入到FileList中,不过还有一个步骤就是清空FileList中原有的数据。
本来把innerHTML设为空来清空FileList会更有效率,但ie的table中只有td支持innerHTML,所以只好用removeChild来清空:

while(FileList.hasChildNodes()){ FileList.removeChild(FileList.firstChild); }

之后就可以把文档碎片插入了:

FileList.appendChild(oFragment);


继续看onIni函数,现在只需要把要显示的数据组成一个二维数组,再用AddList就能显示文件列表了,这时存放file控件集合的Files属性就大有用处了。
首先定义一个放显示数据的数组:

var arrRows = [];

然后根据Files对这个数组赋值:

Code

当Files没有控件时只是输出“没有添加文件”,有控件时就会把每个file控件的要显示数据放到一个数组中,可以看到这个数组其实就是td内容的集合,接着把这个数组加入到arrRows中形成二维数组,最后把得到的arrRows给AddRow函数显示数据就行了。
为了能取消指定的file控件,这里插入了一个a来触发删除函数Delete,这里也有一个技巧,这里把href设为"javascript:void(0);",并在onclick中返回false,这样能最大程度的实现仅仅执行js而不去跳转。

在表单提交时也要重新显示文件列表,表单提交后就不允许删除文件了,只显示文件路径就行了:

Code

说到表单提交要注意一个问题,就是表单是不能嵌套的,最好是把表单放到服务器表单之外,没有办法才使用服务器表单作为提交表单(由于程序会修改提交表单的属性,所以尽量不要这样使用)。

这样文件列表就完成了,有兴趣的话也可以自己封装一下这个功能。


【file样式】

到此,程序的功能都已经实现了,但在163网盘中还有一个特别的地方,就是file控件的样式。
如果有用过163网盘上传文件,就知道那个file控件就像一个按钮,但功能确实是一个file控件。
但当自己尝试修改file控件的样式时,发现单单设置file控件的样式并不能实现想要的效果。
于是我想了另一个办法,用一个button来模拟,结果发现也不行,用js根本操作不了file控件,应该是考虑到安全问题吧。
最后是参考了163网盘和muxrwc模拟126附件添加的效果,总结了这个方法:
1.指定用一个容器(例如程序中的idFile)。
容器最好指定高和宽,并且overflow为hidden,不是块级元素的最好设display为block(为了高和宽的正确呈现);
2.在容器里放一个file控件,并设置样式,使能触发弹出选择文件框的部分覆盖整个容器,并设置成全透明。
容器指定准确的高和宽就是为了能通过file控件中不多的能设置的样式来覆盖整个容器;
3.现在已经把容器模拟成file控件了,可以直接设置容器的样式来模拟设置file控件的样式了。

在程序中主要用file控件的margin-left和font-size来实现覆盖整个容器:

Code

至于容器,我使用了有伪类hover的a元素(虽然CSS2中hover可以应用于任何对象,但ie6不支持)。
这里用了一个常用的小技巧,就是用一张图片作为背景通过在hover时修改background-position来实现两张图片的效果:

Code

在点击这个a时后会出现一个虚线框,在这里显然不太美观,可以把outline设为none来去掉,可是ie又不支持,在网上找到一个方法ie可以把hideFocus设为true来隐藏聚焦(即不显示这个虚线框,hideFocus可以在js或html中设置,也可以通过expression放到css中:

Code


这样完全模拟了163网盘的效果了。


【后台】

前台基本完成了,就到后台啦。后台的功能很简单,就是处理传递过来的文件数据。
这里像js + .Net 图片切割系统那样使用ashx文件处理IHttpHandler发送过来的数据。
程序很简单,就直接贴代码了:

Code

这里只检测了有无文件和文件数限制,其他检测如文件大小等可以自己扩展,应该不难。
处理完数据之后就通知客户端:

context.Response.Write("<script>window.parent.Finish('" + _msg + "');</script>");

这个在上面iframe的内容中已经说明了。


使用说明

基本使用很简单,实例化一个file对象,其中参数分别是form对象,文件空间对象:

new FileUpload("uploadForm""idFile")

这样就实现了一个简单的无刷新上传文件表单。

还可以使用这几个属性:
Form//表单
Folder//文件控件存放空间
Files//文件集合

更多的功能可以选择设置这些属性:
属性名:默认值//说明
FileName:"",//文件上传控件的name,配合后台使用
FrameName:"",//iframe的name,要自定义iframe的话这里设置name
onIniFile:function(){},//整理文件时执行(其中参数是file对象)
onEmpty:function(){},//文件空值时执行
Limit:0,//文件数限制,0为不限制
onLimite:function(){},//超过文件数限制时执行
Distinct:true,//是否不允许相同文件
onSame:function(){},//有相同文件时执行
ExtIn:[],//允许后缀名
onNotExtIn:function(){},//不是允许后缀名时执行
ExtOut:[],//禁止后缀名,当设置了ExtIn则ExtOut无效
onExtOut:function(){},//是禁止后缀名时执行
onFail:function(){},//文件不通过检测时执行(其中参数是file对象)
onIni:function(){}//重置时执行

使用方法可以参考实例。

程序中提供了下面几个方法:
Ini 整理空间
Check 检测file对象
Delete 删除指定file
Clear 删除全部file


程序代码

Code


【asp版本补充】

由于很多人问我asp版本的后台该如何写,所以决定写一个给大家。
这里我用了化境HTTP上传程序2.1版(应该是最新版了)的无组件上传类,但用的时候发现几个问题(不知是我不会用还是asp本身的问题):
1,当file控件的name是空时,后台会找不到文件;
2,文件名比较短时(例如我用"f"),后台也找不到文件;
3,当有多个file控件,如果使用相同的name,后台只会保存一个文件;
4,我在上传文件后输出的中文是乱码(有时又正常)。

针对前3条,我加了一个RanName属性,设为true的话会自动生成随机的file控件名,对于第4条,我发现如果字是直接写在文档上就不会乱码,所以我这里把输出的文字都直接写在文档上没有用变量。如果有兄弟知道怎么解决这些问题记得告诉我哦。


下载完整测试代码(.net)

下载完整测试代码(asp)

感谢由csdn网友mengshan1986提供的php和jsp版,klniuer的php修正版:
下载完整测试代码(php)
下载完整测试代码(jsp)

ps:请注意程序中的文件保存路径,很多人的错误都是没有设置好文件保存路径。

其他上传系统:

简便无刷新文件上传系统

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

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

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

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

posted @ 2008-10-20 08:20 cloudgamer 阅读(95586) 评论(531) 编辑 收藏

评论共6页: 上一页 1 2 3 4 5 6 
 回复 引用   
#432楼 2010-08-07 13:20 sjolzy[未注册用户]
在Firefox/3.6.4下, 我点击添加文件, 然后未选定文件就取消后会弹出三个窗口标签http://www.cnblogs.com/cloudgamer/admin/javascript:void%280%29;
这是不是小BUG哦? 楼主测试一下哈

 回复 引用 查看   
#433楼[楼主] 2010-08-07 14:35 cloudgamer      
@sjolzy
之前的编辑器把我的代码替换了
现在应该好了

 回复 引用 查看   
#434楼 2010-08-09 18:30 hw1030      
页面中通过action="File.ashx"提交,不知道用
var url = "CreateFiles.ashx";
xmlHttp.open("POST", encodeURI(url), true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(sBody);
方式可以实现吗??怎么实现?

还有那个 int iTotal = context.Request.Files.Count; 能够取到
在js里面是在那里封装好的呢?那个如果我上传的只有3张,而那个iTotal怎么会是4

 回复 引用 查看   
#435楼[楼主] 2010-08-09 22:18 cloudgamer      
@hw1030
不能的
只能用iframe
多了一个是因为有一个file是用来选择文件的
你判断一下就行了

 回复 引用 查看   
#436楼 2010-08-09 23:17 hw1030      
引用cloudgamer:
@hw1030
不能的
只能用iframe
多了一个是因为有一个file是用来选择文件的
你判断一下就行了

非常感谢楼主的解答,再次感谢,在这里对于js的学习不知道有什么书籍推荐没。从基础开始……谢谢。

 回复 引用   
#437楼 2010-08-19 10:12 diaoyude[未注册用户]
楼主,不如你做个带预览上传的东东吧
 回复 引用 查看   
#438楼[楼主] 2010-08-19 10:32 cloudgamer      
@diaoyude
有时间再看吧

 回复 引用   
#439楼 2010-08-20 00:56 路过2[未注册用户]
楼主那个上传按钮太麻烦了
其实可以用js手动触发input的click事件就可以了,这样input 就可以用display:none来隐藏

 回复 引用 查看   
#440楼[楼主] 2010-08-20 08:18 cloudgamer      
@路过2
你这样不兼容的

 回复 引用   
#441楼 2010-08-22 01:03 路过2[未注册用户]
sorry
试了一下果然不行
可以弹出文件选择框,但是提交时被清空

我本来想做一个模拟右键菜单,点击upload选项选择文件后马上自动上传 ……

 回复 引用   
#442楼 2010-08-25 17:46 469860266[未注册用户]
jsp后台的代码能不能写一下注释,看的不太明白,或者如果用form该怎么设置
 回复 引用 查看   
#443楼[楼主] 2010-08-25 18:00 cloudgamer      
@469860266
jsp不是我写的
我也不清楚

 回复 引用   
#444楼 2010-08-26 10:41 469860266[未注册用户]
那你能不能帮我向写jsp的那位兄弟请教一下,我想用struts的from来提交的话 否可以,如果可以的话应该怎么处理,或者你把那位兄弟的QQ什么的给我发个邮件,我向他请教一下。多谢。
 回复 引用 查看   
#445楼[楼主] 2010-08-26 11:49 cloudgamer      
@469860266
我也不认识他
你去csdn找找吧

 回复 引用   
#446楼 2010-09-15 10:33 JS新手[未注册用户]
博主,你好,首先很感谢你提供这么好的程序~
我想在上传之后显示已上传的文件,文件后面有“删除”链接,显示已经实现了,但是删除不太会,请问如何实现不刷新删除呢,我刚接触JS,麻烦能详细解答一下,谢谢啦

 回复 引用 查看   
#447楼[楼主] 2010-09-15 10:50 cloudgamer      
@JS新手
这里只是上传程序
你说的是文件管理跟这个不同的

 回复 引用   
#448楼 2010-09-24 00:16 dddddda[未注册用户]
这个手机用不了
 回复 引用 查看   
#449楼[楼主] 2010-09-24 00:59 cloudgamer      
@dddddda
手机?这个没测试

 回复 引用   
#450楼 2010-10-15 10:15 fdas[未注册用户]
佩服
 回复 引用 查看   
#451楼 2010-11-09 15:07 王夏      
代码怎么下载不下来哇
 回复 引用 查看   
#452楼[楼主] 2010-11-09 15:13 cloudgamer      
@fdas
谢谢支持

 回复 引用 查看   
#453楼[楼主] 2010-11-09 15:13 cloudgamer      
@王夏
可以啊
右键另存为

 回复 引用 查看   
#454楼 2010-11-16 16:56 水淼      
楼主,能不能实现各简单的无刷新上传啊,你这个写的太复杂了。都是动态生成的。我就想要个页面上有个file空间,还有按钮,然后点击按钮后无刷新上传。那个file和按钮是服务器控件也行啊。能不给个代码啊。我的邮箱是756714996@qq.com,我是初学者,能帮帮吗???
 回复 引用 查看   
#456楼 2010-11-24 16:27 水淼      
这个问题已经困扰我几天了,有没有人帮助我啊,代码如下。
前台
<script type="text/javascript">
function Finish() {
;
}
</script>
</head>
<body>
<form id="form1" runat="server" action="upload.ashx" target="hd" >
<iframe name="hd"></iframe>
<div>
<input id="DDD" type="button" value=" 提 交" onclick="document.getElementById('form1').submit()"/>
</div>
</form>
</body>
ashx中
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("<script>window.parent.Finish();</script>");
}
但是在ff下<script>window.parent.Finish();</script>现实在iframe中了,在是在ie中则是执行了Finish函数,结果弹出了anran怎么回事啊,有没有人解决啊,上面是我的全部代码?

 回复 引用 查看   
#457楼[楼主] 2010-11-24 22:02 cloudgamer      
@水淼
实例测试有没有问题

 回复 引用 查看   
#458楼 2010-12-01 22:08 ganguser      
kankan
 回复 引用 查看   
#459楼 2010-12-03 12:53 hum      
能否一键上传?
 回复 引用 查看   
#461楼 2010-12-10 20:57 wl_1097      
楼主看了大半天的代码,看不懂,这个函数做什么用
var Extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
}

 回复 引用 查看   
#462楼 2010-12-10 21:15 wl_1097      
@cloudgamer
fun函数在那???

 回复 引用 查看   
#463楼 2010-12-10 21:30 wl_1097      
执行时,
Each(rows, function(cells){
var row = document.createElement("tr");
Each(cells, function(o){
var cell = document.createElement("td");
if(typeof o == "string")
{
cell.innerHTML = o; }else{ cell.appendChild(o);
}
row.appendChild(cell);
});
oFragment.appendChild(row);
});
Each(cells,function(o) cells的值从何而来,

 回复 引用 查看   
#464楼[楼主] 2010-12-11 09:44 cloudgamer      
@wl_1097
rows是一个类数组的tr集合
他的元素cells是类数组的td集合

 回复 引用 查看   
#465楼 2010-12-21 23:48 HOTJAVA      
很遗憾地发现不支持IE9,希望能改进。。
 回复 引用 查看   
#466楼[楼主] 2010-12-22 08:23 cloudgamer      
@HOTJAVA
不奇怪 毕竟是两年前的东西
等我用上ie9再看吧

 回复 引用 查看   
#467楼 2010-12-28 10:01 侧耳倾听butterfly      
感谢!
 回复 引用 查看   
#468楼 2011-01-01 17:14 侧耳倾听butterfly      
感谢楼主。但为什么我上传的文件是0字节呢?
 回复 引用 查看   
#469楼[楼主] 2011-01-02 02:22 cloudgamer      
@侧耳倾听butterfly
写不了文件?

 回复 引用 查看   
#470楼 2011-01-14 13:17 默^_^默      
要是能封装成jQuery插件就好了,做个简单的配置就能上传,最好不要把风格定死了,让使用者自己定义风格,现在的代码感觉挺乱的,不易新手使用,不过还是感谢一下楼主分享。
 回复 引用 查看   
#471楼[楼主] 2011-01-14 22:42 cloudgamer      
@默^_^默
这个很久了 那时还不懂怎么封装 你可以自己试试改

 回复 引用   
#472楼 2011-01-16 12:41 libeely[未注册用户]
博主的这个文件上传系统在google的chrome(版本是 v8.0.552.237)浏览器中出错!
具体错误是点击[添加文件]按钮后,页面直接跳转到一个链接为“http://www.cnblogs.com/cloudgamer/admin/javascript:void(0);”的新页面,页面显示的内容是“Bad RequestBad Request”。

 回复 引用 查看   
#473楼[楼主] 2011-01-16 21:41 cloudgamer      
@libeely
写的时候还没有chrome
你可以试试修改

var a = document.createElement("a"); a.innerHTML = "移除文件"; a.href = "javascript:void(0);";
a.onclick = function(){ oThis.Delete(o); return false; };
var txt = document.createElement("input"); txt.type = "text"; txt.name = "txtFile[]";
var slt = document.createElement("select"); slt.style.width="145";
slt.onchange = function(){alert(this.value)};
slt.name = "sltFile[]";jQuery(slt).html(jQuery("#sltDataSbt").html());
arrRows.push([o.value, a, txt, slt]);
我想在指定的文件后面加上一个文件说明输入框和一个类型选择的下拉框,这样子改代码以后每次新添加一个文件以后原先输入的文件说明和下拉项就被清除了,请问这是为什么?有什么办法吗?

 回复 引用 查看   
#475楼[楼主] 2011-02-14 10:48 cloudgamer      
@kobekelly@hotmail.com
因为我每次都清除原来的内容
你可以改成添一个加一个的形式

 回复 引用 查看   
#476楼 2011-02-14 10:52 晚风依染      
我是#474楼的,我猜想也是这样的原因。
DOM对象添加平时我都用jQuery做的,基础js的底子比较差。。
cloudgamer大神能不能说的更细一些。拜谢。

 回复 引用 查看   
#477楼 2011-02-14 11:07 晚风依染      
我把function AddList(rows)方法改成不清除数据然后只添加最后一条数据,但是好像移除文件时候也调用这个方法的,所以移除文件的时候就出问题了。。。
 回复 引用 查看   
#478楼[楼主] 2011-02-14 11:09 cloudgamer      
@晚风依染
你另外写一个方法移除应该就行
详细自己研究吧 我也不太记得了

 回复 引用 查看   
#479楼 2011-03-02 11:19 江血色      
能不能使用FLASH控件实现一步多选呢?
 回复 引用   
#480楼 2011-03-02 12:40 寻找楼主[未注册用户]
和jquery冲突了?

怎么用了之后jquery的$.ajax在页面用不了。

 回复 引用 查看   
#481楼[楼主] 2011-03-02 14:49 cloudgamer      
@江血色
flash就直接用flash了
不需要这个了

 回复 引用 查看   
#482楼[楼主] 2011-03-02 14:50 cloudgamer      
@寻找楼主
把我的$替换成其他符号就行

 回复 引用   
#483楼 2011-03-02 17:07 寻找楼主[未注册用户]
谢谢楼主解答,再请教个问题,我把代码放在aspx页面好像执行不了,然后我把form的ruant='sever'去掉,又可以了。

我的本意是想放套在母版页的子页面里的,可是不成功。

 回复 引用 查看   
#484楼[楼主] 2011-03-02 19:43 cloudgamer      
@寻找楼主
这个没办法 我也有说明
表单是不能嵌套的,最好是把表单放到服务器表单之外,没有办法才使用服务器表单作为提交表单(由于程序会修改提交表单的属性,所以尽量不要这样使用)。

 回复 引用 查看   
#485楼 2011-03-29 16:29 Ben Chan      
楼主,您的代码写得很漂亮,在此我提出一个问题,那就这个在google浏览器中不支持,不知道是什么原因?
 回复 引用 查看   
#486楼[楼主] 2011-03-29 17:39 cloudgamer      
@Ben Chan
正常 我写这个的时候gg浏览器还没出
你可以试试兼容一下

 回复 引用 查看   
#487楼 2011-04-02 15:05 xiaobaihaohaode      
找了好久好久了,谢谢楼主分享。我有一个问题:附件的大小超过4M以后就传不上去了,怎么回事啊?
 回复 引用 查看   
#488楼[楼主] 2011-04-03 14:29 cloudgamer      
@xiaobaihaohaode
估计是超过服务器的限制 跟代码没关系

 回复 引用 查看   
#489楼 2011-04-14 08:44 xiaobaihaohaode      
@cloudgamer
那可不可以上传很大的附件啊,视频之类的

 回复 引用 查看   
#490楼[楼主] 2011-04-14 09:59 cloudgamer      
@xiaobaihaohaode
那不是一样的问题嘛

学习了 楼主 第一次来 支持一下
 回复 引用 查看   
#492楼 2011-04-18 21:42 jevinss      
楼主这个在IE8下面我明明是从F盘下选择的F:\1.jpg文件却显示为C:\fakepath\1.jpg,但是IE6下却是正常的,这是怎么回事?
 回复 引用 查看   
#493楼[楼主] 2011-04-20 21:02 cloudgamer      
@科士威购物网站
谢谢支持

 回复 引用 查看   
#494楼[楼主] 2011-04-20 21:03 cloudgamer      
@jevinss
直接从file获取value就是这样

 回复 引用 查看   
#495楼 2011-05-01 19:45 jevinss      
引用cloudgamer:
@jevinss
直接从file获取value就是这样

要怎么样才能和IE6兼容呢?不能兼容IE8没法用了啊,现在IE8越来越多人用了

 回复 引用 查看   
#497楼 2011-05-06 17:30 下楼弹吉他      
楼主,真是牛人一个,学习了,js这个东西,真是个好东东,很多玄妙的效果都是js实现的,
问个问题:就是上传一个文件,能返回重新命名的名称不?

 回复 引用 查看   
#498楼 2011-05-06 17:37 下楼弹吉他      
噢,没好好看代码,楼主是这样实现传值给父页面的:
保存数据页面(File.ashx):
context.Response.Write("<script>window.parent.Finish('" + _msg + "');</script>");
主页面(FileUpload.htm):
function Finish(msg){ alert(msg); location.href = location.href; }

这样,我也就可以把刚刚上传的图片,重新的命名的名称传到主页面上了^_^


 回复 引用   
#499楼 2011-05-10 12:00 答复[未注册用户]
.net 版本上传不了
 回复 引用 查看   
#500楼[楼主] 2011-05-10 22:08 cloudgamer      
@答复
我测试没问题

 回复 引用   
#501楼 2011-05-11 15:12 moonerssss[未注册用户]
太强大了,这里的一些技术文章太有价值了。
不说了收藏。

 回复 引用 查看   
#502楼 2011-05-13 03:16 GaGeGe      
如果用 JS 模拟点击上传 那就submit不成功了 也不知道在哪出错了
 回复 引用 查看   
#503楼 2011-05-13 17:18 GaGeGe      
发现问题了
出于安全性考虑,如果input是模拟click操作获得的话,浏览器就认为这是不安全的,不再允许提交。
或者会,在submit的时候会自动清空文件域的value

 回复 引用 查看   
#504楼[楼主] 2011-05-14 21:42 cloudgamer      
@moonerssss
谢谢支持

 回复 引用   
#505楼 2011-05-20 09:24 diaoyude[未注册用户]
楼主,下了那么多的php版本 都是一样的 上传不了,有错误!应该都是来源你这吧。能帮忙改一个没错误的吗
 回复 引用 查看   
#506楼 2011-06-08 17:40 f_zp      
你好,请问在asp中如何将多文件写入指定的数据库中?
 回复 引用 查看   
#507楼 2011-07-14 12:51 为乐而来      
学习来了..支持一下.
 回复 引用   
#508楼 2011-07-18 18:16 gjb91[未注册用户]
你 的那个php的上传不了啊??
 回复 引用   
#509楼 2011-07-18 18:17 gjb91[未注册用户]
你能发个完整的php版的给我么 谢谢!!我下载的完整版上传不了阿??
 回复 引用 查看   
#510楼[楼主] 2011-07-20 13:54 cloudgamer      
@gjb91
@diaoyude
php我也不懂 自己修改一下吧

 回复 引用 查看   
#511楼[楼主] 2011-07-20 13:54 cloudgamer      
@为乐而来
谢谢支持

 回复 引用 查看   
#512楼[楼主] 2011-07-20 13:54 cloudgamer      
@f_zp
自己写吧

 回复 引用   
#513楼 2011-07-21 16:07 马勒格彼[未注册用户]
确实是好东西,我修改了下增加了无刷新删除和修改功能,
不过一直有个问题困扰我。
第一次提交有时候获取不到参数。
有时候提交过去的时候
int iTotal = context.Request.Files.Count;
这个获取过来的文件数总是多了1.最后我只能治标不治本给他-1;
- - 。好吧。我承认挺土的。

 回复 引用 查看   
#514楼[楼主] 2011-07-22 09:36 cloudgamer      
@马勒格彼
可以判断一下file是不是空

 回复 引用 查看   
#515楼 2011-07-23 12:38 尐肥羊      
嗯 , 学习中。。。
 回复 引用   
#516楼 2011-08-20 03:08 時代遊客[未注册用户]
太好了,不過我下了PHP版的,IE9用不了,在FF就OK
 回复 引用   
#517楼 2011-08-20 11:30 上升到[未注册用户]
为什么jsp版本的上传获得的file都是null。而且路径也不对。
 回复 引用   
#518楼 2011-08-29 12:30 p9o8[未注册用户]
博主,为什么我导入jsp版的后 javascript this.initialize.apply(this, arguments); 报方法没有定义,还有很多这样的错误,不知道为什么?CJL.0.1.js我也导入了
 回复 引用   
#519楼 2011-08-29 12:31 p9o8[未注册用户]
在线等啊
 回复 引用   
#520楼 2011-08-29 14:51 p9o8[未注册用户]
楼主 jsp的可以用嘛?
 回复 引用   
#521楼 2011-08-31 16:29 niubuhao[未注册用户]
楼主,你好,我一直很支持这个控件,好多网站都在使用,但是最近发现,IE9点击没反应,Firefox最新版在.ashx文件中int iTotal = context.Request.Files.Count;获取的iTotal为0,郁闷中,希望楼主给出处理方法
 回复 引用 查看   
#522楼 2011-09-13 01:09 不懂设计      
跨域呢?没解决啊.
 回复 引用   
#523楼 2011-10-13 09:24 linxu_123[未注册用户]
点击上传到哪个方法啊,没看懂,都不知道怎么在后台提取数据
 回复 引用 查看   
#524楼 2011-10-26 08:52 572420      
谢谢分享啊

www.xingfudiao.com

 回复 引用   
#525楼 2011-11-08 14:26 2707.cn[未注册用户]
引用niubuhao:楼主,你好,我一直很支持这个控件,好多网站都在使用,但是最近发现,IE9点击没反应,Firefox最新版在.ashx文件中int iTotal = context.Request.Files.Count;获取的iTotal为0,郁闷中,希望楼主给出处理方法



期待这个问题可又解决,研究中。。。

 回复 引用 查看   
#526楼 2011-11-20 15:27 天之柱      
NET ashx页面 chrome浏览器
后台int iTotal = context.Request.Files.Count;总是0
不知道哪位解决。FF是好的。
分析from表单里动态添加的input 没看到file。
继续研究中。.

 回复 引用 查看   
#527楼 2011-12-02 10:56 weishanwei      
可以实现文件的一次性多选吗?因为一次只能选择一个文件
 回复 引用 查看   
#528楼 2011-12-02 14:04 weishanwei      
@cloudgamer可以实现文件的一次性多选吗?因为一次只能选择一个文件
 回复 引用 查看   
#529楼 2011-12-13 11:35 落忆无痕      
@niubuhao
@2707.cn
关于IE9下报错。DOM Exception: INVALID_CHARACTER_ERR (5)
我在这里找到了解决办法。http://blog.csdn.net/a497785609/article/details/6317502
但是FF8.0(最新版下面)
还是没有获得要上传的file文件,即file.count==0。。。
不知道大家有没有已解决了的,请赐教啊。

 回复 引用 查看   
#530楼 2011-12-13 15:19 落忆无痕      
@天之柱
请问你解决了这个问题了么。

 回复 引用 查看   
#531楼 2011-12-17 12:59 天之柱      
@落忆无痕
没解决。我现在换用ckfinder 了。文件管理组件。ck编辑器里也用到。

评论共6页: 上一页 1 2 3 4 5 6 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 1314766 OEIEkG+7f+I=