zoukankan      html  css  js  c++  java
  • [导入]SunriseUpload.0.9.1的源码分析(二)

    UploadFile的构造函数实际上是从服务器的临时目录里取得上传文件的信息,以便保存它。后面的代码通过对content的分析就可以一清二楚了。
    那我们的问题是:为什么当文件上传的时候,它可以直接就处理上传的文件呢?
    文件的上传过程是在什么地方呢?
    于是我们要分析:HttpUploadModule了。
    前面已经做了一个测试了,可以自己处理所有的用户请求,而且不管是什么状态的,因为我们在模块的构造函数里添加了自己处理代码,实际上我们要实现application的几个事件,。
    HttpUploadModule是最长的文件了,它用来处理上传时的请求,还是来慢慢分析:
    1、事件的实现:
    httpUploadModule类必须实现IHttpModule接口,而且必须实现它的初始化函数:
      /// <summary>
      ///
      /// </summary>
      /// <param name="application"></param>
      public void Init(HttpApplication application)
      {
       application.BeginRequest += new EventHandler(this.Application_BeginRequest);
       application.EndRequest += new EventHandler(this.Application_EndRequest);
       application.Error += new EventHandler(this.Application_Error);
      }
    这里就实现的了几个事件。而实现上它的构造函数里什么也没做。
    我们先来看看BeginRequest事件,该事件在用户请求页面时发生。
    private void Application_BeginRequest(object sender, EventArgs e)
    其中seder就是application自己,e是参数(具体的是什么我目前还不明白)
    接下来实现了这两行代码:
    HttpApplication application = (sender as HttpApplication);
    HttpWorkerRequest workerRequest = GetWorkerRequest();
    我们自己来处理application和workerRequest,这是的选择来自己处理上传大文件。
    关于HttpContent和HttpWorkerRequest可以查看MSDN里的说明。

    以下代码是在try块中:

        if (!IsUploadRequest(application.Request))
        {
         return;
        }

        if (!workerRequest.HasEntityBody())
        {
         return;
        }
    用来判断用户的某一请求是否是文件上传请求,如果不是,就返回交给aspnet.dll来处理其它的事。

    string contentType = application.Context.Request.ContentType.ToLower();
    用来取得请求的类型,测试结果为:
    11/2/2005 9:47:09 AM multipart/form-data; boundary=---------------------------7d52ee98033a
    也就是说,用户用multipart/form-data的方式向服务器发出了请求。这也是我们想要的,否则我们不与处理。
    试着删除Form里的: enctype="multipart/form-data",结果是我们模块不再处理结果了。(当然,这里是我们自己不想处理,交给了IIS自己去处理,而不是我们不能处理。)

    byte[] boundaryData = Encoding.ASCII.GetBytes(("\r\n--" + contentType.Substring((contentType.IndexOf("boundary=") + 9))).ToCharArray());
    int FileLength = Convert.ToInt32(workerRequest.GetKnownRequestHeader(11));
    不知道为什么,我测试的文件大小比真实的文件要大一点点!先不管它了。

    byte[] preloadedEntityBody = workerRequest.GetPreloadedEntityBody();
    从用户那里取得已经上传上来的数据,里面包括所有的数据,所以我们要分析这里的数据。这是我测试后取得的数据,我上传一个文件文件,里面就一句话。
    11/2/2005 10:15:58 AM -----------------------------7d52033a1004ec
    Content-Disposition: form-data; name="__VIEWSTATE"

    dDwtNTMwNzcxMzI0Ozs+AsSfEXPXvGi5+b7dOBAso7F1wlU=
    -----------------------------7d52033a1004ec
    Content-Disposition: form-data; name="m_file"; filename="D:\WuCountry\Temp.txt"
    Content-Type: text/plain

    This is a test!
    -----------------------------7d52033a1004ec
    Content-Disposition: form-data; name="Button1"

    Button
    -----------------------------7d52033a1004ec--

    11/2/2005 10:15:58 AM :in test file.
    看明白了这个文件,相信要处理它不难吧!!我们再看看上传一个二进制文件后的内容,因为是测试,所以用了一个很小的文件。
    11/2/2005 10:18:50 AM -----------------------------7d51f321004ec
    Content-Disposition: form-data; name="__VIEWSTATE"

    dDwtNTMwNzcxMzI0Ozs+AsSfEXPXvGi5+b7dOBAso7F1wlU=
    -----------------------------7d51f321004ec
    Content-Disposition: form-data; name="m_file"; filename="D:\WuCountry\Pictures\logo.png"
    Content-Type: image/x-png

    ?PNG
    
      
    IHDR   ]   &   ¦??Á   gAMA  ¯È7?é   tEXtSoftware Adobe ImageReadyqÉe<  ÂIDATxÚbüÿÿ?Ã0 ?@Ìļ@ü?¿fÇã0 t`b1 V?FÂ] ~>
    @Ã)Ð?S½:?@Sÿ ¾ Äÿ?h8:2Ðbs â¯@| ?/´£ h¸: ?ÊúP â@<??c h¤: °q§ñ' ?Ä?ø=@#-ÐÑS~"óA~_¡?å 4R¹Ò9Ý@,ÄË?¸?¯ÒÒR? é?ü@\ ÄeÐÏ2 n£UàÐh £P??Ó???7 ñb ÞLMK h4бE ?ÄPþV îâCÔ0 ???Ø<@, ­d8èà±2hf3ý>{q
    ??²ñd ?£Ôp? b ¥t æâ @ü?ßñ- ^ ĶPyjc ¾þ?idµ°oú? Ï?¸??É5 ?` '¨?ï?x 4àAà%+ÐÀ#Ò@ü?o 1û tvâH?b§?c@ Á?s(½?}?ØÚs
     ¹@å?¸?÷C;RÐîugB?_ Pv ±´,u¿§±2T?!´;Ä???Z?mâ%@l
    U¯â ?âMPóx??|@¼?×±;RQY Ä?@ì -({ eü~(ÔÄ?u/IE@ ÁB4öÒ?bä*T,?ÚAÅÁ ?ß Ä²@ü ?¿@õxBå?±>ßâC@<*¾
    ª®Ê?b Þå??Ò????? |?ù??RY ´??
    Ä÷?¸?ï ñW Vbs¤?ú ?ÏP1Å?rf'ÿCrÏc NbFbÌ  ¨§_ñhùÅ
    °_Ð"@À 0
    ?Û?ø/?/Äë¡| ~
    ħ?? ?·BÕ,âV þ
    į???BõÈq-T]ÔC« | Î?²K¡új ül¨'Aà(×Aë$XDæAÙ ¢R?FEXø?
    @e¿!½ ÄLíZ@,ÄO ãÏ "£ÚNÝ
    §vâ?Ðl
    jáÌ??Ú}?? ñ,h?íZ»ñ5h dÙ! ÄFÐñî7Ð"à´øù µÿ´x³?Ê???P» öF@Õ?ÌÑ â³@|jg9T]/´%B 6x mËÃÜå Äб??¸44?ü?¦<P«å3Rñ¡ Å p?Í?8??y¡1g?ÓÝP11hV?ÍêÅÐb? ?ý¡jç@³ãv¤"i#?=?:Bù+?x?
    ?@Rë
    ­ä@¹PjÇWhÎ?¤C mõ!P?Å¥ ? ??½× x´lç?*b?f××Ðy-?¹¡ò âé4oFËÆ©@üªT®vAÍÌâÛÐr??× ?}
    M u&P1P1uÊ]?P}FPþ7 þ-J??X?x@õ3?Z6VP¿¢?ÙØÜ @  å?&úPüG¦?C/¡Å2`?ÿqèo¡bÐ"ç'Òl´hz
    Äï¡bÐÖR6ß?; »ÿ ñhkê9Ô,Pkè:´Øµ?X êöB³¾??>@g? ]<Ú2yÄ  r@lÏ ?] U?2 E$: µîê? h0·?@³i4Õ?âýPl Ä÷¡ì¨| ´RU Püªö>?­?¤ff=÷#?ý???¤$7?{¹ Å):ø-?ájh(tJ`?v?b¨x?Ç
     bç¡?'
    `X@î?Ê×CÕ @ÕÎG2W ªî<Ôì~¨x=4°  ì<n}?°ü_hâ« ¡èõhè??@ù÷?Ô"?÷P5ûÑݨ?EDRnx3@Ê9°ÈÇçÞíÿ±P[^¤ ??B ¯?bd1h ¼G
    ¤"?rÐR)¬h?©5@23)G$ ?+ÎÐr.\ú7è © ¡è÷±¤ôóP,?¥lGÖ«?)°?Z?V4!§àÿHö?G?\&4?'ÐA=kM? b?¶&?¡??ÁÑø C lGh+ä??®ÖÚ*?±p¨= m  ñaãD°VÎ-d ?G?4=@ &#tp
    Ô$ûmj½?Î??ÒÁ^h8@,Ðîõ3¤QE>èÈ?,Tü6ßbäë ¨"à` @ø¦ë@?µúÐì%Í %
    ?¡?Q?
    @ã.ë 3¼3f Dì);4ðAãÜ?Ðqî'Ðñð?ÐA¥#4°A? ZÀÔ-%ðPÚ ?È??V?¾6´>à?FÌGhQt Ï?q` A'5@+ì?Pª'A ?öµVpA#Á Z¦©@ÇS@õÀ
    è?ëUh«á´²ª@???8:dM xîÝâ ­?`0B×?@§- 3¨Éô
    ?CsÃèxø= ~
    Ðú7ÈY
    Z·?üáe³? 1têð!L  ?è¹îÔþ??F«BS?$t$?ZY??H¾?âW@ü?=ß"©ùÍI?ÉÈ9?Ð?ã??âÐÉQ¨{$¡nÍ}Jh{cç¡ó¹;¡õ
      Á°Ø? êI)è,?&RÄÈAü?væ¾CsÎghEþ :4ý ?c~A;~ÌH
    hÑ[ßàe³Pà?÷ÐVÝh;ý,41` 4ØWxñCs?´Ùª?hî??×ó -?¢ø?Kx
    -oCSòUR
     4T?Õ1BZ1°Õi<Ðâ???y¡)?ÂÙ?R4Ò²Pîø Å? ©ô ?o þ©È#  ¸¸s?5L     IEND®B`?
    -----------------------------7d51f321004ec
    Content-Disposition: form-data; name="Button1"

    Button
    -----------------------------7d51f321004ec--

    11/2/2005 10:18:50 AM :in test file.

    好了,接下来的任务:1、分析上传的数据,2、分析如何断点续传,因为上面的例子都是在一次请求里就完成的,如果一次请求完成不了呢?。


    文章来源:http://computer.mblogger.cn/wucountry/posts/48482.aspx
    ================================
      /\_/\                        
     (=^o^=)  Wu.Country@侠缘      
     (~)@(~)  一辈子,用心做一件事!
    --------------------------------
      学而不思则罔,思而不学则怠!  
    ================================
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/WuCountry/p/305668.html
Copyright © 2011-2022 走看看