klete

I am so emptiness

博客园 首页 新随笔 联系 订阅 管理
http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx

我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为ASP.NET会block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到Internet Explorer显示 "The page cannot be displayed - Cannot find server or DNS Error",好像是怎么也catch不了这个错误。为什么?因为这是个client side错误,server side端的Application_Error是处理不到的,可以参考这个帖子研究一下产生这个错误的机理。

handling server error when upload file too large

解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据

  IServiceProvider provider = (IServiceProvider) HttpContext.Current;
  HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));
  byte[] bs = wr.GetPreloadedEntityBody();
  ....
  if (!wr.IsEntireEntityBodyIsPreloaded())
  {
        int n = 1024;
        byte[] bs2 = new byte[n];
        while (wr.ReadEntityBody(bs2,n) >0)
       {
             .....
        }
  }

Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度:

ASP.NET Upload Magic Part 2

这里有他讲座的PPT文件:

Uploading with ASP.NET (part 1)

Uploading with ASP.NET (part 2)

  Tuesday, March 16, 2004 1:09 AM

 

反馈

# 回复: 用ASP.NET上传大文件 3/16/2004 5:32 AM lonelystranger
Nice solution!

# 回复: 用ASP.NET上传大文件 3/16/2004 8:00 AM minbear
good, thanks for your sharing.

# 回复: 用ASP.NET上传大文件 3/16/2004 8:19 AM ghj1976
超酷。

很多人都有这样的问题。



# 回复: 用ASP.NET上传大文件 3/16/2004 8:21 AM Webdiyer
谢谢!

# 回复: 用ASP.NET上传大文件 3/16/2004 8:35 AM minbear
参考的那个帖子链接好像有问题

即:handling server error when upload file too large

# 好办法啊~~ 3/16/2004 8:46 AM icefox
好!

# 回复: 用ASP.NET上传大文件 3/16/2004 9:33 AM moslem
有用,多谢了 ...

# 回复: 用ASP.NET上传大文件 3/16/2004 11:50 AM ceocio
good

# 回复: 用ASP.NET上传大文件 3/16/2004 1:34 PM nice90
God, I think you are god in my eyes.

# 回复: 用ASP.NET上传大文件 3/16/2004 2:15 PM 张科峰
学了不少

# 回复: 用ASP.NET上传大文件 3/16/2004 3:12 PM peczar
很想在vs2002中使用,但是总是报错

# 回复: 用ASP.NET上传大文件 3/16/2004 3:28 PM 啊费
我下载了他的程序,但不能运行,自己设计一个程序,并引用Krystalware.HttpUploadManager.dll,却也报错说找不到程序集,请教该怎样实现


# 回复: 用ASP.NET上传大文件 3/16/2004 3:42 PM 天下
看了一下,发现对于上传的文件名是中文的情况下有问题。
唉,老外经常不懂编码,什么UTF-8啊,Encoding啊,统统忽略。

把Multipartparser.cs改了一下。


//修改构造函数,增加contentEncoding参数
public MultipartParser(Stream s, string boundary, int contentLength, System.Text.Encoding contentEncoding)


//添加新函数,解决Header中的编码问题
protected string ReadHeaderLine(Stream s)
{
// TODO: chunk
const byte cr = (byte)'\r';
const byte cn = (byte)'\n';
byte[] tempValues = new byte[2048];
int ii=0;
byte current = (byte)s.ReadByte();
while (current != cr && current != cn)
{
ii++;
tempValues[ii-1]=current;
current = (byte)s.ReadByte();
}

if (current == cr)
s.ReadByte();
byte[] newValues = new byte[ii];
Array.Copy(tempValues,newValues,(long)(ii));
return _contentEncoding.GetString(newValues);
}


//将调用ReadLine的地方修改成ReadHeaderLine
protected NameValueCollection ReadHeaders()
{
NameValueCollection headers = new NameValueCollection();

//string line = ReadLine(_s);
string line = ReadHeaderLine(_s);

// TODO: Handle continuations - lines starting with whitespace
while (line.Length > 0)
{
int pos = line.IndexOf(':');

headers[line.Substring(0, pos)] = line.Substring(pos + 1);

//line = ReadLine(_s);
line = ReadHeaderLine(_s);
}

return headers;
}

HttpUploadModule.cs中的context_BeginRequest方法中在创建MultipartParser对象的地方增加context.Request.ContentEncoding参数:

MultipartParser parser = new MultipartParser(new RequestStream(worker), boundary, context.Request.ContentLength, context.Request.ContentEncoding);



这样修改也不一定正确,主要没有仔细研究HTTP协议中究竟哪些地方需要做Encoding的处理。

# 回复: 用ASP.NET上传大文件 3/16/2004 3:43 PM 天下
补充
_contentEncoding就是把
public MultipartParser(Stream s, string boundary, int contentLength, System.Text.Encoding contentEncoding) 的contentEncoding参数保存下来

# 回复: 用ASP.NET上传大文件 3/16/2004 4:48 PM 阿费
请教楼上的 天下 大侠 ,怎么引用Microsoft.ApplicationBlocks.ExceptionManagement。

# 回复: 用ASP.NET上传大文件 3/16/2004 5:09 PM 天下
呵呵,好多方法
1)把UploadSpike.zip中相应的dll拷贝出来直接引用就好
2)ApplicationBlock URL:http://msdn.microsoft.com/library/en-us/dnbda/html/emab-rm.asp?frame=true
3)把相应代码删了也行,虽然不那么规范:)

# 回复: 用ASP.NET上传大文件 3/16/2004 5:11 PM 开心就好
天下兄还是多写些技术文章吧,以你那么强的技术实力,肯定会引来万人空巷的:)

# 回复: 用ASP.NET上传大文件 3/16/2004 5:35 PM 阿费
就是不让通过!!
在运行时出现如下错误,如果把web.config中相应的语句删除,上传文件无效,为什么?请教!!!
分析器错误信息: 找不到文件或程序集名称“Krystalware.HttpUploadManager”,或找不到它的一个依赖项。

源错误:


行 15:
行 16: <httpModules>
行 17: <add name="HttpUploadModule"
行 18: type="Krystalware.HttpUploadManager.HttpUploadModule, Krystalware.HttpUploadManager" />
行 19: </httpModules>



# 回复: 用ASP.NET上传大文件 3/16/2004 7:45 PM 白天
Krystalware应该是visual stadio组件吧,想请教如何在 .net中应用,直接引用它的.dll吗?好像不行。

# 回复: 用ASP.NET上传大文件 3/17/2004 12:22 PM 天下
直接引用就可以了,UploadSpike.zip中有
HttpUploadManager.zip就是Krystalware.HttpUploadManager,引用工程也可以

# 回复: 用ASP.NET上传大文件 3/20/2004 3:05 PM jiangyu
我测试了一下,为什么上传文件的时候,还差一部分的时候,他就在也传不上去了,大约是类似的数据形式。

Progress: 106496 / 108528



# 回复: 用ASP.NET上传大文件 4/1/2004 9:05 PM pmechina
我也有同样的问题,不知道为什么

# 回复: 用ASP.NET上传大文件 4/2/2004 10:54 AM ming
请问那位高手知道
HttpUploadModule.GetParts(Application, uploadId)
中的upLoadId 是个什么东东啊?



# 回复: 用ASP.NET上传大文件 4/4/2004 2:32 PM xing
“我测试了一下,为什么上传文件的时候,还差一部分的时候,他就在也传不上去了,大约是类似的数据形式”

我也发现同样问题,研究了一下发现:进度虽然显示还没有完,但实际上已经上传完毕了,可能代码中对于完成的判断有误。请“天下”帮忙

# 回复: 用ASP.NET上传大文件 4/6/2004 9:58 AM hstod
请问在什么地方下载这段代码,带进度显示我找了好久了

# 回复: 用ASP.NET上传大文件 4/9/2004 10:32 AM 陈叙远
我看了一下,这种方法总的来说应该算是伎俩,每隔100ms提交一下,使得性能极其低下,大家找个几M的文件试用一下就知道了,这样的东西,虽然可以提交大文件,但用户要等多久?

# 回复: 用ASP.NET上传大文件 4/10/2004 7:36 PM rudy
感谢天下,你解决我的大问题----上传中文.

# 回复: 用ASP.NET上传大文件 4/12/2004 5:32 PM bingfeng
Microsoft.ApplicationBlocks.ExceptionManagement
找不到此名称空间,在那里引用啊?


# 回复: 用ASP.NET上传大文件 4/14/2004 3:07 PM zhyx
看了其中的代码 问个问题
请各位大哥给我讲讲

IHttpModule
HttpWorkerRequest
HttpApplicationState
IServiceProvider
application

这几个东西 到底是怎么回事
看了msdn 没看得很明白。



# 回复: 用ASP.NET上传大文件 4/20/2004 3:22 PM shifan
思归老大,麻烦你帮忙看看CSDN我的帖子:
http://expert.csdn.net/Expert/topic/2987/2987701.xml?temp=.2268335

# 回复: 用ASP.NET上传大文件 4/20/2004 4:22 PM 孟子E章
Good,老大

# 回复: 用ASP.NET上传大文件 4/22/2004 5:36 PM 锦州浪子
思归,天下...
俺问两个问题:
1.已传文件大小和文件总大小是从哪个页面传到Progress.aspx的
2.上传过程中,如果停止上传的话,CPU占用24%,如果重复这样操作几次,CPU占用100%。如何解决?
谢谢!!!

# 回复: 用ASP.NET上传大文件 4/27/2004 10:17 PM 中外结合
按照天下的改法,出现错误:
找不到类型或命名空间名称“_contentEncoding”(是否缺少 using 指令或程序集引用?)


# 回复: 用ASP.NET上传大文件 4/29/2004 6:07 PM 中外结合
为什么没人回答?

# re: HttpUploadModule v2.01 5/6/2004 6:38 PM programcsharp [technical]


# 回复: 用ASP.NET上传大文件 5/9/2004 5:05 PM 天下(假的)
天下:
按你的方法改过后中文文件名仍是乱码。
能不能继续修改一下。

# 回复: 用ASP.NET上传大文件 5/18/2004 8:51 AM lxcc
很好!感谢!

# 回复: 用ASP.NET上传大文件 5/18/2004 8:58 AM dsfa
fsda

# 回复: 用ASP.NET上传大文件 5/18/2004 2:51 PM yefengwz
好复杂,看不明白,,,郁闷ing……

# 回复: 用ASP.NET上传大文件 5/24/2004 4:01 PM KornShell
问题:我试了一下那个demo!为啥上传200M的rm文件到最后一点点的时候就报错?说文件太大!可是发现在D:/filemanager/temp/里面有刚刚上传的文件(可以用),也就是说文件上传完了,但是D:/filemanager/root/里面就没有这个文件了?

# 回复: 用ASP.NET上传大文件 5/27/2004 9:50 AM 4t5e
shi hao ya

# 回复: 用ASP.NET上传大文件 5/27/2004 12:47 PM ocean
为什么我总是获取不到正确的进度,好像一开始获取的进度就已经和文件的大小差不多了,然后进度的字节数一直都没有变化,这是怎么回事?还望指教

# HttpUploadManager module chinese file name apply 5/28/2004 3:46 PM kanshen
##############################
##This is update by sunny shen in 2004 05 28 in japan
## sunny@aiaso.gr.jp
##############################


MimeUploadHandler.cs

protected Encoding ContentEncoding; // add

public MimeUploadHandler(Stream s, byte[] boundary, string uploadId,Encoding contentEncoding)
{
_s = s;
_boundary = boundary;
_uploadStatus = new UploadStatus(ContentLength, uploadId);
_ContentEncoding=contentEncoding; //add
}

public void Parse()
{
......

MimePushReader reader = new MimePushReader(_s, _boundary, this,contentEncoding);

...}

============================================

MimePushReader.cs

Encoding ContentEncoding; //add

public void Parse()
{
.........
MimeHeaderReader headerReader = new MimeHeaderReader(ContentEncoding);
.........
}
=========================================
MimeHeaderReader.cs

Encoding ContentEncoding;

public MimeHeaderReader(Encoding contentEncoding)
{
ContentEncoding=contentEncoding;//add
Reset();
}

public int Read(byte[] buffer, int position)
{
....
headers.Append(ContentEncoding.GetString(buffer, position, read)); // edit
....
}

###################################
##I had chanded this source to VB.net
###################################




# 回复: 用ASP.NET上传大文件 5/29/2004 3:58 PM ocean
当上传了一般的时候点击了浏览器的停止按钮,这是服务器上的cpu使用率就成了100%了,而且一直降不下来,重启iis才能够正常,不知道怎么解决这种文件上传了一半被中断后的问题。

# 没有必要这么复杂 6/4/2004 2:04 PM Lancelot
asp.net中有html控件file field可以上传文件,默认大小是4096,只要修改web.config中的设置就可以了,这样设置<system.web> <httpRuntime executionTimeout="1000" maxRequestLength="409600" useFullyQualifiedRedirectUrl="false"/> </system.web>

这样300<MKde的文件也没有问题,



# 回复: 用ASP.NET上传大文件 6/6/2004 5:00 AM Delphi.net
kanshen ,这里怎么做改动?
【HttpUploadModule.cs】
MimeUploadHandler handler = new MimeUploadHandler(new RequestStream(worker), boundary, uploadId);

