2012-06-08 67 views
0

在我的Web應用程序是「內部部署」解決方案之前,我使用「標準」asp.net圖表控件和磁盤存儲模式。像這樣:ASP.NET圖表自定義處理程序

<asp:Chart ID="AssetDistChart" runat="server" BackColor="Transparent" 
    Width="250px" Height="350px" ImageStorageMode="UseImageLocation" ImageLocation="~/files/categories_#SEQ(30,20)"> ... 

有了這個,我所有圖表的圖片都是用文件夾/文件中的名字categories_XXX生成的...而且工作得很完美。

現在,我需要將我的解決方案轉移到Azure平臺,並且將圖表圖像存儲在磁盤上不再適用於我。所以我創建了我自己的圖表處理程序,它可以從Blob存儲中保存/加載圖表圖像。處理器低於:

public class ChartImageHandler : IChartStorageHandler 
    { 
     ... 

     public void Delete(string key) 
     { 
      CloudBlob csv = chartContainer.GetBlobReference(key); 
      csv.Delete(); 
     } 

     public bool Exists(string key) 
     { 
      bool exists = true; 
      WebClient webClient = new WebClient(); 
      try 
      { 
       using (Stream stream = webClient.OpenRead(key)) 
       { } 
      } 
      catch (WebException) 
      { 
       exists = false; 
      } 
      return exists; 
     } 

     public byte[] Load(string key) 
     { 
      CloudBlob image = chartContainer.GetBlobReference(key); 
      byte[] imageArray; 
      try 
      { 
       imageArray = image.DownloadByteArray(); 
      } 
      catch (Exception e) 
      { 
       System.Threading.Thread.Sleep(1000); 
       imageArray = image.DownloadByteArray(); 

      } 
      return imageArray; 
     } 

     public void Save(string key, byte[] data) 
     { 
      CloudBlockBlob pictureBlob = chartContainer.GetBlockBlobReference(key); 
      pictureBlob.UploadByteArray(data); 
     } 
    } 

而且,我的asp.net圖表控件是現在這個樣子:

<asp:Chart ID="AssetDistChart" runat="server" BackColor="Transparent" 
    Width="250px" Height="350px" ImageStorageMode="UseHttpHandler"> 

同時,我在web.config中編輯圖表設置使用這種新的處理程序。

此處理工作,但我的照片被保存通用名:

chart_0.png chart_1.png ...

我如何管理自己的文件的名稱,如前。我嘗試添加ImageLocation="~/files/categories_#SEQ(30,20)"

到asp.net圖表控件但沒有成功。我怎樣才能設置我自己的名字(鍵)和放置在哪裏?在處理程序中,asp.net圖表控件或聲明char控件的代碼隱藏文件中。

回答

1

在上面的代碼,當你存儲在Azure的Blob存儲你的形象,你是直接存儲,所以你在訪問他們,你檢索的

http://azure_storage_name.*/_containername_/chartimage_name 

容器內或者,你可以創建一個文件夾類型的圖表形象的名字如文件/ categories_1和文件/ categories_2等,將被存儲在Azure的Blob存儲爲:

http://azure_storage_name.*/_containername_/files/categories_1 
http://azure_storage_name.*/_containername_/files/categories_2 

爲了得到它,你只需要在您以您的保存保存它改變你的代碼()函數:

string key = "files/myimage_1.jpg"; 
CloudBlockBlob pictureBlob = container.GetBlockBlobReference(key); 

所以,當你的圖像會保存它將被保存在你的Azure存儲/container_name/files/myimage_1.jpg您可以通過訪問Windows Azure存儲驗證。

現在,當您閱讀它時,只需閱讀該密鑰,就可以獲得您想要的文件名。您可能需要按摩您的代碼才能獲得您想要的方式,但我已經告訴您如何去做。

+0

謝謝。但我想在asp.net圖表控件中定義自己的圖表名稱,如本地方式(使用#SEQ()).Save()函數需要獲得「我自己的定義」鍵,因爲我需要生成在不同的用戶(不同的名稱)的代碼隱藏... – rjovic

+0

我還沒有嘗試過,但是你可以首先使用#SEQ創建一個這樣的名字表,然後選擇一個名稱作爲密鑰傳遞這樣你就會得到你想要的。或者,您可以使用不同的用戶名文件夾「filesX」,然後將文件名稱創建爲「fileX/image」和「fileY/image」。這樣你可以達到你想要的。 – AvkashChauhan