Asp.NET大文件上传组件开发总结(二)---提取文件内容
生活随笔
收集整理的這篇文章主要介紹了
Asp.NET大文件上传组件开发总结(二)---提取文件内容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
不知地震什么時候結束,為了給老婆小孩守夜,看來還不能睡,那就把第二篇也寫了吧,只是不知對大家有沒有用喲。
為了提供文件內容,我們需要首先需確定客戶請求中發送的有文件內容,然后確定文件內容的位置。這部分對應的代碼如下:
?1HttpApplication?app?=?sender?as?HttpApplication;?2????????????HttpWorkerRequest?request?=?GetWorkerRequest(app.Context);
?3????????????
?4????????????if?(!IsUploadRequest(app.Request))?return;?//不是文件上傳,則退出
?5????????????
?6????????????string?sContentType?=?app.Request.ContentType.ToLower();
?7????????????byte[]?arrBoundary?=?GetMultipartBoundary(sContentType);
?8????????????int?ContentLength?=?app.Request.ContentLength;?//信息體的總長度
?9
10????????????DataReader?dataReader?=?new?DataReader(app.Context.Request.ContentEncoding,?arrBoundary);
11????????????DateTime?startDate?=?DateTime.Now;
12????????????byte[]?arrBuffer?=?request.GetPreloadedEntityBody();
13????????????if?(arrBuffer?==?null)
14????????????{
15????????????????arrBuffer?=?new?Byte[0];
16????????????????tempFile.Close();
17????????????????return;?//沒有讀取到信息體
18????????????}
19????????????else
20????????????{
21?????????????這里是對文件內容的處理
22????????????}
上面的代碼中,我們先獲取Asp.NET對客戶端請求的處理對象HttpWorkerRequest,然后根據這個對象的ContentType屬性是否為multipart/form-data來確定對應的請求是否有上傳文件,如果沒有上傳文件,就不處理此請求,以提高處理效率。這樣處理的依據是,在有文件上傳的HTML Form中,對應的enctype屬性為multipart/form-data。這樣就解決了確定客戶端請求中是否發送有文件內容。
要確定文件的內容位置,為此我們需要使用Reflector工具反編譯System.Web.dll中HttpRequest的代碼,可以發現有一個GetEntireRawContent方法,這個方法里,調用了HttpWorkerRequest對的GetPreloadedEntityBody方法來獲取數據,可喜的是,這個方法是Public的,所以我們也可以直接調此方法來獲取客戶端發送的數據。
獲取數據后,我們可以將這些數據寫入到一個文件中,這些數據是byte[]類型的,在寫入文件時,因為Http協議是基于文本的,所以我們可以采用System.Text.Encoding.GetString方法,將這些字節數組編碼成字符串,我這里的編碼采用ASCII,只是這樣請求中的中文就成了亂碼。這樣就可以獲取請求的內容的文體格式,以方便我們分析(在代碼中,這個寫文件的功能我已去除,因為這里寫全部請求內容只是用于分析使用,請參見第一篇文章中我列出的請求內容示例)。
通過分析這些請求內容,我們可以發現:每個頁面控件,均可以在這里找到對應的內容,兩個控件內容間是用字符串“-----------------------------7d81e441d025c”分隔的。同時在我們反編譯System.Web.dll中HttpRequest的代碼時,也可以發有GetMultipartBoundary這個方法,這個方法我們可以從字面意思得知是取分隔標識。我們把這個方法提取出來:
?1private?byte[]?GetMultipartBoundary()
?2{
?3????string?attributeFromHeader?=?GetAttributeFromHeader(this.ContentType,?"boundary");
?4????if?(attributeFromHeader?==?null)
?5????{
?6????????return?null;
?7????}
?8????attributeFromHeader?=?"--"?+?attributeFromHeader;
?9????return?Encoding.ASCII.GetBytes(attributeFromHeader.ToCharArray());
10}
然后我們采用這個方法,就可以從請求的內容中提取出類似“-----------------------------7d81e441d025c”這樣的字符串。這樣,我們就可以分隔頁面內不同控件的內容了。
最后,我們分析文件上傳控件的內容:
Content-Type:?application/x-rar-compressed
Rar!???s
我們可以發現,文件上傳控件有一個filename屬性,然后,下一行指定文件的MIME類型,隨后這個空白行,在空白行下面,直到下一處類似“-----------------------------7d81e441d025c”標志字符串間,就是客戶端發送的文件內容。我們只需把這些內容寫入到服務器文件中即可。
這里,文件內容的提取的問題就可以解決了。在提取文件內容時,對處理標志字符串時需要特別處理,防止標志字符分別讀取到兩個緩沖區中,所以這部分代碼還是比較多的,具體請參看源代碼中的DataReader類。
第二篇就寫到這,實在是太困了,后面的等一下再寫吧!
轉載于:https://www.cnblogs.com/bashan/archive/2008/05/14/1196057.html
總結
以上是生活随笔為你收集整理的Asp.NET大文件上传组件开发总结(二)---提取文件内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目测试经验交流
- 下一篇: .Net 中的序列化与反序列化 (转)