# 回复: 用ASP.NET上传大文件 6/16/2004 9:55 PM bestcomy
讨论得好热烈,我因为不满internet上提供的解决方案,自己做了一个,走过路过的都可以试试。
我发现的解决方案大多破坏页面逻辑,总是要提交到另外一个页面,另外大部分不支持中文文件名,包括我找到的一个abcupload破解竟然也不支持中文文件名。
我的方案解决了这些问题,目前是测试版本,正在不断的完善中
http://bestcomy.europe.webmatrixhosting.net

# 回复: 用ASP.NET上传大文件 6/23/2004 10:37 AM iyond
希望大家能讨论一下怎么解决文件上传到一半时用户关闭了上传窗口,服务器的w3wp.exe进程就死了,CPU占用率100%。如果无法解决的话,这个组件就没有用处了

# 回复: 用ASP.NET上传大文件 6/23/2004 2:17 PM 寂寞阳光
为什么每次执行while( wr.ReadEntityBody(bs2,n) > 0);的时候,都读不取数据?并且在大文件上传的时候,在开始总要在客户端停留好长的时间,看起来也像把数据全部读取后再上传似的?哪位仁兄告诉我?不胜感激!

# 回复: 用ASP.NET上传大文件 6/24/2004 12:14 AM goodbaby
天下兄的_contentEncoding这个变量在ReadHeaderLine()未见声明,这个变量是不是应该是类的变量。也不明白_contentEncoding怎么保存了MultipartParser的contentEncoding。请解释一下。

# 回复: 用ASP.NET上传大文件 7/18/2004 10:43 AM kerrysu
如何读取远程FTP文本文件的内容(不是下载文件)?

# re: 用ASP.NET上传大文件 7/22/2004 4:34 PM lanhoo
有无VB的啊!

# re: 用ASP.NET上传大文件 7/28/2004 4:42 PM Omega
不行啊,为什么少了一点数据?好像在头部。而且很慢啊。1M都要几十秒。

# re: 用ASP.NET上传大文件 7/28/2004 4:44 PM Omega
最好楼主能给出更详细的代码,感激涕零!!

# re: 用ASP.NET上传大文件 7/30/2004 4:04 PM 河外
看上到面好多兄弟讨论代码的,我怎么下不到代码?

# 其实不用这么麻烦!!!!!!!!!! 8/4/2004 2:05 PM lamputa
搞来搞去,搞了我N多时间!!!!
只要照下面的做就一切OK了!


 1)、客户端表单的编码类型Enctype 设置为multipart/form-data的MIME格式,提交表单使用Http的post方法,象下面这样:

<form id="form1" method="post" enctype="multipart/form-data/form-data"
runat="server" >

  2)、HttpInputFile控件运行在服务器端,设置runat=server,type=file ,象下面这样:

<INPUT id="fileUp" type="file" size="6" runat="server">

  3)、要上传多个文件,你可以布置多个HttpInputFile控件,然后使用HttpRequest.Files来获取这些文件。

  5、环境配置文件Web.config的处理:

  在中文状态下,你可能需要将全球化设置编码由默认的"Utf-8"改为"gb2312",语句如下:

<globalization
requestEncoding="gb2312"
responseEncoding="gb2312"
/>

  同时,Web.config默认设置的的文件大小限制可能并不能满足你的需要,你或许需要将限制尺度放大一些。这通过修改参数maxRequestLength的值来实现,如下所示:

<!-- 设置可接受的最大字节数 -->
<httpRuntime maxRequestLength="500000">
</httpRuntime>

# re: 用ASP.NET上传大文件 8/13/2004 10:40 AM upload
请问要调试这个组件最低是什么配置呢

# re: 用ASP.NET上传大文件 8/23/2004 3:38 PM <script>
123

# re: 用ASP.NET上传大文件 9/26/2004 2:58 AM ceci
谢谢分享:)

# re: 用ASP.NET上传大文件 10/1/2004 11:53 PM feng
不能支持中文名呀,怎么办呢?

# re: 用ASP.NET上传大文件 10/3/2004 11:47 AM feng
在哪个地方设置,才能真正地控制上传的文件的限制呢?
如果直接在upload.aspx中控制,还是会让文件上传后再来判断.

# re: 用ASP.NET上传大文件 10/9/2004 10:36 AM ikis
好像上传失败后不能删除临时文件,而且Application会不会越来越大?

# re: 用ASP.NET上传大文件 10/17/2004 9:42 PM ymm
我一个一个看过来,有位朋友说中途停止上传,cup 100%不释放,大家还讨论什么啊.这个问题解决不了.这个技术就一点价值都没有.确实如此啊.

