仿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/

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

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

对广告有兴趣的也欢迎点一下^_^。

17
0
(请您对文章做出评价)
« 上一篇:JavaScript Table排序
» 下一篇:JavaScript 日期联动选择器
posted @ 2008-10-20 08:20 cloudgamer 阅读(39140) 评论(384)  编辑 收藏 网摘 所属分类: Asp, web, Javascript, Asp.net

评论共4页: 上一页 1 2 3 4 
  回复  引用    
#285楼2009-09-01 15:53 | Chrisxxxxx[未注册用户]
不好意思泼一下冷水。
楼主这个我很早就懂了。
不过163上传好像是没IE进度条的。

  回复  引用  查看    
#286楼[楼主]2009-09-01 16:51 | cloudgamer      
@Chrisxxxxx
没IE进度条?
什么意思?

  回复  引用    
#287楼2009-09-02 09:34 | Chrisxxxxx[未注册用户]
@cloudgamer
你试试163.com的邮箱吧,在添加文件的时候IE状态栏是没进度条的。

  回复  引用  查看    
#288楼[楼主]2009-09-02 09:47 | cloudgamer      
@Chrisxxxxx
有的
你弄个大点的文件试试吧
反正现在无刷新上传文件只有这个方法(除了flash)
不会有其他方法的,或者你自己研究一下163的

  回复  引用    
#289楼2009-09-02 10:07 | Chrisxxxxx[未注册用户]
@cloudgamer
晕 原来163用的是Flash,被骗

  回复  引用    
#290楼2009-09-02 14:38 | 猩猩123[未注册用户]
谢谢楼主的分享精神,我使用您的代码进行了扩展,就是想在每个文件后加上一个文本框作为图片的标题,但是提交时用httwatch拦截,显示提交时发现除FILES外并没有POST其他数据,
我是在:
var a = document.createElement("a"); a.innerHTML = "取消"; a.href = "javascript:void(0);";

后增加
var b = document.createElement("b"); b.innerHTML = "<input type=\"text\" name=\"intro[]\" />";
并将:
arrRows.push([o.value,a]);
修改成
arrRows.push([o.value, b,a]);
这样前台一切正常,就是提交时没有POST[intro]的数据,是不是还有哪里要修改,请楼主给个思路,可以吗?谢谢!

  回复  引用  查看    
#291楼[楼主]2009-09-02 15:16 | cloudgamer      
@猩猩123
你没留意提交之前列表会重新修改
$("idBtnupload").onclick里面的AddList(arrRows);去掉就行了

  回复  引用    
#292楼2009-09-02 16:00 | 猩猩123[未注册用户]
谢谢群主!
我搞了几个小时都没搞出来,你的一个回复就搞定了!
真的很感谢你!
我是搞PHP的,如果有这方面能帮忙的,一定帮忙!

  回复  引用  查看    
#293楼[楼主]2009-09-02 16:55 | cloudgamer      
@猩猩123
呵呵
谢谢

  回复  引用    
#294楼2009-09-04 10:45 | 1229363[未注册用户]
163已经修改了右键上传现在使用的是flash了。楼上几个同学……恩,有点钻牛角尖了
楼主,如果我想再传递其它的参数该如何呢?

比如:

在界面有个选择文件夹下拉列表,选择上传到的文件夹,然后在file.ashx将文件上传到指定的文件夹(参数)中.

Request.Files[i];//获取file

怎样传递其它的一些参数,在file.ashx,由程序选择文件夹是不是太死啦?

楼主,我好惭愧呀, 我应该多思考,我搞定鸟...
  回复  引用  查看    
#297楼[楼主]2009-09-12 22:26 | cloudgamer      
@我是一只小老虎-
@1229363
谢谢支持

  回复  引用    
#298楼2009-09-17 16:30 | sf_Hmily[未注册用户]
使用Google浏览器就不行了
  回复  引用  查看    
#299楼[楼主]2009-09-17 16:46 | cloudgamer      
@sf_Hmily
这个我也知道好像safari也不行
但这个跟程序无关
因为你用.net自带的上传控件也不行的,这个是.net的问题
asp版本就没有问题

  回复  引用  查看    
#300楼2009-10-13 23:18 | 双击      
楼主太强大了
不得不顶

  回复  引用  查看    
#301楼2009-10-22 14:29 | implato      
请问:
在line 129定义了 initialize: function(form, folder, options) {。。。}
可是在line101调用时候是这样的var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}我不太明白,arguments是哪里来的呢?

