首页 新闻 搜索 专区 学院

.net实现大文件上传request.GetPreloadedEntityBody()为空

0
[已关闭问题]

  {
            //订阅事件
            application.BeginRequest += new EventHandler(this.Application_BeginRequest);
        }
        public void Dispose()
        {
        }
        private void Application_BeginRequest(Object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            HttpWorkerRequest request = GetWorkerRequest(app.Context);
            Encoding encoding = app.Context.Request.ContentEncoding;

            int bytesRead = 0;  // 已读数据大小
            int read;           // 当前读取的块的大小
            int count = 8192;   // 分块大小
            byte[] buffer;      // 保存所有上传的数据

            if (request != null)
            {
                // 返回 HTTP 请求正文已被读取的部分。
                byte[] tempBuff = request.GetPreloadedEntityBody(); //要上传的文件

                // 如果是附件上传
                if (tempBuff != null && IsUploadRequest(app.Request))    //判断是不是附件上传
                {
                    // 获取上传大小
                    //
                    long length = long.Parse(request.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength));
                   
                    buffer = new byte[length];
                    count = tempBuff.Length; // 分块大小

                    // 将已上传数据复制过去
                    //
                    Buffer.BlockCopy(tempBuff,  //源数据
                        0,                      //从0开始读
                        buffer,                 //目标容器
                        bytesRead,              //指定存储的开始位置
                        count);                 //要复制的字节数。
                    // 开始记录已上传大小
                    bytesRead = tempBuff.Length;

                    // 循环分块读取,直到所有数据读取结束
                    while (request.IsClientConnected() &&!request.IsEntireEntityBodyIsPreloaded() && bytesRead < length)
                    {
                        // 如果最后一块大小小于分块大小,则重新分块
                        if (bytesRead + count > length)
                        {
                            count = (int)(length - bytesRead);
                            tempBuff = new byte[count];
                        }
                        // 分块读取
                        read = request.ReadEntityBody(tempBuff, count);

                        // 复制已读数据块
                        Buffer.BlockCopy(tempBuff, 0, buffer, bytesRead, read);

                        // 记录已上传大小
                        bytesRead += read;
                    }
                    if (  request.IsClientConnected() && !request.IsEntireEntityBodyIsPreloaded()  )
                    {
                        // 传入已上传完的数据
                        InjectTextParts(request, buffer);
                    }
                }
            }
        }

这是我的方法,但是request.GetPreloadedEntityBody()为空,所以导致数据无法分块上传,我在vs08下调试看的,怎么回事啊,有人知道吗?继续啊

rains的主页 rains | 小虾三级 | 园豆:860
提问于:2010-07-02 17:04
< >
分享
其他回答(2)
0

IIS 對 Request Max Length 有限制
可以先找一下這部分的資訊

胖胖安 | 园豆:205 (菜鸟二级) | 2010-07-02 17:37
0

火狐下调试可以取得数据,ie下得部署到IIS5.1或6.0上有数据

蘋锅锅 | 园豆:205 (菜鸟二级) | 2010-09-14 22:39
0

楼主试试这个控件:Xproer.HttpUploader5

此控件支持100G文件的断点续传操作,提供了完善的开发文档,支持文件MD5验证,支持文件批量上传。

文件MD5值计算进度:

计算文件MD5信息

文件MD5值计算完毕

文件MD5值计算完毕

服务器根据MD5检测是否存在相同文件

服务器根据MD5检测是否存在相同文件

续传文件

续传文件

从服务器加载文件列表

从服务器加载文件列表

文件上传中

文件上传中

文件上传完毕

文件上传完毕

上传文件夹

上传文件夹

与Discuz!X2整合-后台安装断点续传控件

与Discuz!X2整合-后台安装断点续传插件

与Discuz!X2整合-后台启用断点续传控件

与Discuz!X2整合-后台启用断点续传插件

与Discuz!X2整合-后台断点续传控件启用成功

与Discuz!X2整合-后台断点续传插件启用成功

与Discuz!X2整合-前台发帖页面

与Discuz!X2整合-前台发帖页面

与Discuz!X2整合-上传

与Discuz!X2整合-上传文件

资源下载:
CAB安装包
EXE安装包
开发文档
升级日志
ASP.NET(C#)示例代码:
ASP.NET-ACCESS示例
ASP.NET-SQL2005示例
JSP示例代码
JSP-ACCESS-GB2312示例
JSP-ACCESS-UTF8示例
JSP-SqlServer2005-UTF8示例
JSP-MySQL-UTF8示例
PHP示例代码
PHP-MySQL-UTF8示例

Chrome,Firefox,IE断点续传控件示例(以下示例已整合IE32,IE64,Firefox,Chrome平台的插件)
ASP.NET-ACCESS示例
ASP.NET-SQL2005示例
JSP示例代码
JSP-ACCESS-GB2312示例
JSP-ACCESS-UTF8示例
JSP-SqlServer2005-UTF8示例
JSP-MySQL-UTF8示例
PHP示例代码
PHP-MySQL-UTF8示例

Xproer-松鼠 | 园豆:207 (菜鸟二级) | 2012-11-07 09:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册