王骏的博客
编程、网络技术点滴...

公告

逐渐将VC知识库的博客迁移到这里!

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

程序员博客   首页  新随笔  订阅  管理  登录 
 
王骏的博客 阅读(1679) 评论(10)

感谢Chris Hynes提供了通过HttpModule(Krystalware.HttpUploadManager)实现 ASP.NET大文件上传的代码:
下载HttpUpload 
(其中HttpUploadSpike.rar是  ASP.NET大文件上传开源版本[有一些小BUG,修改方法见下文]
SlickUpload-2.5.2.rar是 ASP.NET大文件上传最新的非开源版本)

使用Chris Hynes提供的代码进行大文件上传非常方便,但在使用过程中发现几个小问题,解决后给大家作个参考。

一、中途取消时CPU占用过高

上传的时候如果中途取消,w3wp进程占用CPU一直100%,经过跟踪发现
MultipartParser.cs中几处地方有问题:

1)ReadFile中处理Stream.Read的返回值
只处理出错返回-1的情况,没有处理到达流末尾返回0的情况

protected bool ReadFile(FilePart p)
{
    
    
// while (read != -1)
    
// 改为:
    while (read > 0)
    
{
    
    }

}

2)ReadLine中处理Stream.ReadByte的返回值
当到达流末尾ReadByte返回-1
ReadLine(Stream s)
{
    
    
int rcv = s.ReadByte();
    
if(rcv == -1)
        
break;

    
char current = (char)rcv;
    
}

二、中文文件名乱码
原来的代码在处理HTTP头的时候未考虑编码,我参考“天下“先生的代码修改ReadLine如下:
protected string ReadLine(Stream s)
        
{
            
byte[] tempValues = new byte[2048];
            
int i = 0;
            
while(i < 2048)
            
{
                
int rcv = s.ReadByte();
                
if(rcv == -1)
                    
break;

                
byte current = (byte)rcv;
                
if(current != '\r' && current != '\n')
                
{
                    tempValues[i] 
= current;
                    i
++;
                }

                
else
                
{
                    
if (current == '\r')
                        s.ReadByte();

                    
break;
                }

            }


            
byte[] newValues = new byte[i];
            Array.Copy(tempValues, newValues, (
long)i);
            
return Encoding.Default.GetString(newValues);
        }

这样保存的文件名就不是乱码了。

评论列表
zhbf@nje.cn
re: ASP.NET大文件上传
好像还是有问题噢,大文件上传到结束时特慢。
wangjun
re: ASP.NET大文件上传
正常的,大文件从临时目录拷贝拷贝过来需要一定的时间。
Magic
re: ASP.NET大文件上传
能改完后发一份给我吗?我现在都是用2005的.2003编译不了.谢谢了.

rwj_ly@126.com
gjx
re: ASP.NET大文件上传
你好,能给我发一个正确的版本吗,谢谢
gjx02@126.com
梧桐树
re: ASP.NET大文件上传
加了处理乱码,  怎么老出现没有权限呢?
kkk
re: ASP.NET大文件上传
请给我一份,谢谢!!
alazyman@126.com
xk
re: ASP.NET大文件上传
我使用这个“return Encoding.Default.GetString(newValues);”也会出现乱码,,,最后改成
“return Encoding.UTF8.GetString(newValues);”就可以了
flp
re: ASP.NET大文件上传
多个文件上传怎么搞呀, 谢谢!
龙在边缘
re: ASP.NET大文件上传
好难修改啊,能给一个正确版的吗,260058135@qq.com 谢谢版主了!
路过
re: ASP.NET大文件上传
为什么
buff = _request.GetPreloadedEntityBody();为NULL啊?

发表评论
切换编辑模式