# re: 用ASP.NET上传大文件 10/22/2004 10:36 AM 逆风飞扬
晕!!!!

# re: 用ASP.NET上传大文件 11/7/2004 5:47 PM tiger
你们说得太深了,我只想知道简单的问题:

我在做文件提交后,其它的输入字段的内容被清空了??为什么??我该怎么办呀??







关注这个网址
# 回复: 用ASP.NET上传大文件 3/16/2004 5:32 AM lonelystranger
Nice solution!

# 回复: 用ASP.NET上传大文件 3/16/2004 8:00 AM minbear
good, thanks for your sharing.

# 回复: 用ASP.NET上传大文件 3/16/2004 8:19 AM ghj1976
超酷。

很多人都有这样的问题。



# 回复: 用ASP.NET上传大文件 3/16/2004 8:21 AM Webdiyer
谢谢!

# 回复: 用ASP.NET上传大文件 3/16/2004 8:35 AM minbear
参考的那个帖子链接好像有问题

即:handling server error when upload file too large

# 好办法啊~~ 3/16/2004 8:46 AM icefox
好!

# 回复: 用ASP.NET上传大文件 3/16/2004 9:33 AM moslem
有用,多谢了 ...

# 回复: 用ASP.NET上传大文件 3/16/2004 11:50 AM ceocio
good

# 回复: 用ASP.NET上传大文件 3/16/2004 1:34 PM nice90
God, I think you are god in my eyes.

# 回复: 用ASP.NET上传大文件 3/16/2004 2:15 PM 张科峰
学了不少

# 回复: 用ASP.NET上传大文件 3/16/2004 3:12 PM peczar
很想在vs2002中使用,但是总是报错

# 回复: 用ASP.NET上传大文件 3/16/2004 3:28 PM 啊费
我下载了他的程序,但不能运行,自己设计一个程序,并引用Krystalware.HttpUploadManager.dll,却也报错说找不到程序集,请教该怎样实现


# 回复: 用ASP.NET上传大文件 3/16/2004 3:42 PM 天下
看了一下,发现对于上传的文件名是中文的情况下有问题。
唉,老外经常不懂编码,什么UTF-8啊,Encoding啊,统统忽略。

把Multipartparser.cs改了一下。


//修改构造函数,增加contentEncoding参数
public MultipartParser(Stream s, string boundary, int contentLength, System.Text.Encoding contentEncoding)


//添加新函数,解决Header中的编码问题
protected string ReadHeaderLine(Stream s)
{
// TODO: chunk
const byte cr = (byte)'\r';
const byte cn = (byte)'\n';
byte[] tempValues = new byte[2048];
int ii=0;
byte current = (byte)s.ReadByte();
while (current != cr && current != cn)
{
ii++;
tempValues[ii-1]=current;
current = (byte)s.ReadByte();
}

if (current == cr)
s.ReadByte();
byte[] newValues = new byte[ii];
Array.Copy(tempValues,newValues,(long)(ii));
return _contentEncoding.GetString(newValues);
}


//将调用ReadLine的地方修改成ReadHeaderLine
protected NameValueCollection ReadHeaders()
{
NameValueCollection headers = new NameValueCollection();

//string line = ReadLine(_s);
string line = ReadHeaderLine(_s);

// TODO: Handle continuations - lines starting with whitespace
while (line.Length > 0)
{
int pos = line.IndexOf(':');

headers[line.Substring(0, pos)] = line.Substring(pos + 1);

//line = ReadLine(_s);
line = ReadHeaderLine(_s);
}

return headers;
}

HttpUploadModule.cs中的context_BeginRequest方法中在创建MultipartParser对象的地方增加context.Request.ContentEncoding参数:

MultipartParser parser = new MultipartParser(new RequestStream(worker), boundary, context.Request.ContentLength, context.Request.ContentEncoding);



这样修改也不一定正确,主要没有仔细研究HTTP协议中究竟哪些地方需要做Encoding的处理。

# 回复: 用ASP.NET上传大文件 3/16/2004 3:43 PM 天下
补充
_contentEncoding就是把
public MultipartParser(Stream s, string boundary, int contentLength, System.Text.Encoding contentEncoding) 的contentEncoding参数保存下来

# 回复: 用ASP.NET上传大文件 3/16/2004 4:48 PM 阿费
请教楼上的 天下 大侠 ,怎么引用Microsoft.ApplicationBlocks.ExceptionManagement。

