• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

UploadLargeFilesinASP.NETUsingHttpModule

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 AS you may know, ASP.NET by default only allows the maximum request length to be 4MB. The developer needs to modify the web.config file to allow the upload process to handle large files.
If you use Reflactor and you dissamble the HttpRequest under System.Web, you will find a method called GetEntireRawContent which will check if the request is larger than the value in the web.config and throws an error

                if (length > maxRequestLengthBytes)
                {
                    throw new HttpException(SR.GetString("Max_request_length_exceeded"), null, 0xbbc);
                }


In this article, Haissam Abdul Malak will demonstrate how to upload large files in ASP.NET without the need to modify the value of maxRequestLength attribute of the httpRuntime tag in the web.config.

We will create an HttpModule which will read the file in chunks (500KB per chunk).
We will handle the BeginRequest event and use the HttpWorkerRequest which provides more low level control for the request.
Below is the full implementation of the HttpModule. I included comments to enable you to fully understand each line of code.

I recommend connecting to msdn and read about HttpWorkerRequest class. Personally i didnt know about the existence of such class except lately.


using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace HAMModule
{
    
public class MyModule : IHttpModule
    {
        
public void Init(HttpApplication app)
        {
            app.BeginRequest 
+= new EventHandler(app_BeginRequest);
            
        }
        
void app_BeginRequest(object sender, EventArgs e)
        {
            HttpContext context 
= ((HttpApplication)sender).Context;

            
if (context.Request.ContentLength > 4096000)
            {
                IServiceProvider provider 
= (IServiceProvider)context;
                HttpWorkerRequest wr 
= (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
                FileStream fs 
= null;
                
// Check if body contains data
                if (wr.HasEntityBody())
                {
                    
// get the total body length
                    int requestLength = wr.GetTotalEntityBodyLength();
                    
// Get the initial bytes loaded
                    int initialBytes = wr.GetPreloadedEntityBody().Length;
          
                    
if (!wr.IsEntireEntityBodyIsPreloaded())
                    {
                        
byte[] buffer = new byte[512000];
                        
string[] fileName = context.Request.QueryString["fileName"].Split(new char[] { '\\' });
                        fs 
= new FileStream(context.Server.MapPath("~/Uploads/" + fileName[fileName.Length-1]), FileMode.CreateNew);
                        
// Set the received bytes to initial bytes before start reading
                        int receivedBytes = initialBytes;
                        
while (requestLength - receivedBytes >= initialBytes)
                        {
                            
// Read another set of bytes
                            initialBytes = wr.ReadEntityBody(buffer, buffer.Length);
                            
// Write the chunks to the physical file
                            fs.Write(buffer, 0, buffer.Length);
                            
// Update the received bytes
                            receivedBytes += initialBytes;
                        }
                        initialBytes 
= wr.ReadEntityBody(buffer, requestLength - receivedBytes);
                        
                    }
                }
                 fs.Flush();
                 fs.Close();
                 context.Response.Redirect(
"UploadFinished.aspx");
            }

        }
        
public void Dispose()
        {
        }
    }
}

To know the file name selected by the user, I had to use javascript function on the page containing the fileupload control to change the action property of the form tag to post to the same page with a query

string parameter containing the selected file name. Users will be redirected to a page called "UploadFinished.aspx" to display a successful upload process message.

Below is the javascript function

 <script language="javascript">
        function SetAction()
        {
                   document.form1.action = 'default.aspx?fileName=' + document.getElementById('FileUpload1').value;
        }
    </script>
And call it using
<asp:FileUpload ID="FileUpload1" runat="server" onpropertychange="SetAction()" />
You need to register the module in the application web.config file by placing the below inside the <system.web> tag.

<httpModules>
        <add type="HAMModule.MyModule" name="MyModule"/>
</httpModules>

Hope this helps,


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap