0

在我的 Web 应用程序是“本地”解决方案之前,我使用“标准”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 中编辑了图表设置以使用这个新的处理程序。

此处理程序有效,但我的图片以通用名称保存:

图表_0.png 图表_1.png ...

我怎样才能像以前一样管理自己的文件名。我尝试添加ImageLocation="~/files/categories_#SEQ(30,20)"

到asp.net图表控制但没有成功。如何设置自己的名称(键)以及放置位置?在处理程序、asp.net 图表控件或声明 char 控件的代码隐藏文件中。

4

1 回答 1

1

在上面的代码中,当您将图像存储在 Azure Blob 存储中时,您直接将其存储在容器中,因此您在访问它们时检索为

http://azure_storage_name.*/_containername_/chartimage_name

或者,您可以创建一个文件夹类型的图表图像名称,例如 files/categories_1 和 files/categories_2 等,它们将在 Azure Blob 存储中存储为:

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

要获得它,您只需在将代码保存在 Save() 函数中时更改代码:

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

因此,当您保存图像时,它将保存为您的 azure storage /container_name/files/myimage_1.jpg,您可以通过访问 Windows Azure Storage 来验证。

现在,当您阅读它时,只需阅读密钥,您将获得预期的文件名。你可能需要修改你的代码以获得你想要的方式,但我已经给你一个想法如何去做。

于 2012-06-08T17:44:29.830 回答