最新评论
studentsky@163.com 大哥发个谢谢了!
楼主辛苦了 ,给我一份吧
yang.mymailbox@gmail.com
int index = Array.IndexOf(this.m_FileConId, fileControlId.ToLower()); 怎么一直提示这句值不能为空!
mengxj@yeah.net
也来晚了,谢谢了哈
博主你好,
十分佩服您的这个解决方案。
不过在使用您的.Net2.0源码中有一些问题,请博主查看一下。
问题如下:使用的.Net2.0源码,在.Net4.0工程中引用的,有稍许修改,封装为ascx控件。
上传中出错,通过跟踪,发现博主源码中引用控件的后台页代码中存在错误,源码如下:
protected void Button1_Click(object sender, EventArgs e)
{
UploadContext context = UploadContextFactory.GetUploadContext();
if ((context != null) && (context.Status == uploadStatus.Complete))
{
context.SaveFile(file1.ClientID, Request.MapPath("/myupload/"));
}
}
这里出错的原因是使用了file1.ClientID,在.Net4.0中应该使用file1.Name.不知是不是与.Net2.0的差异所致。具体跟踪细节如下》
》在UploadContext.cs中的SaveFile()函数中,第一行:
》int index = Array.IndexOf(this.m_FileConId, fileControlId.ToLower
》());
》对比this.m_FileConId的值和fileControldId的值可以发现,出现了引用错误
》根据名称,博主的原意应该是使用客户端控件的ID。然而在DataReader.cs--
》GetFileInfo()函数中,从buffer内提取的Content_Disposition中的
》lfileInfo.FileControl获取的是客户端控件的name,而不是ID。其值为“ctl00$MainContetn$uploadFile$file1”
》客户端的源代码如下:<input name="ctl00$MainContetn$uploadFile$file1"
type="file" id="ctl00_MainContent_uploadFile_File1" />
从这里和lfileInfo.FileControl的值可以看出,在服务器端从buffer中提取的FileControl是客户端空间的Name,而不是ID。
所以m_FileConId的值实际上是客户端控件的Name,所以在int index = Array.IndexOf(this.m_FileConId, fileControlId.ToLower());中就必然出现错误。
解决方法,就是在page后台cs页中的file1.ClinetId换成file1.Name.
如果原方案能够编译成功,是因为上传控件<input>的id和name恰巧都命名为相同的“file1”了,并且在后台没有使用分级命名(因为源码中的控件在根页)。后台分级命名规则:id使用“_”串联,Name使用"$"串联。
lifuyun023@163.com
是否来晚了?麻烦传给我一下。谢谢!
Re:Asp.NET大文件上传开发总结(一) 别爱上哥,哥只是个传说! 2010-05-02 23:16
[quote]Charrote:真不知你在写什么![/quote]
是因为你水平太菜了!根不知道的东西太多了
Re:Asp.NET大文件上传开发总结(一) 别爱上哥,哥只是个传说! 2010-05-02 23:15
留爪!
上传着,显示无法显示该页,如果调 式的话,可以成功!
pop520boy@163.com
是否来晚了?麻烦传给我一下。谢谢!
出现这个错误怎么解决呢?
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------
未能找到路径中的某个部分。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.IO.DirectoryNotFoundException: 未能找到路径中的某个部分。
源错误:
行 325: newPath += GetFileName(this.m_FileNames[index]);
行 326: }
行 327: File.Move(this.TmepFileDir + fileName, newPath);
行 328: return true;
行 329: }
yangq8802@163.com 谢谢了!!! 记得上附件!
忘记附上邮箱 yuer3325@gmail.com
博主真伟大,总的来说还是相当不错的
要好好学习学习
给我传一份,谢谢了
mars168@126.com
15楼的问题正是我想问的.一般人是想解决如何上传大文件,
而我是想如何理想地限制用户上传大文件.
如果用Request.Files的尺寸来判断肯定不是好办法.首先这种办法是文件已全部上传后才能判断,其次如果文件大小超过系统设定,会出现"此页无法找到"不友好提示.
参考了一下楼主及网上的资料,似乎应该通过HttpWorkerRequest.GetTotalEntityBodyLength来提前判断准备上传文件的大小.
现在最关键的是,知道大小后,如何不让文件上传或提前中止上传,并给出一个友好的提示(或跳转到一个指定页面),现在一直没能解决。
如果用httpWorkerRequest.CloseConnection()将会中断连接,用户也会收到一个非常不友好的提示。
如果用页面跳转,好象不是很成功(好象必须上文件上传结束才能执行跳转,有时根本就无法跳转)
头痛
测试发现,在上传中途退出上传,并不能自动删除临时文件"上传上下文"内
public virtual void Dispose(bool disposing)
方法内写的有错误,m_FileNames保存的是客户端文件路径并不是服务端文件路径,所以文件永远都删除不了.
能发我一份吗?
maliangnet@126.com
re: Asp.NET大文件上传开发总结(一) Charrote 2009-04-21 14:32
真不知你在写什么!
@tester111
Begin_Request事件里,不知在Respon.End()后用Respon.Flash()可不可以,不过,我认为可以在进度界面,提示用户文件过大,然后用脚本取消IE提交文件(我初步想可以用后退的办法取消提交)
楼主,您好!
请问一下:
如果我对上传的文件大小有限制,比如说最大允许上传1GB的大文件。那么该如何在读取完整个文件的内容之前,先进行判断?如果超过1GB,则不读取该文件的内容,并且在页面上输入文件太大的提示信息。这样可以避免他人上传10GB的超大文件呵!
在IHttpModule的Begin_Request事件方法里,可以通过
httpApplication.Request.ContentLenght 来获得客户端请求的正文长度,如果设定ContentLength > 1024 * 1024 * 1024 时就终止页面的执行(即不读取该文件的内容),并向客户端输出文件太大的信息,该如何做呢?
我执行了httpApplication.Response.End(); 但不行,文件仍在读取上传。
用Reflector查看Respon.End()方法如下:
----------------------------------------------
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
------------------------------
似乎在Begin_Request里,this._context.IsInCancellablePeriod == false。
这样好像要执行CompleteRequest()方法。
=========================================
如果我执行httpWorkerRequest.CloseConnection(); 则可以终止页面的上传,但因为是关闭了客户端的连接,这样就无法向客户端输出文件太大的提示信息了,IE会显示无法显示该页,这样的用户体验又很不好!
请问有没有办法,在Begin_Request事件里,向客户端输出信息同时又终止程序的执行呢?
有源代码吗. 我最近要在一个项目上用到了. 望楼主发一份了
谢谢了
写得真不错!
弱弱地问一下: 楼主,您这个组件可以一次性上传多个附件吗? 也就是说在一个Form里,有多个UploadFile控件时,可以支持吗?
!!!我也急需一份~谢谢,ioas2008@gmail.com
找不到.net2.0源码!!!!!望楼主发1份 谢谢
我也有需要,谢谢给我一份。devilzone@163.com
非常感谢您,我需要。
bingw001@sina.com.cn
我在使用时,有时能正常上传,有时会出现“无法找到该页”,查看服务器的应用程序日志,发现有警告信息,asp.net 2.0 post请求超出范围,到临时文件夹下看文件大约传到20M左右就会出现此情况,不知什么,请高人指点!
我的服务配置是win2003+iis6.0
首先赞叹随喜师兄,把这么好的文章供养给大家,真是功德无量,末学有一个疑问,希望能得到师兄的解答?
在UploadContext.cs中
internal UploadContext(System.Web.UI.Page page, string TempFileDir)
{
m_TempFileDir = TempFileDir;
if (m_TempFileDir.Trim()[m_TempFileDir.Trim().Length - 1] != '\\')
{
m_TempFileDir = m_TempFileDir.Trim() + "\\";
}
m_GUID = Guid.NewGuid().ToString();
page.ClientScript.RegisterHiddenField("UploadID", m_GUID);
page.Response.Expires = 1;
m_status = uploadStatus.Initializing;
}
不知道你这段代码中的page.Response.Expires = 1;设置缓存为1分钟有什么用途?
如果设置缓存为一分钟,那么在一分钟之内的不同用户都在上传文件,岂不是都是相同的GUID?
gigilovestom@163.com
非常赞叹师兄,功德无量,向你看齐。
re: 一次死锁情况分析过程 amingo 2008-11-03 15:21
--引用--------------------------------------------------
Cheney Shue: 你用的什么数据库啊,居然还会发生死锁的情况,碰到死锁的概率应该几乎为0
--------------------------------------------------------
菜鸟