# 回复: 用ASP.NET上传大文件 3/16/2004 5:09 PM 天下
呵呵,好多方法
1)把UploadSpike.zip中相应的dll拷贝出来直接引用就好
2)ApplicationBlock URL:http://msdn.microsoft.com/library/en-us/dnbda/html/emab-rm.asp?frame=true
3)把相应代码删了也行,虽然不那么规范:)

# 回复: 用ASP.NET上传大文件 3/16/2004 5:11 PM 开心就好
天下兄还是多写些技术文章吧,以你那么强的技术实力,肯定会引来万人空巷的:)

# 回复: 用ASP.NET上传大文件 3/16/2004 5:35 PM 阿费
就是不让通过!!
在运行时出现如下错误,如果把web.config中相应的语句删除,上传文件无效,为什么?请教!!!
分析器错误信息: 找不到文件或程序集名称“Krystalware.HttpUploadManager”,或找不到它的一个依赖项。

源错误:


行 15:
行 16: <httpModules>
行 17: <add name="HttpUploadModule"
行 18: type="Krystalware.HttpUploadManager.HttpUploadModule, Krystalware.HttpUploadManager" />
行 19: </httpModules>



# 回复: 用ASP.NET上传大文件 3/16/2004 7:45 PM 白天
Krystalware应该是visual stadio组件吧,想请教如何在 .net中应用,直接引用它的.dll吗?好像不行。

# 回复: 用ASP.NET上传大文件 3/17/2004 12:22 PM 天下
直接引用就可以了,UploadSpike.zip中有
HttpUploadManager.zip就是Krystalware.HttpUploadManager,引用工程也可以

# 回复: 用ASP.NET上传大文件 3/20/2004 3:05 PM jiangyu
我测试了一下,为什么上传文件的时候,还差一部分的时候,他就在也传不上去了,大约是类似的数据形式。

Progress: 106496 / 108528



# 回复: 用ASP.NET上传大文件 4/1/2004 9:05 PM pmechina
我也有同样的问题,不知道为什么

# 回复: 用ASP.NET上传大文件 4/2/2004 10:54 AM ming
请问那位高手知道
HttpUploadModule.GetParts(Application, uploadId)
中的upLoadId 是个什么东东啊?



# 回复: 用ASP.NET上传大文件 4/4/2004 2:32 PM xing
“我测试了一下,为什么上传文件的时候,还差一部分的时候,他就在也传不上去了,大约是类似的数据形式”

我也发现同样问题,研究了一下发现:进度虽然显示还没有完,但实际上已经上传完毕了,可能代码中对于完成的判断有误。请“天下”帮忙

# 回复: 用ASP.NET上传大文件 4/6/2004 9:58 AM hstod
请问在什么地方下载这段代码,带进度显示我找了好久了

# 回复: 用ASP.NET上传大文件 4/9/2004 10:32 AM 陈叙远
我看了一下,这种方法总的来说应该算是伎俩,每隔100ms提交一下,使得性能极其低下,大家找个几M的文件试用一下就知道了,这样的东西,虽然可以提交大文件,但用户要等多久?

# 回复: 用ASP.NET上传大文件 4/10/2004 7:36 PM rudy
感谢天下,你解决我的大问题----上传中文.

# 回复: 用ASP.NET上传大文件 4/12/2004 5:32 PM bingfeng
Microsoft.ApplicationBlocks.ExceptionManagement
找不到此名称空间,在那里引用啊?


# 回复: 用ASP.NET上传大文件 4/14/2004 3:07 PM zhyx
看了其中的代码 问个问题
请各位大哥给我讲讲

IHttpModule
HttpWorkerRequest
HttpApplicationState
IServiceProvider
application

这几个东西 到底是怎么回事
看了msdn 没看得很明白。



# 回复: 用ASP.NET上传大文件 4/20/2004 3:22 PM shifan
思归老大,麻烦你帮忙看看CSDN我的帖子:
http://expert.csdn.net/Expert/topic/2987/2987701.xml?temp=.2268335

# 回复: 用ASP.NET上传大文件 4/20/2004 4:22 PM 孟子E章
Good,老大

# 回复: 用ASP.NET上传大文件 4/22/2004 5:36 PM 锦州浪子
思归,天下...
俺问两个问题:
1.已传文件大小和文件总大小是从哪个页面传到Progress.aspx的
2.上传过程中,如果停止上传的话,CPU占用24%,如果重复这样操作几次,CPU占用100%。如何解决?
谢谢!!!

# 回复: 用ASP.NET上传大文件 4/27/2004 10:17 PM 中外结合
按照天下的改法,出现错误:
找不到类型或命名空间名称“_contentEncoding”(是否缺少 using 指令或程序集引用?)


# 回复: 用ASP.NET上传大文件 4/29/2004 6:07 PM 中外结合
为什么没人回答?

# re: HttpUploadModule v2.01 5/6/2004 6:38 PM programcsharp [technical]


# 回复: 用ASP.NET上传大文件 5/9/2004 5:05 PM 天下(假的)
天下:
按你的方法改过后中文文件名仍是乱码。
能不能继续修改一下。

# 回复: 用ASP.NET上传大文件 5/18/2004 8:51 AM lxcc
很好!感谢!

# 回复: 用ASP.NET上传大文件 5/18/2004 8:58 AM dsfa
fsda

# 回复: 用ASP.NET上传大文件 5/18/2004 2:51 PM yefengwz
好复杂,看不明白,,,郁闷ing……

# 回复: 用ASP.NET上传大文件 5/24/2004 4:01 PM KornShell
问题:我试了一下那个demo!为啥上传200M的rm文件到最后一点点的时候就报错?说文件太大!可是发现在D:/filemanager/temp/里面有刚刚上传的文件(可以用),也就是说文件上传完了,但是D:/filemanager/root/里面就没有这个文件了?

# 回复: 用ASP.NET上传大文件 5/27/2004 9:50 AM 4t5e
shi hao ya

# 回复: 用ASP.NET上传大文件 5/27/2004 12:47 PM ocean
为什么我总是获取不到正确的进度,好像一开始获取的进度就已经和文件的大小差不多了,然后进度的字节数一直都没有变化,这是怎么回事?还望指教

# HttpUploadManager module chinese file name apply 5/28/2004 3:46 PM kanshen
##############################
##This is update by sunny shen in 2004 05 28 in japan
## sunny@aiaso.gr.jp
##############################


MimeUploadHandler.cs

protected Encoding ContentEncoding; // add

public MimeUploadHandler(Stream s, byte[] boundary, string uploadId,Encoding contentEncoding)
{
_s = s;
_boundary = boundary;
_uploadStatus = new UploadStatus(ContentLength, uploadId);
_ContentEncoding=contentEncoding; //add
}

public void Parse()
{
......

MimePushReader reader = new MimePushReader(_s, _boundary, this,contentEncoding);

...}

============================================

MimePushReader.cs

Encoding ContentEncoding; //add

public void Parse()
{
.........
MimeHeaderReader headerReader = new MimeHeaderReader(ContentEncoding);
.........
}
=========================================
MimeHeaderReader.cs

Encoding ContentEncoding;

public MimeHeaderReader(Encoding contentEncoding)
{
ContentEncoding=contentEncoding;//add
Reset();
}

public int Read(byte[] buffer, int position)
{
....
headers.Append(ContentEncoding.GetString(buffer, position, read)); // edit
....
}

###################################
##I had chanded this source to VB.net
###################################




# 回复: 用ASP.NET上传大文件 5/29/2004 3:58 PM ocean
当上传了一般的时候点击了浏览器的停止按钮,这是服务器上的cpu使用率就成了100%了,而且一直降不下来,重启iis才能够正常,不知道怎么解决这种文件上传了一半被中断后的问题。

# 没有必要这么复杂 6/4/2004 2:04 PM Lancelot
asp.net中有html控件file field可以上传文件,默认大小是4096,只要修改web.config中的设置就可以了,这样设置<system.web> <httpRuntime executionTimeout="1000" maxRequestLength="409600" useFullyQualifiedRedirectUrl="false"/> </system.web>

这样300<MKde的文件也没有问题,



# 回复: 用ASP.NET上传大文件 6/6/2004 5:00 AM Delphi.net
kanshen ,这里怎么做改动?
【HttpUploadModule.cs】
MimeUploadHandler handler = new MimeUploadHandler(new RequestStream(worker), boundary, uploadId);

# 回复: 用ASP.NET上传大文件 6/16/2004 9:55 PM bestcomy
讨论得好热烈,我因为不满internet上提供的解决方案,自己做了一个,走过路过的都可以试试。
我发现的解决方案大多破坏页面逻辑,总是要提交到另外一个页面,另外大部分不支持中文文件名,包括我找到的一个abcupload破解竟然也不支持中文文件名。
我的方案解决了这些问题,目前是测试版本,正在不断的完善中
http://bestcomy.europe.webmatrixhosting.net

