Wu.Country@侠缘

勤学似春起之苗,不见其增,日有所长; 辍学如磨刀之石,不见其损,日所有亏!

ASP.net下大文件上传的解决方案及WebbUpload组件源码

WebbUpload上传组件

特性简介
可上传上小于1G的文件,可以配置Web.config文件来设定上传文件的大小。
完全基于.NET开发,无需任何客户端配置。
提供同步的上传进度条,显示实时上传进度信息。
不破坏页面逻辑,提供类似ASP.NET内置上传组件的使用方法。
不受 Server.ScriptTimeout(请求的超时设置) 影响,可配置服务器处理时间。


开发测试环境
操作系统:Windows XP Professional(en)
开发工具:Microsoft Visual Studio.NET 2003
WEB服务器:IIS 5.0 & .NET Framework 1.1
浏览器:Internet Explorer 6.0/

2005-12-28更新说明:
1、修改了多文件上传时文件列表项为空时的错误。
2、更新了进度条的文件名显示方法,只保留文件名,删除了路径。
下载 http://files.cnblogs.com/WuCountry/WebbUploadSample.rar


关于WebbUpload上传组件的开发请查看相关链接:http://computer.mblogger.cn/wucountry/posts/48947.aspx 


2006-01-25 第二次更新:




下载:http://files.cnblogs.com/WuCountry/WebbUploadSample.zip

说明:
1、修改了一下上传进度条。
2、添加了几个属性,并修改了一个类名,原来的WebbUploadHandler改为WebbUploadStatusHandler。
3、可以不破坏HttpinpuFile上传,只用在调用时调用方法:EnableWebbUpload(false);就可以使用原来的上传方法。默认是使用WebbUpload.
4、本次下载文件里有演示的完整源代码。

相信本次修改会会使该组件越来越稳定,而且在我的实际项目里一直在使用。


2006-02-17
公开全部源代码。

昨天同事给了我一个工具,可以把DLL文件逆向为工程项目。所以这个上传组件也就没有必须在保护源代码了。
本来考虑到ASPNetUpload的商业行为,还准备暂时不公开这个组件的源代码,但这已经没有意义了。
Webb.WAVE.Controls.WebbUpload控件全部源代码:
http://files.cnblogs.com/WuCountry/WebbUpload.zip
结合上面的演示实例,应该是一个很好的学习项目。

posted on 2005-12-28 16:40 Wu.Country@侠缘 阅读(23416) 评论(207)  编辑 收藏

评论共2页: 1 2 下一页 

评论

#1楼  2006-02-20 09:22 暴风雪 [未注册用户]

我有个关于代码的问题,

就是在处理Http请求的时候 根据ContentLength建立了一个byte的数组。
那么是不是说上传多大的文件都会在内存里占用相应的大小的文件呢?
如果很多人同时上传 服务器还不得崩了?

这块一直没想太明白,请帮忙指点下。
谢谢   回复  引用    

#2楼  2006-02-20 11:26 william_luck [未注册用户]

我在运行您的组件时出现以下错误,不知道是什么原因?
Server Error in '/testupload/WebbUploadSample' Application.
--------------------------------------------------------------------------------

Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.

Parser Error Message: The located assembly's manifest definition with name 'Microsoft.Web.UI.WebControls' does not match the assembly reference.

Source Error:


Line 1: <%@ Control Language="c#" AutoEventWireup="false" Codebehind="Inc_Botton.ascx.cs" Inherits="Webb.WAVE.inc_botton" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
Line 2: <%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
Line 3: <script language=javascript>
Line 4: function WavePageChangeTitle(){


Source File: E:\testupload\WebbUploadSample\Inc_Botton.ascx Line: 2

Assembly Load Trace: The following information can be helpful to determine why the assembly 'Microsoft.Web.UI.WebControls' could not be loaded.


=== Pre-bind state information ===
LOG: DisplayName = Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35
(Fully-specified)
LOG: Appbase = file:///E:/testupload/WebbUploadSample
LOG: Initial PrivatePath = bin
Calling assembly : (Unknown).
===

LOG: Publisher policy file is not found.
LOG: No redirect found in host configuration file (D:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet.config).
LOG: Using machine configuration file from D:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\config\machine.config.
LOG: Post-policy reference: Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL file:///D:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/testupload_webbuploadsample/ba2d274f/c422d832/Microsoft.Web.UI.WebControls.DLL.
LOG: Attempting download of new URL file:///D:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/testupload_webbuploadsample/ba2d274f/c422d832/Microsoft.Web.UI.WebControls/Microsoft.Web.UI.WebControls.DLL.
LOG: Attempting download of new URL file:///E:/testupload/WebbUploadSample/bin/Microsoft.Web.UI.WebControls.DLL.
WRN: Comparing the assembly name resulted in the mismatch: PUBLIC KEY TOKEN




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:1.1.4322.573; ASP.NET Version:1.1.4322.573   回复  引用    

#3楼 [楼主] 2006-02-20 14:30 Wu.Country@侠缘      

To:暴风雪
要充分相信我们的服务器。
呵呵,我的组件没有经过压力测试,所以我不好回答你的问题。可能ASPNetUpload的组件经过压力测试。然而其工作原理是一样的,如果服务器的内存够大,应该还是可以的。在我的512MB的机器上测试时都很正常,而且内存占用在1个人上传的时候可能会达到100MB。但我没好办法了,速度与内存消耗总得有一个。
To:william_luck
删除这个JavaScript函数,这是我的其它项目里的内容。
自己可以删除与WebbUpload无关的任何内容。这里面可以是两个项目。
  回复  引用  查看    

#4楼  2006-02-20 15:26 william_luck [未注册用户]

在下实在是不好意思,因为我是初学者,不太明白应该在哪个地方删除那个JavaScript函数,请您一定给我解答一下,非常感谢!
  回复  引用    

#5楼  2006-02-20 15:49 william_luck [未注册用户]

我在网上找了很多关于安装Microsoft.Web.UI.WebControls的文章,也都按照步骤照做,但运行您的组件还是报错,我觉得还是那个treeview控件没有注册成功!另外我发现你发布的程序bin目录下没有Microsoft.Web.UI.WebControls.dll这个文件.
哎!郁闷了一天了!
如果您有时间的话,能不能上传一个不包含这个函数的上传组件!

非常感谢您能够免费把这个程序和大家共享!希望您以后多加指教!   回复  引用    

#6楼 [楼主] 2006-02-20 16:22 Wu.Country@侠缘      

一个最简单的方法就是先备份你下载的源文件。

再用新的文件做为测试项目文件,一点一点的注释或者删除你不明白的内容。
直到可以运行,直到你全部看明白,或者只到只剩一行语句。。。。

然后对比两个项目,向删除过内容的那个项目中一行一行的添加新内容,直到和原来的完全一样。。。。
这是我学习的一个方法,希望对楼上的有用。。。。

关于Microsoft.Web.UI.WebControls,原来的是私有程序集,后来安装成为公有程序集,所以你所参考的可能有问题,你从MS的网站上下载最新的安装包后,直接安装就行了,本地的BIN目录里不再须要这样文件了。但地项目发布时,考虑到版本原因,还是将这个文件COPY过去。   回复  引用  查看    

#7楼  2006-02-21 13:29 mpokky [未注册用户]

侠缘大哥,我编译后出现这样的报错是怎么回事啊,warning CS1607: Assembly generation -- Referenced assembly 'Webb.WAVE.Controls.Upload' is a localized satellite assembly
另外,大哥有e-mail或qq吗   回复  引用    

#8楼 [楼主] 2006-02-21 14:13 Wu.Country@侠缘      

对于文件里的一些错误,我真的表示很报谦。因为这是从我的实际项目里提取出来的,所以里面多多少少有一些我没能移出的内容,可能会在编译及运行中产生一些错误。
但这并不影响组件的使用,因为组件完全是一个独立的内容,可以重新建立一个新的Web项目来测试这个组件。。。。。。。。

TO:mpokky:你的问题前面已经有人问过了,你删除这些多余的引用就行了。   回复  引用  查看    

#9楼  2006-02-21 15:49 william_luck [未注册用户]

多谢Wu.Country@侠缘 的指点,我删除那些无用的按钮函数后终于实现了大文件上传的功能,确实不错!
但我也有一些问题:(1)如何改变上传文件存放的路径(我在singleupfile.aspx.cs中找到一些关于上传文件的代码,但改过之后没有任何反映!例如:我将下面这条提示语句this.Label1.Text= "Uploaded file:<br/>";改成
this.Label1.Text= "上传文件名:<br/>";但运行后没有任何变化!在下没学过c#,.net,麻烦您解释一下我这个低级的问题)
(2)如何将上传进度条的提示改成中文提示
由于在下初学asp.net,请教楼主网上有什么比较好的学习网站或书籍?
麻烦您了!   回复  引用    

#10楼 [楼主] 2006-02-22 08:56 Wu.Country@侠缘      

Webb.WAVE.Controls.WebbUpload里有一个资源文件(唯一的),这是一个基于HTML的文本文件,修改里面的英文,可以得到想要的进度条。

Lable1的显示文字是动态修改的,静态的只是为了在设计时看见它。你可以学习一下ASP.net的基础知识。   回复  引用  查看    

#11楼  2006-02-22 17:45 mpokky [未注册用户]

WebbUpload wu = new WebbUpload();
UploadFile uf = wu.GetUploadFile("f");

我得到的uploadfile对象是空的,怎么回事啊,我 的e-mail是mpokky@citiz.net   回复  引用    

#12楼 [楼主] 2006-02-23 09:26 Wu.Country@侠缘      

你再仔细检查一下。你的Form要能上传文件才行,也就是要添加:
enctype="multipart/form-data"
或者还可能有其它的错误,你参考一下例子。
  回复  引用  查看    

#13楼  2006-02-23 18:11 mpokky [未注册用户]

现在是UploadFile uf = wu.GetUploadFile("f");
getuploadfile方法返回的是null值,
form的那句话我也写了
代码如下:
WebbUpload wu = new WebbUpload();
UploadFile uf = wu.GetUploadFile("file1");
if(uf!=null)
{

string filename = uf.ClientFullPathName;
filename = Path.GetFileName(filename);

string filepath = fyear+fmonth+fday+fh+fm+fs+filename;
string savepath = Server.MapPath(Request.ApplicationPath)+"\\"+ConfigurationSettings.AppSettings["uppath"];

savepath = savepath+"\\"+filepath;
uf.SaveAs(savepath);
}   回复  引用    

#14楼 [楼主] 2006-02-24 08:30 Wu.Country@侠缘      

你参考例子看看吧。这里的代码没看出有什么问题。   回复  引用  查看    

#15楼  2006-03-03 11:48 denny li [未注册用户]

大侠,

谢谢你的帮忙,我现在使用你的代码在windows 2003 server and vs2003下面使用已经没有问题了。

但是我们新系统的环境是windows 2003 and vs2005,我把你所有的东西都搬到vs2005下面,system.web使用framework1.1的。

编译没有问题,运行的时候出问题。



请问如何才能把你的代码移到2005下,让他能正常运行?

希望你得到你的回复

denny.li@fusion-system.com

谢谢

  回复  引用    

#16楼 [楼主] 2006-03-03 16:29 Wu.Country@侠缘      

目前我没有环境在2005下及asp.net2.0下测试。
有机会我一定修改这个组件。   回复  引用  查看    

#17楼  2006-03-08 11:05 denny li [未注册用户]

你好,谢谢你的帮助
现在上传组件可以在我们2005的项目中使用了
想问一下当我上传完以后,我重新刷新页面为何文件会重新上传一次呢?(我到对应目录下删除上传的文件,刷新后文件又上传了)
如何解决这个问题呢?

(同样的问题也在你的sample中存在)

希望能得到你的回复

谢谢

Denny Li
  回复  引用    

#18楼 [楼主] 2006-03-08 11:11 Wu.Country@侠缘      

这个问题很简单,你自己在PageOnLoad或者提交事件上添加一些自己的逻辑就行了。
或者你上传后,做一些跳转,资源清理等工作就不会有这样的问题了。 这与组件没有关系。
感谢你对组件的支持,并使用在2005中。   回复  引用  查看    

#19楼  2006-03-08 13:44 笨笨小新 [未注册用户]

您好!
用了您的Sample,在VS2005上面跑了一下,可以上传,也出现了ProgressBar,可是上传完了后,却出现了不能找到页面的错误,难道根VS2005有关?   回复  引用    

#20楼  2006-03-08 14:33 笨笨小新 [未注册用户]

另外不好意思还有一个问题。
就是如果上传文件的大小超过了web.config里面的max值,会不会出现找不到叶面的错误?

谢谢。
主要是上面催得紧,只好先来问问。
现在也同时开始认真读代码。赫赫   回复  引用    

#21楼 [楼主] 2006-03-08 14:57 Wu.Country@侠缘      

会!我试过。你也可以试一下。但我的组件没有在2005里试过,你自己试试吧。   回复  引用  查看    

#22楼  2006-03-08 17:14 笨笨小新 [未注册用户]

看了一眼source,发现这么一句。
long m_requestTotalSize = Convert.ToInt64(m_workRequest.GetKnownRequestHeader(11));

这句话大致取到了上传文件的长度,(好像不是绝对一致的长度,因为它原理上是Header的长度,天知道Http协议往里面夹了什么东西。)

这个长度好像也是在文件还没有上传的时候就能知道。

因此紧跟着下面有这么两句
long m_MaxSize = this.GetUpLoadFileLength();
if(m_requestTotalSize>m_MaxSize)
{
return;
}
其中m_MaxSize 就是web.config里面定义的最大长度,
因此,我就可以在return前面写上一些代码,达到如果超出这个预先定义的最大长度,就返回出错画面什么的。

我可以这么理解吧?

不过讨厌的是这是void函数,没法用返回值体现结果。。。。

  回复  引用    

#23楼  2006-03-08 17:17 笨笨小新 [未注册用户]

补充:
我现在就是想上传文件长度万一超过web.config里面定义的最大值,
最好也不要直接蹦出来找不到服务器画面,
而是返回一个比较平易近人的出错画面。

赫赫,请继续指教!   回复  引用    

#24楼  2006-03-08 17:35 笨笨小新 [未注册用户]

刚才发现在我的web目录下面
(还没找到程序里面在那儿设置的上传子目录,姑且认为web子目录就是上传子目录或者临时子目录)
有这种文件
e0bc0bc9-5c13-489a-8946-0338f10dc22a.rar
而且有900多兆。我原始的上传文件是rar文件,可是只有6兆多。

我是调试到某句,几分钟什么也没干,画面就自动跳到找不到服务器出错叶面。
反复了几次后突然系统告诉我硬盘空间不足,一查,查出了这个文件来。赫赫

Wu.Country@侠缘 不知道碰到过这种情况没有?   回复  引用    

#25楼  2006-03-08 17:47 笨笨小新 [未注册用户]

对了,在我本地的机器上传送速度也就是50KB/s,这个速度正常吗?。。。。   回复  引用    

#26楼  2006-03-08 17:59 路过 [未注册用户]

那要看你的机器怎样了。。。。。
我的:P42.8
512MB内存,本机测试3.8MB/S为最大速度。   回复  引用    

#27楼  2006-03-08 19:18 笨笨小新 [未注册用户]

@路过

我的是ThinkPad T41,PM1.7,1G内存,按理说不该这么差呀。

不过我用的是VS2005,总觉得可能哪儿没设置好?   回复  引用    

#28楼  2006-03-09 09:22 空中飞人 [未注册用户]

你好.用你那个源代码下载的地址下载到的文件是一个件以文件?需要用什么打开?   回复  引用    

#29楼 [楼主] 2006-03-09 09:45 Wu.Country@侠缘      

@笨笨小新
别人只是路过,不可能再回答你的问题了。。呵呵。。。。(开个玩笑)
看来是你的代码不够精练了,或者配置有些问题。
理论上对比来看,你的真的不应该这慢。。。。。。。。
@空中飞人
打不开?!!!还是怪事!!??你自己再仔细检查一下好吗?   回复  引用  查看    

#30楼 [楼主] 2006-03-09 09:48 Wu.Country@侠缘      

@笨笨小新
关于前面的几个问题。
在测试的时候,我也遇到过这样的问题。
这主要是出现一些IO错误,或者异常中断的时候,没有清理资源而形成的。一般生成的这样的文件不会大于单个上传的文件。
如果你没有上传900MB的文件,而出现了这个文件,则说明你的程序有问题,可能在什么地方出现了死循环。。仔细检查一下。。。。。。   回复  引用  查看    

#31楼 [楼主] 2006-03-09 09:51 Wu.Country@侠缘      

最后申明一下,如果准备自己修改及编写源代码的时候,请做好心理准备,你可能要在上百MB的数据里找几个关健的字节。。。。。。。。
这样的调试要小心,学好调试技术及培养好的心理素质很重要。祝你好运。   回复  引用  查看    

#32楼  2006-03-09 14:24 笨笨小新 [未注册用户]

TO 大侠
我确实只用得你的Sample,也出现这样的问题呀。只不过是用在VS2005上而已。

另外,经常会出现这种情况,就是在Module里面

byte[] m_preloadedEntityBody = m_workRequest.GetPreloadedEntityBody();

m_preloadedEntityBody 永远取不到东西,太奇怪了。。。。
偶尔能取到两回,可是已经搞不清楚怎么取到的了。。。。

另外,[你可能要在上百MB的数据里找几个关健的字节。。。。。。。。]这句话是啥意思?会有啥情况?我是菜鸟,不要吓唬我呀。。。。。
  回复  引用    

#33楼  2006-03-09 17:00 笨笨小新 [未注册用户]

另外,我能否在WebbUpload_BeginRequest里面,
判断到如果上传文件size大于web.config里面的设置值的话,直接返回自己写的出错页面,这种要求能否实现呢?
我原来在Global.asax里面的Application_BeginRequest里面写Response.Redirect,可是好像不起作用??   回复  引用    

#34楼  2006-03-15 11:37 hutgu [未注册用户]

这个是怎么回事?我下载晚了之后,直接用vs.net打开的。

Visual Studio .NET无法创建或打开应用程序。问题很可能是因为本地Web服务器上没有安装所需要的组建。

  回复  引用    

#35楼 [楼主] 2006-03-15 17:32 Wu.Country@侠缘      

MS的webCOntrols组件,我应该删除它的!
下个星期我重新整理一下这个组件再发给大家吧!尽量做好一些!
也不枉大家这样对我的支持。   回复  引用  查看    

#36楼  2006-03-25 11:01 andyban [未注册用户]

我是一个菜鸟,运行您的第二次更新程序出现如下错误:
找不到文件或程序集名称“Microsoft.Web.UI.WebControls”,或找不到它的一个依赖项。
我去哪里下载这个组件,给个地址好吗?

  回复  引用    

#37楼 [楼主] 2006-03-27 08:54 Wu.Country@侠缘      

到MS的网站去下载,应该可以很很快的搜索到这个组件。
或者删除这个组件的引用。   回复  引用  查看    

#38楼  2006-03-27 11:30 Houp [未注册用户]

侠缘 老师能否给出一个vb.net调用上传组件的示例?自已做了一个,可总是有问题。   回复  引用    

#39楼  2006-03-27 17:12 Houp [未注册用户]

在局域网内测试了一下,上传速度为1.5-1.9M之间。   回复  引用    

#40楼  2006-03-30 10:49 浪漫 [未注册用户]

如果我想修改:Webb.WAVE.Controls.WebbUpload自动生成的javascript代码,如何做?是否可以提供Webb.WAVE.Controls.WebbUpload的源代理?   回复  引用    

#41楼 [楼主] 2006-03-30 11:38 Wu.Country@侠缘      

该源代码早就公开了,在博客页面上的最后下载地址上。你自己下载吧。   回复  引用  查看    

#42楼  2006-04-01 22:30 我123 [未注册用户]

web.config里面的编码改成GB2312的时候上传中文文件名称就成乱码了,我的工程里只能使用这种编码,怎么办   回复  引用    

#43楼  2006-04-03 15:11 cjh [未注册用户]

哈哈。俺也用过逆项工程的工具,不错的
有GUI不过只能一个一个的看每个类,但是用命令行一下把全部类都搞定,哈哈。
不过我没机会反编译搂主的东东啦。
楼主的东西和SunriseUpload一样呀   回复  引用    

#44楼 [楼主] 2006-04-03 15:34 Wu.Country@侠缘      

@我123
我没遇到过这样的问题!为什么不就用utf-8呢?
@cjh
我的这样组件借鉴了SunriseUpload的一些脚本。核心技术都是参考的这篇文章:
http://blog.aspcool.com/rogerwang/archive/2005/10/18/1841.html#3115
虽然从技术上讲,大家都可以写上传组件,但对于不同的算法,上传的效率还是不一样的。。。。。。
关于这几个组件中的相互关系我已经说的很清楚了,就不再多说了。   回复  引用  查看    

#45楼  2006-04-04 09:39 TW [未注册用户]

5b1a0775-7dc3-4546-9659-1cae53127d5c.jpg
上傳的檔名要如何讓它變成中文呢?   回复  引用    

#46楼  2006-04-04 09:52 TW [未注册用户]

@TW
原來是:
m_filePath = Path.Combine(m_path,Path.GetFileName(m_file.ClientFullPathName));
  回复  引用    

#47楼  2006-04-05 10:50 泉水 [未注册用户]

在EnableWebbUpload(false)的情况下,用以下方法m_input为null,无法上传保存。
HtmlInputFile m_input = this.FindControl("m_file") as HtmlInputFile;


改为以下方法就可以了:
foreach (Control c in Form1.Controls)
{
Response.Write(c.ToString() + "-" + c.ClientID.ToString() + "<br>");
if (c.ClientID == "fdsa")
{
HtmlInputFile m_input = (HtmlInputFile)c;
if (m_input != null)
{
m_input.PostedFile.SaveAs(Path.Combine(MapPath("."), Path.GetFileName(m_input.PostedFile.FileName)));
}
return;
}
}
Form1为表单名,fdsa为HtmlInputFile的ID,并设为服务器端控件runat=server,否则会找不到。   回复  引用    

#48楼 [楼主] 2006-04-05 15:28 Wu.Country@侠缘      

@泉水
谢谢你提供的内容。。。   回复  引用  查看    

#49楼  2006-04-05 19:53 我123 [未注册用户]

怎样才能在上传的时候可以随意拖动信息框?现在的是传大文件时间长了那个框会挡视线,要是能随意拖动,刷新后不回到屏幕中间就好了   回复  引用    

#50楼  2006-04-05 23:59 TW [未注册用户]

@我123
嗯,我也想知道,是否可以改變出現的位置,例如放在(0,0)的坐標
  回复  引用    

#51楼 [楼主] 2006-04-06 08:43 Wu.Country@侠缘      

那就不用模式对话框!修改一下组件的源代码应该可以,我最近没时间做这些。。。。
自己的项目要发布了,要修改的内容太多了。。。。。。。郁闷中...

  回复  引用  查看    

#52楼  2006-04-06 16:48 TW [未注册用户]

@Wu.Country@侠缘
請問是在下面的代碼修改的嗎?

public void RegisterProgressBar(Button uploadButton, bool causesValidation)
{
if (causesValidation)
{
uploadButton.CausesValidation = false;
uploadButton.Attributes["onclick"] = "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate();if(!Page_BlockSubmit){openProgress();}";
}
else
{
uploadButton.Attributes["onclick"] = "openProgress();";
}
UploadStatus uploadStatus = new UploadStatus();
uploadStatus.Status = UploadStatus.UploadState.Uploading;
this.m_GUID = uploadStatus.UploadGUID;
HttpContext.Current.Application[("Upload_Status_"+this.m_GUID)] = uploadStatus;
string progressUrl = "progress.ashx?UploadGUID=" + this.m_GUID;
this.m_script = this.m_script.Replace("${url}$", progressUrl);
Page page = ((Page) WebbHelper.GetContext().Handler);
page.RegisterHiddenField("Webb_Upload_GUID", this.m_GUID);
page.RegisterStartupScript("ProgressScript", this.m_script);
page.Application.Add(("Webb_Upload_GUID"), this.m_GUID);
}   回复  引用    

#53楼  2006-04-06 21:57 TW [未注册用户]

@TW
不好意思,找到位置了,如下:
window.showModelessDialog(url, window, 'status:no;help:no;resizable:no;scroll:no;dialogTop:0px;dialogleft:0px;dialogWidth:398px;dialogHeight:200px');
  回复  引用    

#54楼  2006-04-07 10:00 泉水 [未注册用户]

普通的上传可以用以下方法
System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(Request.Files[0].InputStream)

而用了大侠的组件后,无法取得Stream属性,希望UploadFile能加上一个FileStream 属性,我自己试自添加,但不成功,希望大侠能加上,辛苦了:D。   回复  引用    

#55楼  2006-04-07 16:20 我123 [未注册用户]

发现一特大问题!!!在2003的机器上上传中文文件时,进度框里显示不出中文文件名来,那块为空!英文名字就能显示出来   回复  引用    

#56楼  2006-04-08 11:14 javac [未注册用户]

请问为什么要先上传到临时目录在移动,AspnetUpload就没有这个过程?   回复  引用    

#57楼 [楼主] 2006-04-10 09:21 Wu.Country@侠缘      

必须的!
因为用户可能取消上传!
虽然程序可以自动删除取消上传的文件,但不能保证所有的异常都会使程序删除没有上传完的文件!
而在临时目录,IIS会在一定的时候自动清理这个目录,所以一但我们的删除失败也不会有太大的问题。
ASPNetUpload也有临时文件!而且它不删除临时文件,是让IIS自动删除的!(好像是,我记的不清楚了。你们可以试一下,就是上传一半后关闭IE,或者就直接关机[当然,我不得不承认这是个馊主意],看一下用户的临时目录里的文件就知道了,当然是IIS账号在Windows下的账号。)   回复  引用  查看    

#58楼  2006-04-10 14:30 Open [未注册用户]

把这个组件加到系统中,速度至少减慢一半,不知是何原因。诸位有没有同样的问题?   回复  引用    

#59楼  2006-04-12 16:55 泉水 [未注册用户]

因为我在项目里使用了大侠的组件后,所有的ASPX页面都是WebbUpload组件来上传,而其实只有一两个页面需要使用到组件,所以,没有必要默认是使用组件上传。
我的解决方式是在需要使用组件上传的页面增加一个配置文件,并把要开启组件上传的文件写到配置文件里。这种解决方式比较来说已经算简单了。

组件代码更改:
WebbUploadMoudule.cs
第一步:
-----------------------------------------------------
在WebbUpload_BeginRequest方法里面找到
HttpApplication m_application = sender as HttpApplication;
然后增加以下行:
HttpContext context = m_application.Context;

if (ReadXMLConfig(Path.GetDirectoryName(context.Request.PhysicalPath), Path.GetFileName(context.Request.AppRelativeCurrentExecutionFilePath)).ToLower() != "true")
return;
--------------------------------------------------------
第二步:增加以下方法
// 读XML文件
private string ReadXMLConfig(string strFilePath, string sKey)
{
string strFileName = "WebbUpload.config";
string strReturn = "";
if (!File.Exists(Path.Combine(strFilePath, strFileName)))
return strReturn;
XmlDocument oXmlDocument = new XmlDocument();
try
{
oXmlDocument.Load(Path.Combine(strFilePath, strFileName));
XmlNodeList oXmlNodeList = oXmlDocument.DocumentElement.ChildNodes;
foreach (XmlElement oXmlElement in oXmlNodeList)
{
if (oXmlElement.Name.ToLower() == "appsettings")
{
XmlNodeList _node = oXmlElement.ChildNodes;
if (_node.Count > 0)
{
foreach (XmlElement _el in _node)
{
if (_el.Attributes["key"].InnerXml.ToLower() == sKey.ToLower())
{
strReturn = _el.Attributes["value"].Value;
break;
}
}
}
}
}
}
catch (Exception exp)
{
//HttpContext.Current.Response.Write(exp.Message.ToString());
}
return strReturn;
}

配置文件格式如下:
WebbUpload.config
---------------------------------
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="singlefileupload.aspx" value="true"/>
<add key="MutilFilesUpload.aspx" value="true"/>
</appSettings>
</configuration>
---------------------------------
其中的值可以自己根据需要增删

说明:每个ASPX文件对应的开启配置都要放在相应的文件夹内,你也可以自己修改。   回复  引用    

#60楼  2006-04-12 16:59 泉水 [未注册用户]

如果站点统一配置文件并且缓存的话,就更好了,效率更高。   回复  引用    

#61楼 [楼主] 2006-04-12 17:17 Wu.Country@侠缘      

@泉水
谢谢你的精彩说明!!   回复  引用  查看    

#62楼  2006-04-13 16:24 泉水 [未注册用户]

呵呵,大侠也让我学到很多东西啊
另外有个地方要注意,就是不能在使用MasterPage的ASPX页面中使用组件,否则你会很郁闷总是出现null的错误,我估计这跟MasterPage的处理流程有关系,因为先处理ASPX页面,然后再转向MasterPage页面处理,所以最后处理的是MasterPage对象,而不是我们期望的那个ASPX页面对象了。   回复  引用    

#63楼  2006-04-13 22:38 study [未注册用户]

1\为什么可以上传但是进度条窗口提示"未将对象引用设置到对象的引用"?
2\另外,web.config中设置 <system.web>
<identity impersonate="true" />
... ... </system.web>该组建就不能用了
  回复  引用    

#64楼  2006-04-17 22:53 study [未注册用户]

怎么没有人帮忙解决一下?   回复  引用    

#65楼  2006-04-18 02:40 浪子风 [未注册用户]

@泉水
if (ReadXMLConfig(Path.GetDirectoryName(context.Request.PhysicalPath), Path.GetFileName(context.Request.AppRelativeCurrentExecutionFilePath)).ToLower() != "true")
return
为什么我没有AppRelativeCurrentExecutionFilePath属性   回复  引用    

#66楼  2006-04-25 13:40 我123 [未注册用户]

该组件不能在非虚拟目录下使用,就是说直接把bin放在站点根下的,不行,必须得弄个虚拟目录,不然就提示"未将对象引用设置到对象的引用"   回复  引用    

#67楼 [楼主] 2006-04-25 17:20 Wu.Country@侠缘      

兄弟们呀!!真的很报谦呀,我的项目修改内容太多了,前后50多页的修改意见。昏死了,当然,也有对这个组件的修改意见。
实在是没时间修改这个组件!我都快郁闷死了。
大家先自己改改吧,等完了手头的项目,一定好好的把这个组件整理一下。
然而我在自己的项目里一直用这个组件,也没有发现这些问题。对于大家遇到的一些问题会给我一些帮助,也让我在自己的项目里注意一下这些问题。
先谢谢大家了。   回复  引用  查看    

#68楼  2006-04-27 13:10 bhy [未注册用户]

支持中文吗?因为我的使用中有许多中文文件名   回复  引用    

#69楼  2006-04-27 20:47 bhy [未注册用户]

怎么文件传到服务器上之后都改变名字了,变得乱七八糟了,怎么不是原来的名字了。
怎么按照原来的名字保存到服务器上。   回复  引用    

#70楼  2006-04-28 10:03 bhy [未注册用户]

对于SunriseUpload的分析文章,不能访问了。老大,整理一下,让小妹学习一下。急于实现这样一个算法,可是总是报错,不懂原理呀,没法调试。谢谢了!!   回复  引用    

#71楼  2006-04-28 10:03 bhy [未注册用户]

对于SunriseUpload的分析文章,不能访问了。老大,整理一下,让小妹学习一下。急于实现这样一个算法,可是总是报错,不懂原理呀,没法调试。谢谢了!!   回复  引用    

#72楼  2006-05-10 08:25 zhujunhui [未注册用户]

为什么在本地调试的时候有进度条显示,但传到服务器上时,进度条的页面就找不到了,这是怎么回事呀?   回复  引用    

#73楼  2006-05-17 15:40 dsh [未注册用户]

请问这怎么办呀?
错误消息: 找不到文件或程序集名称“Webb.WAVE.Controls.Upload”,或找不到它的一个依赖项。
我也添加引用了,配置文件也改了,编译也通过,可就是报错!   回复  引用    

#74楼 [楼主] 2006-05-17 17:32 Wu.Country@侠缘      

可以找到:
Webb.WAVE.Controls.Upload.dll文件吗?
把它添加到项目里去。。。。。。。。。。
如果第二个项目可以通过编译,那么也应该可以运行的呀@!!!
项目之间要设定一下引用关系。。。再试试。。。。。。   回复  引用  查看    

#75楼  2006-05-17 17:47 dsh [未注册用户]

@Wu.Country@侠缘
我也把
"Webb.WAVE.Controls.Upload.dll"也拷到了我的项目bin目录下了呀,运行时报错:
错误消息: 找不到文件或程序集名称“Webb.WAVE.Controls.Upload”,或找不到它的一个依赖项。
--------------------------------------------------------------------------------
Stack Trace:
System.IO.FileN