熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Asp.NET大文件上傳開發總結(二)

2013-11-13 10:04:57  來源: .NET編程 

  為了提供文件內容我們需要首先需確定客戶請求中發送的有文件內容然後確定文件內容的位置這部分對應的代碼如下

  

  

  HttpApplication app = sender as HttpApplication;
            HttpWorkerRequest request = GetWorkerRequest(appContext);
           
            if (!IsUploadRequest(appRequest)) return; //不是文件上傳則退出
           
            string sContentType = appRequestContentTypeToLower();
            byte[] arrBoundary = GetMultipartBoundary(sContentType);
            int ContentLength = appRequestContentLength; //信息體的總長度

            DataReader dataReader = new DataReader(appContextRequestContentEncoding

  arrBoundary);
            DateTime startDate = DateTimeNow;
            byte[] arrBuffer = requestGetPreloadedEntityBody();
            if (arrBuffer == null)
            {
                arrBuffer = new Byte[];
                tempFileClose();
                return; //沒有讀取到信息體
            }
            else
            {
             這裡是對文件內容的處理
            }

  上面的代碼中我們先獲取AspNET對客戶端請求的處理對象HttpWorkerRequest然後根據這個對象的ContentType屬性是否為multipart/formdata來確定對應的請求是否有上傳文件如果沒有上傳文件就不處理此請求以提高處理效率這樣處理的依據是在有文件上傳的HTML Form中對應的enctype屬性為multipart/formdata這樣就解決了確定客戶端請求中是否發送有文件內容

  要確定文件的內容位置為此我們需要使用Reflector工具反編譯SystemWebdll中HttpRequest的代碼可以發現有一個GetEntireRawContent方法這個方法裡調用了HttpWorkerRequest對的GetPreloadedEntityBody方法來獲取數據可喜的是這個方法是Public的所以我們也可以直接調此方法來獲取客戶端發送的數據

  獲取數據後我們可以將這些數據寫入到一個文件中這些數據是byte[]類型的在寫入文件時因為Http協議是基於文本的所以我們可以采用SystemTextEncodingGetString方法將這些字節數組編碼成字符串我這裡的編碼采用ASCII只是這樣請求中的中文就成了亂碼這樣就可以獲取請求的內容的文體格式以方便我們分析(在代碼中這個寫文件的功能我已去除因為這裡寫全部請求內容只是用於分析使用請參見第一篇文章中我列出的請求內容示例)

  通過分析這些請求內容我們可以發現每個頁面控件均可以在這裡找到對應的內容兩個控件內容間是用字符串dedc分隔的同時在我們反編譯SystemWebdll中HttpRequest的代碼時也可以發有GetMultipartBoundary這個方法這個方法我們可以從字面意思得知是取分隔標識我們把這個方法提取出來

  

  

  private byte[] GetMultipartBoundary()
{
    string attributeFromHeader = GetAttributeFromHeader(thisContentType boundary);
    if (attributeFromHeader == null)
    {
        return null;
    }
    attributeFromHeader = + attributeFromHeader;
    return EncodingASCIIGetBytes(attributeFromHeaderToCharArray());
}

  然後我們采用這個方法就可以從請求的內容中提取出類似dedc這樣的字符串這樣我們就可以分隔頁面內不同控件的內容了

  最後我們分析文件上傳控件的內容

  

  

  ContentDisposition: formdata; name=file; filename=C:\Documents and Settings

  \Administrator\??????\componentartwebuirar
ContentType: application/xrarcompressed
Rar! ??s


  我們可以發現文件上傳控件有一個filename屬性然後下一行指定文件的MIME類型隨後這個空白行在空白行下面直到下一處類似dedc標志字符串間就是客戶端發送的文件內容我們只需把這些內容寫入到服務器文件中即可

  這裡文件內容的提取的問題就可以解決了在提取文件內容時對處理標志字符串時需要特別處理防止標志字符分別讀取到兩個緩沖區中所以這部分代碼還是比較多的具體請參看源代碼中的DataReader類


From:http://tw.wingwit.com/Article/program/net/201311/12493.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.