还有个问题

SetOptions: function(options) {
this.options = {//默认值
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(){}//重置时执行
};
Extend(this.options, options || {});
},
关于Setoptions里面定义this.options,最后是和参数options病倒一个数组(this.options)了吗?

  回复  引用  查看    
#302楼[楼主]2009-10-22 15:13 | cloudgamer      
@双击
谢谢支持

  回复  引用  查看    
#303楼[楼主]2009-10-22 15:15 | cloudgamer      
@implato
arguments百度一下就有自己查吧
你可以理解一下Extend的操作不难的

  回复  引用    
#304楼2009-10-27 11:46 | 程[未注册用户]
博主,我下载的.net测试版的!但是运行有问题,错误错误:
网页错误详细信息

用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; .NET CLR 2.0.50727; CIBA; DomoloSNSBrowser; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
时间戳: Tue, 27 Oct 2009 03:45:08 UTC


消息: 名称以无效字符开头。

行: 1
字符: 2
代码: 0
URI: file:///C:/Documents and Settings/chrize/桌面/FileUpload/File.ashx

这是为什么啊?

  回复  引用    
#305楼2009-10-27 13:02 | 程[未注册用户]
可以了!原来要放到项目里面才可以!
  回复  引用    
#306楼2009-10-28 07:59 | carlo[未注册用户]
博主,请问一下点击“添加文件” 后,弹出 的“选择文件对话框”是怎么实现的?点击“添加文件” 后,运行的是那段代码?又是如何获得用户选择的文件名的?谢谢!这段代码很精彩,赞一个
  回复  引用  查看    
#307楼[楼主]2009-10-28 08:35 | cloudgamer      
@
哦 呵呵

  回复  引用  查看    
#308楼[楼主]2009-10-28 08:36 | cloudgamer      
@carlo
就是用一个层模拟了file控件
详细看file样式的部分

  回复  引用    
#309楼2009-10-28 08:53 | carlo[未注册用户]
非常感谢博主这么快就回复了我的问题。但是我想问的是,如何实现点击“添加文件” 后,就能弹出 的“选择文件对话框”?我把脚本去掉以后,发现单击“添加文件” 后,是不能弹出“选择文件对话框”,但是我在脚本里面也没有找到哪句是实现这个效果的,能否麻烦您给我解释的更详细一些,感激涕零!!!!
  回复  引用  查看    
#310楼[楼主]2009-10-28 10:59 | cloudgamer      
@carlo
所以我叫你看file样式的部分
原理就在那里
你点击的地方其实就是点了一个file的input

  回复  引用    
#311楼2009-10-28 17:15 | carlo[未注册用户]
谢谢!我再仔细看看!
  回复  引用  查看    
#312楼2009-10-29 09:40 | 87Super      
谢谢楼主。.net测试成功。
  回复  引用    
#313楼2009-10-29 21:04 | wfwfwfff[未注册用户]
各位朋友,我对这个源码还看不明白,望指点。
ProcessRequest 这个方法是从哪跳转过去的?
我把改造这个系统,有哪位有兴趣,我们一起研究下。
我的QQ:57328826
注:研究。NET的。

  回复  引用  查看    
#314楼2009-10-29 21:16 | wfwfwfff      
楼主的代码运用之精,实在是让人开眼界,如何楼主能提供让上传的图片显示在文本编辑器里的功能就更加让人佩服。
  回复  引用  查看    
#315楼[楼主]2009-10-29 21:58 | cloudgamer      
@wfwfwfff
呵呵 谢谢支持

  回复  引用    
#316楼2009-10-30 11:14 | woaiSS[未注册用户]
中文名乱码解决了没有啊
  回复  引用    
#317楼2009-10-30 11:15 | woaiSS[未注册用户]
乱码真的是大问题啊,页面后台都设置的编码,可是还是乱码。楼主有好的解决办法吗
  回复  引用  查看    
#318楼[楼主]2009-10-30 11:17 | cloudgamer      
@woaiSS
应该已经解决了啊
你下的是最新修改的版本吗

  回复  引用  查看    
#319楼2009-10-30 21:21 | itliyi      
lz我下载.net版的怎么上传没反应?就显示滚动条图片
浏览器左下角提示 名称以无效字符开头 错误
我用的是IE6

  回复  引用  查看    
