[导入]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@侠缘      
 (~)@(~)  一辈子,用心做一件事!
--------------------------------
  学而不思则罔,思而不学则怠!  
================================
原文地址:https://www.cnblogs.com/WuCountry/p/305668.html