【巴山】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 }
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}
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-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\Administrator\??????\componentart.web.ui.rar"
Content-Type: application/x-rar-compressed
Rar! ??s
Content-Type: application/x-rar-compressed
Rar! ??s
我們可以發現,檔案上傳控制元件有一個filename屬性,然後,下一行指定檔案的MIME型別,隨後這個空白行,在空白行下面,直到下一處類似“-----------------------------7d81e441d025c”標誌字串間,就是客戶端傳送的檔案內容。我們只需把這些內容寫入到伺服器檔案中即可。
這裡,檔案內容的提取的問題就可以解決了。在提取檔案內容時,對處理標誌字串時需要特別處理,防止標誌字元分別讀取到兩個緩衝區中,所以這部分程式碼還是比較多的,具體請參看原始碼中的DataReader類。
第二篇就寫到這,實在是太困了,後面的等一下再寫吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-281051/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【巴山】Asp.NET大檔案上傳元件開發總結(四)---封送資料給Asp.NET頁面ASP.NET元件
- 提取rpm檔案內容
- 用ASP.NET上傳大檔案ASP.NET
- Asp.Net 上傳大檔案專題(1)--概述:上傳大檔案的難點ASP.NET
- 檔案上傳漏洞總結(全)
- 如何使用htmlq提取html檔案內容HTML
- Angular元件-檔案上傳元件Angular元件
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- 微信開發 檔案上傳
- 基於React的大檔案上傳元件的開發詳解React元件
- Web檔案上傳方法總結大全Web
- asp.net 上傳大檔案大小控制方案ASP.NET
- ASP.NET Core 檔案上傳ASP.NET
- iOS開發-NSURLSession檔案上傳iOSSession
- input[type=file] 獲取上傳檔案的內容
- 漏洞重溫之檔案上傳(總結)
- .NET Core 如何上傳檔案及處理大檔案上傳
- 前端大檔案上傳/分片上傳前端
- php檔案上傳之多檔案上傳PHP
- ftp上直接修改檔案內容FTP
- python 檔案操作(二) 替換性修改檔案內容Python
- Java如何上傳大檔案Java
- ASP.NET上傳大檔案報錯,IIS7.0ASP.NET
- 安全檔案和大物件開發手冊總結物件
- Java大檔案上傳、分片上傳、多檔案上傳、斷點續傳、上傳檔案minio、分片上傳minio等解決方案Java斷點
- 單個檔案上傳和批量檔案上傳
- 檔案上傳
- [ASP.NET]大檔案無法上傳排查經驗分享ASP.NET
- 檔案上傳漏洞全面滲透姿勢總結
- 3. 檔案上傳漏洞——漏洞總結筆記筆記
- post 表單大檔案上傳
- linux大檔案上傳(nc)Linux
- 大檔案上傳實踐分享
- .Net通用大檔案上傳類(可上傳大檔案,vs2005)
- SpringMVC 單檔案上傳與多檔案上傳SpringMVC
- 如何分發大檔案、大檔案傳輸解決方案
- flex結合servlet檔案上傳FlexServlet
- ASP.NET上傳檔案對檔案型別的高階判斷ASP.NET型別