#320楼[楼主]2009-10-30 21:58 | cloudgamer      
@itliyi
是不是你的iis有问题

  回复  引用  查看    
#321楼2009-11-11 17:07 | 蒙山      
我用的jsp,前台加了个隐含表单,后台用servlet为什么没有取到数据呢?我试了如果把上传方式改为get就可以取到,但是就没有上传功能了啊!感谢指导啊!
  回复  引用  查看    
#322楼[楼主]2009-11-11 17:26 | cloudgamer      
@蒙山
jsp我不懂的啊

  回复  引用  查看    
#323楼2009-11-12 08:49 | 蒙山      
就是post的数据接收不到啊!只能收到file表单的内容也就是说可以实现上传,但是不能传参!
  回复  引用  查看    
#324楼[楼主]2009-11-12 09:21 | cloudgamer      
@蒙山
这个应该是跟jsp有关
你问问懂的人吧

  回复  引用    
#325楼2009-11-23 14:46 | 贝爸[未注册用户]
楼主的代码太强了,先赞一个,我在使用过程中,添加大文件如:*.rar 的时候上传总是失败,弹出的对话框是空白,查看上传目录也没有文件
  回复  引用  查看    
#326楼[楼主]2009-11-23 16:04 | cloudgamer      
@贝爸
可能是出现ERROR_INTERNET_CONNECTION_RESET错误
这个是服务器错误,在文件大于服务器限制时就会出现

  回复  引用    
#327楼2009-12-02 10:16 | lin1605[未注册用户]
强,很好的程序,不得不佩服
  回复  引用  查看    
#328楼2009-12-02 15:10 | 飘~      
mark
  回复  引用    
#329楼2009-12-02 15:33 | 辰光未然[未注册用户]
好强大……我修改了一下用做我们广播台音频系统的上传部分了。收藏了。以后会常来向博主讨教的。
  回复  引用  查看    
#330楼2009-12-02 16:37 | 大力bober      
楼主。在MVC中怎么提交?修改了action参数后发现没有提交成功!
  回复  引用  查看    
#331楼[楼主]2009-12-02 16:53 | cloudgamer      
@辰光未然
@飘~
@lin1605
谢谢支持

  回复  引用  查看    
#332楼[楼主]2009-12-02 17:00 | cloudgamer      
@大力bober
你是怎么改的

  回复  引用  查看    
#333楼2009-12-02 17:07 | 大力bober      
我刚弄错了。现在是可以接收。但还是遇到问题。比如上传的文件个数总是多一个。另外不能处理返回值。
  回复  引用  查看    
#334楼2009-12-02 17:14 | 大力bober      
问题解决。但为什么程序得到的会多一个文件?
  回复  引用  查看    
#335楼[楼主]2009-12-02 17:18 | cloudgamer      
@大力bober
两个一样的文件?

  回复  引用  查看    
#336楼2009-12-02 17:20 | 大力bober      
后台得到的文件总比上传的文件多一个。最后一个文件是空文件。但仍然在 Request.Files当中。
  回复  引用  查看    
#337楼[楼主]2009-12-02 17:35 | cloudgamer      
@大力bober

因为有一个file给人选择文件的嘛
没有选就多一个咯
你要判断filesize
参考我那个吧

  回复  引用  查看    
#338楼2009-12-02 17:36 | 大力bober      
哦。对的。谢谢!
  回复  引用    
#339楼2009-12-07 23:15 | lyem[未注册用户]
请问楼主,这个可以上传大型的文件吗,视频可以吗?
有没有视频版的啊,有的话请楼主发到我邮箱,万分感谢!

  回复  引用  查看    
#340楼[楼主]2009-12-08 08:43 | cloudgamer      
@lyem
传输文件大小是后台或服务器设置的
前台也是一样的传输

  回复  引用  查看    
#341楼2009-12-10 23:51 | 天天me      
楼主,你好
用你的代码有一段时间了
觉得很无敌
但是现在因为新的需求需要返回图片的缩略图
现在的IE8和FF3都不支持全路径了
在网上也找到咯支持的方法
但是不知道+在什么地方
呵呵
小弟JS略懂,不是很好
望博主指点下
THX

  回复  引用  查看    
#342楼[楼主]2009-12-11 00:48 | cloudgamer      
@天天me
应该可以在AddList里面加

  回复  引用    
#343楼2009-12-17 20:20 | 公爵[未注册用户]
问楼主一个问题:

//整理文件空间,把有值的file放入文件集合
Each(this.Folder.getElementsByTagName("input"),
Bind(this, function(o){
if(o.type == "file")
{ o.value && this.Files.push(o); this.onIniFile(o); }}
))

这个函数里面中的 Bind 中的 this 是指向 FileUpload这个类呢?
还是指向 file 这个 input 本身?



  回复  引用  查看    
#344楼[楼主]2009-12-17 20:22 | cloudgamer      
@公爵
前者

  回复  引用    
#345楼2009-12-17 20:30 | 公爵[未注册用户]
接上文:
好像明白点,又有点糊涂。
each 函数里面 传的参数 fun

在上面的这个里面是不是可以理解为 Bind ,
list[i] 理解为 FileUpload 这个类里面的所有方法
i 为每个 input

这样就把每个 input 绑上了 FileUpload 的方法了。


好像理解的不对,又好像对。

期望楼主答疑。 谢谢。

  回复  引用  查看    
#346楼[楼主]2009-12-17 21:08 | cloudgamer      
@公爵
bind就是用来修改函数的this
跟call的作用类似

  回复  引用    
#347楼2009-12-22 17:52 | 被折磨者[未注册用户]
ie8下好像file的样式就会有问题,不透明了
  回复  引用  查看    
#348楼[楼主]2009-12-22 19:24 | cloudgamer      
@被折磨者
我这里看没问题啊
你是什么系统

  回复  引用    
#349楼2009-12-23 22:35 | 上的大事[未注册用户]
我眼搓
为什么我看不到 type="file" 在哪》?file 控件在哪

  回复  引用  查看    
#350楼[楼主]2009-12-23 22:44 | cloudgamer      
@上的大事
就是在添加文件那里咯

  回复  引用  查看    
#351楼2010-01-13 17:43 | 晚风依染      
我想问一下,如果我想用js把“c://aaa.txt”这样一个文件的路径预先加载在画面上,应该要怎么做?我下了那个php版本的研究了js部分,没全部看懂。
  回复  引用  查看    
#352楼[楼主]2010-01-13 19:05 | cloudgamer      
@晚风依染
浏览器不允许的
安全问题

  回复  引用  查看    
#353楼2010-01-13 21:21 | chinarenkai      
强烈要求楼主研究一个真实的进度条,
楼主辛苦了!

  回复  引用  查看    
#354楼2010-01-13 22:17 | 晚风依染      
引用cloudgamer:
@晚风依染
浏览器不允许的
安全问题

其实我的意思是想把服务器上存储的文件的路径初始化先显示在页面上,因为是要做文件的增加删除,倒不是要去访问本地的文件。
如果是这样的话有什么办法吗?

我现在自己另外写一个容器放服务器上的文件路径,但是没有你这个好,所以就想放到idFile一起。

  回复  引用  查看    
#355楼[楼主]2010-01-13 22:45 | cloudgamer      
@chinarenkai
如果有时间做下一个版本会 考虑的

  回复  引用  查看    
#356楼[楼主]2010-01-13 22:46 | cloudgamer      
@晚风依染
我这个是上传文件不是文件管理
你应该找一个文件管理系统

  回复  引用  查看    
#357楼2010-01-13 23:48 | 晚风依染      
我是要上传和对已上传的文件管理一起做,因为你这个系统真的很棒,所以想糅合在一起,不过现在看来只能将就了。
非常感谢!!

  回复  引用  查看    
#358楼[楼主]2010-01-14 08:27 | cloudgamer      
@晚风依染
你可以参考163的网盘管理
我就是做的差不多的系统
这个上传只是其中一部分而已

  回复  引用  查看    
#359楼2010-01-16 19:31 | 晚风依染      
我就是用的这个系统,但是我初始显示了数据库取到的路径,这个没问题。
结果再添加文件时,原先的路径被删除了,似乎是没有能保存住。

  回复  引用  查看    
#360楼[楼主]2010-01-16 21:41 | cloudgamer      
@晚风依染
上传跟文件管理是不同的部分
不明白你是怎样的系统

  回复  引用  查看    
#361楼2010-01-27 14:23 | 报答      
引用我是一只小老虎-:
楼主,如果我想再传递其它的参数该如何呢?

比如:

在界面有个选择文件夹下拉列表,选择上传到的文件夹,然后在file.ashx将文件上传到指定的文件夹(参数)中.

Request.Files[i];//获取file

怎样传递其它的一些参数,在file.ashx,由程序选择文件夹是不是太死啦?