# 回复: 用ASP.NET上传大文件 6/23/2004 10:37 AM iyond
希望大家能讨论一下怎么解决文件上传到一半时用户关闭了上传窗口,服务器的w3wp.exe进程就死了,CPU占用率100%。如果无法解决的话,这个组件就没有用处了

# 回复: 用ASP.NET上传大文件 6/23/2004 2:17 PM 寂寞阳光
为什么每次执行while( wr.ReadEntityBody(bs2,n) > 0);的时候,都读不取数据?并且在大文件上传的时候,在开始总要在客户端停留好长的时间,看起来也像把数据全部读取后再上传似的?哪位仁兄告诉我?不胜感激!

# 回复: 用ASP.NET上传大文件 6/24/2004 12:14 AM goodbaby
天下兄的_contentEncoding这个变量在ReadHeaderLine()未见声明,这个变量是不是应该是类的变量。也不明白_contentEncoding怎么保存了MultipartParser的contentEncoding。请解释一下。

# 回复: 用ASP.NET上传大文件 7/18/2004 10:43 AM kerrysu
如何读取远程FTP文本文件的内容(不是下载文件)?

# re: 用ASP.NET上传大文件 7/22/2004 4:34 PM lanhoo
有无VB的啊!

# re: 用ASP.NET上传大文件 7/28/2004 4:42 PM Omega
不行啊,为什么少了一点数据?好像在头部。而且很慢啊。1M都要几十秒。

# re: 用ASP.NET上传大文件 7/28/2004 4:44 PM Omega
最好楼主能给出更详细的代码,感激涕零!!

# re: 用ASP.NET上传大文件 7/30/2004 4:04 PM 河外
看上到面好多兄弟讨论代码的,我怎么下不到代码?

# 其实不用这么麻烦!!!!!!!!!! 8/4/2004 2:05 PM lamputa
搞来搞去,搞了我N多时间!!!!
只要照下面的做就一切OK了!


 1)、客户端表单的编码类型Enctype 设置为multipart/form-data的MIME格式,提交表单使用Http的post方法,象下面这样:

<form id="form1" method="post" enctype="multipart/form-data/form-data"
runat="server" >

  2)、HttpInputFile控件运行在服务器端,设置runat=server,type=file ,象下面这样:

<INPUT id="fileUp" type="file" size="6" runat="server">

  3)、要上传多个文件,你可以布置多个HttpInputFile控件,然后使用HttpRequest.Files来获取这些文件。

  5、环境配置文件Web.config的处理:

  在中文状态下,你可能需要将全球化设置编码由默认的"Utf-8"改为"gb2312",语句如下:

<globalization
requestEncoding="gb2312"
responseEncoding="gb2312"
/>

  同时,Web.config默认设置的的文件大小限制可能并不能满足你的需要,你或许需要将限制尺度放大一些。这通过修改参数maxRequestLength的值来实现,如下所示:

<!-- 设置可接受的最大字节数 -->
<httpRuntime maxRequestLength="500000">
</httpRuntime>

# re: 用ASP.NET上传大文件 8/13/2004 10:40 AM upload
请问要调试这个组件最低是什么配置呢

# re: 用ASP.NET上传大文件 8/23/2004 3:38 PM <script>
123

# re: 用ASP.NET上传大文件 9/26/2004 2:58 AM ceci
谢谢分享:)

# re: 用ASP.NET上传大文件 10/1/2004 11:53 PM feng
不能支持中文名呀,怎么办呢?

# re: 用ASP.NET上传大文件 10/3/2004 11:47 AM feng
在哪个地方设置,才能真正地控制上传的文件的限制呢?
如果直接在upload.aspx中控制,还是会让文件上传后再来判断.

# re: 用ASP.NET上传大文件 10/9/2004 10:36 AM ikis
好像上传失败后不能删除临时文件,而且Application会不会越来越大?

# re: 用ASP.NET上传大文件 10/17/2004 9:42 PM ymm
我一个一个看过来,有位朋友说中途停止上传,cup 100%不释放,大家还讨论什么啊.这个问题解决不了.这个技术就一点价值都没有.确实如此啊.

# re: 用ASP.NET上传大文件 10/22/2004 10:36 AM 逆风飞扬
晕!!!!

# re: 用ASP.NET上传大文件 11/7/2004 5:47 PM tiger
你们说得太深了,我只想知道简单的问题:

我在做文件提交后,其它的输入字段的内容被清空了??为什么??我该怎么办呀??







关注这个网址
posted on 2004-11-15 15:50  豆浆  阅读(1345)  评论(0)    收藏  举报