使用Mongodb儲存上傳物理檔案並進行SQUID加速(基於aspx頁面)

來源:互聯網
上載者:User

       之前在閱讀MongoDB GFS文檔時,學習了它如何儲存物理檔案(包括大檔案)的方式。為了加深印象,專門寫了一個上傳檔案儲存體到Mongodb的樣本。當然後因為是儲存到文檔資料庫中,所以就不能用普通方式來訪問這些物理檔案了,這裡又專門寫了一個aspx頁面專門讀取這些檔案(比片或MP3等),所以下載樣本之後會看到兩個頁面,一個是uploadfile.aspx(上傳),一個是getfile.aspx(從mongodb中把檔案以流的方式讀出來)。當然考慮到訪問速度,這裡還引入了SQUID來進行檔案加速(當前SQUID預設只緩衝靜態檔案,所以這裡要對ASPX頁面的輸出進行一下設定,這些都會在本文中進行介紹)

       首先介紹一下開發環境,我使用的是VS2008+SP1 ,mongodb用戶端軟體用的是samus-mongodb(最新版本即可)
   
       添加對下面名空間的引用
    

using MongoDB;
using MongoDB.GridFS;

 

    
    下面是上傳檔案的主要代碼:uploadfile.aspx.cs    
     

     HttpPostedFile myFile = FileUpload.PostedFile;
     int nFileLen = myFile.ContentLength;
     
     byte[] myData = new Byte[nFileLen];
     myFile.InputStream.Read(myData, 0, nFileLen);
     
     GridFile fs = new GridFile(DB, filesystem);

     Random random = new Random(unchecked((int)DateTime.Now.Ticks));
     string newfilename = string.Format("{0}{1}{2}", random.Next(1000, 99999), random.Next(1000, 99999), System.IO.Path.GetExtension(myFile.FileName));
     GridFileStream gfs = fs.Create(newfilename);
     gfs.Write(myData, 0, nFileLen);
     gfs.Close();

 

    
      這裡只是給上傳檔案起個隨機名稱,這樣如果一切正常,就可以在資料庫中找到該檔案了,如:
    
          
    
      下面看一下如何訪問上傳的物理檔案getfile.aspx.cs(通過傳遞filename參數,mongodb中相應欄位結構,如):
    
     

     protected void Page_Load(object sender, EventArgs e)
     {
         if (!string.IsNullOrEmpty(Request.QueryString["filename"]))
         {
             string filename = Request.QueryString["filename"];
             Init();
             String filesystem = "gfstream";

             GridFile fs = new GridFile(DB, filesystem);
             GridFileStream gfs = fs.OpenRead(filename);

             Byte[] buffer = new Byte[gfs.Length];

             HttpContext.Current.Response.AddHeader("Expires", DateTime.Now.AddDays(20).ToString("r"));
             HttpContext.Current.Response.AddHeader("Cache-Control", "public");
      
             // 需要讀的資料長度
             long dataToRead = gfs.Length;
             int length;
             while (dataToRead > 0)
             {
                 // 檢查用戶端是否還處於串連狀態
                 if (HttpContext.Current.Response.IsClientConnected)
                 {
                     length = gfs.Read(buffer, 0, 10000);
                     HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
                     HttpContext.Current.Response.Flush();
                     buffer = new Byte[10000];
                     dataToRead = dataToRead - length;
                 }
                 else
                 {
                     // 如果不再串連則跳出死迴圈
                     dataToRead = -1;
                 }
             }
             gfs.Dispose();
             HttpContext.Current.Response.End();
         }
     }

 

    
       下面就是以列表的方式從mongodb中檢索檔案清單的最終的運行效果:
    
       
    
       儘管MONGODB的並發效能很不錯,但每次都去mongodb取的話也是有效能損耗的,特別是對於不經常變化的物理檔案,所以這裡
 使用了SQUID來進行檔案快取。當前SQUID預設只支援靜態檔案,對於本樣本中的ASPX頁面輸出的流資訊來緩衝還要進行一下設定。    
    
      首先,如果在squid.conf檔案中有如下行,需要用#進行注釋(它會禁止緩衝所有帶?的連結地址):

 

 hierarchy_stoplist cgi-bin ? \.php \.html
 acl QUERY urlpath_regex cgi-bin \? \.php \.html   
 cache deny QUERY

  

        這樣,再修改一下相應的.aspx,並在Header中添加如下資訊,即:    
    

HttpContext.Current.Response.AddHeader("Expires", DateTime.Now.AddDays(20).ToString("r"));
HttpContext.Current.Response.AddHeader("Cache-Control", "public");

 

      

        這樣SQUID就會忠實在根據該頭資訊來CACHED相應檔案了。
   
        當然也可以用如下方式來讓指定那些檔案aspx檔案才會被SQUID CACHED:   

    acl CACHABLE_PAGES urlpath_regex \getfile.aspx
    #允許cache上面的aspx頁面
    no_cache allow CACHABLE_PAGES

 

    
        而下面一個acl匹配所有的動態網頁面並禁止緩衝所有aspx頁面
    

    #acl NONE_CACHABLE_PAGES urlpath_regex \? \.aspx   
    #禁止cache其它的aspx頁面
    #no_cache deny NONE_CACHABLE_PAGES

 

    
    下面幾行設定頁面cache的時間長度,第一行cache一天,第二行cache兩分鐘
    

    refresh_pattern ^http://10.0.4.114:1100/mongodbsample/getfile.aspx 1440 0% 1440 ignore-reload
    refresh_pattern ^http://10.0.4.114:1100/mongodbsample/getfile.aspx 2 0% 2 ignore-reload

 

    
      如要SQUID配置正確的話,只要訪問SQUID所請求代理的網站(本文中為http://10.0.4.85:8989/mongodbspame/uploadfile.aspx),
這裡它就會到http://10.0.4.114:1100/mongodbspame/uploadfile.aspx去擷取頁面資訊,同時對該頁面中的連結getfile.aspx檔案均會
進行緩衝,如:

         

     

     好了,今天的內容就先到這裡了,樣本源碼及SQUID設定檔下載連結:/Files/daizhj/mongodbsample.rar
    
     原文連結:http://www.cnblogs.com/daizhj/archive/2010/08/19/1803454.html
     BLOG: http://daizhj.cnblogs.com/
     作者:daizhj,代震軍

   
   
   
   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.