是啊想传几个text文本怎么办啊,ashx很少用,怎办传参啊

  回复  引用  查看    
#362楼[楼主]2010-01-27 14:46 | cloudgamer      
@报答
可以参考
http://www.cnblogs.com/cloudgamer/archive/2009/12/01/Quick_Upload.html
这里可以自定义文件名
可以把文本传过去

  回复  引用  查看    
#363楼2010-02-01 19:16 | 徐小龙      
请问下 楼主
我想把这段js代码放在ascx文件中
就是想做一个上传的控件
怎么后台处理
能不能不用ashx处理用ascx.cs处理?

  回复  引用  查看    
#364楼[楼主]2010-02-01 19:33 | cloudgamer      
@徐小龙
可以的啊
设置action就是了

  回复  引用  查看    
#365楼2010-02-01 19:34 | 徐小龙      
那个action怎么设置啊?
写成action="AddAttachment.ascx"的吗?

  回复  引用  查看    
#366楼2010-02-01 19:35 | 徐小龙      

楼主,
对.net理解深吗?
为什么我的后台取不到数据??
纠结了两天了
我的js本来不怎么好。谢谢楼主分享这么好的js代码

  回复  引用  查看    
#367楼[楼主]2010-02-01 19:46 | cloudgamer      
@徐小龙
哦,ascx是用户控件,用户控件必须嵌入到aspx中才能使用
不能直接这么用的
刚才没留意

  回复  引用  查看    
#368楼2010-02-01 19:48 | 徐小龙      
对啊 ,楼主能不能给个解决方案啊?
如果嵌在aspx中不是就有两个form了啊!

  回复  引用  查看    
#369楼2010-02-01 19:49 | 徐小龙      
我觉得这效果太好了,,不想用其他的。。
不知道能不能解决。。。。

  回复  引用  查看    
#370楼[楼主]2010-02-01 20:47 | cloudgamer      
@徐小龙
不放到服务器的form不就行了
放外面

  回复  引用  查看    
#371楼2010-02-01 20:50 | 徐小龙      
现在的问题是我的后台的.cs文件获取不到前台的数据
  回复  引用  查看    
#372楼2010-02-01 20:51 | 徐小龙      
楼主,能加你QQ吗?
而且那个action我不知道写什么了 ,,因为我放在ascx文件上,默认的肯定是ascx.cs文件处理

  回复  引用  查看    
#373楼[楼主]2010-02-01 21:15 | cloudgamer      
@徐小龙
是在不行就放在iframe里面吧

  回复  引用  查看    
#374楼2010-02-01 21:16 | 徐小龙      
什么意思?
不懂

  回复  引用  查看    
#375楼[楼主]2010-02-01 23:19 | cloudgamer      
@徐小龙
或者你找个熟悉前台的人来弄咯

  回复  引用  查看    
#376楼2010-02-01 23:20 | 徐小龙      
呵呵 你觉得我这有可行度没啊?
  回复  引用  查看    
#377楼2010-02-01 23:20 | 徐小龙      
还是我不放在ascx直接在aspx上用?
  回复  引用  查看    
#378楼[楼主]2010-02-01 23:58 | cloudgamer      
@徐小龙
具体自己想想办法吧
我没有放在服务器的form里面的

  回复  引用  查看    
#379楼2010-02-02 11:52 | 徐小龙      
楼主,我下下来的那个也不能保存文件。。怎么解决
  回复  引用  查看    
#380楼[楼主]2010-02-02 12:32 | cloudgamer      
@徐小龙
可以哦
是不是你的文件太大了

  回复  引用  查看    
#381楼2010-02-02 22:25 | 徐小龙      
不是啊 。我就一张照片54K也不行
file文件夹没东西
那个filename设置了好像没什么用?
还要设置其他的东西吗?

  回复  引用  查看    
#382楼[楼主]2010-02-03 04:02 | cloudgamer      
@徐小龙
什么都不用改的啊
你自己调试一下吧

  回复  引用  查看    
#383楼2010-02-03 14:39 | 徐小龙      
[img]C:\Documents and Settings\Administrator\桌面\未命名.jpg[/img]

不行啊
  出现这样就没反应了

  回复  引用  查看    
#384楼[楼主]2010-02-03 22:53 | cloudgamer      
@徐小龙
我这里确实没问题
你自己再调试吧

评论共4页: 上一页 1 2 3 4