日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Asp.NET大文件上传组件开发总结(二)---提取文件内容

發布時間:2024/1/17 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.dllHttpRequest的代碼,可以發現有一個GetEntireRawContent方法,這個方法里,調用了HttpWorkerRequest對的GetPreloadedEntityBody方法來獲取數據,可喜的是,這個方法是Public的,所以我們也可以直接調此方法來獲取客戶端發送的數據。
獲取數據后,我們可以將這些數據寫入到一個文件中,這些數據是byte[]類型的,在寫入文件時,因為Http協議是基于文本的,所以我們可以采用System.Text.Encoding.GetString方法,將這些字節數組編碼成字符串,我這里的編碼采用ASCII,只是這樣請求中的中文就成了亂碼。這樣就可以獲取請求的內容的文體格式,以方便我們分析(在代碼中,這個寫文件的功能我已去除,因為這里寫全部請求內容只是用于分析使用,請參見第一篇文章中我列出的請求內容示例)。
通過分析這些請求內容,我們可以發現:每個頁面控件,均可以在這里找到對應的內容,兩個控件內容間是用字符串“-----------------------------7d81e441d025c”分隔的。同時在我們反編譯System.Web.dllHttpRequest的代碼時,也可以發有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-Disposition:?form-data;?name="file1";?filename="C:\Documents?and?Settings\Administrator\??????\componentart.web.ui.rar"
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大文件上传组件开发总结(二)---提取文件内容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。