尝试将 Azure Blob 存储 URI 添加到 Azure 存储时出错 Table
Error when trying to add an Azure Blob Storage URI to an Azure Storage Table
我正在尝试将图像添加到 Azure blob 存储(程序的这一部分工作正常)。
一旦每个图像都在 blob 存储中,我想创建一个 Azure 存储 table,其中的实体有两列。图片类别和图片 URI。
当我尝试插入 Azure 存储 Table 时,应用程序进入 "break mode"。
最终这将由使用 table 到 select 图像 URI 作为网格视图图像源的移动应用程序使用,因此我需要完整的 URI。
我对类别进行了硬编码以尝试缩小问题范围。
我在开发过程中使用了 Azure 存储模拟器。仅供参考。
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Queue;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AzureEmulatorTests
{
class Program
{
static async Task Main(string[] args)
{
const string localPath = "./data/";
const string containerName = "mycontainer";
const string tableName = "mytable";
var storageAccount = CloudStorageAccount.Parse(@"UseDevelopmentStorage=true");
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
await container.CreateIfNotExistsAsync();
var tableClient = storageAccount.CreateCloudTableClient();
var table = tableClient.GetTableReference(tableName);
await table.CreateIfNotExistsAsync();
string[] filenames = Directory.GetFiles(localPath);
foreach (var images in filenames)
{
string _imageBlobReference = Guid.NewGuid() + ".jpg";
var blob = container.GetBlockBlobReference(_imageBlobReference);
await blob.UploadFromFileAsync(images);
string blobUrl = blob.Uri.AbsoluteUri;
ImageFile image = new ImageFile("Birthday", blobUrl);
await table.ExecuteAsync(TableOperation.Insert(image));
}
Console.WriteLine("Files Uploaded... Press any key to continue.");
Console.ReadKey();
}
}
class ImageFile : TableEntity
{
public ImageFile(string Category, string ImageURL)
{
PartitionKey = Category;
RowKey = ImageURL;
}
}
}
基本上问题出在您的 RowKey
属性的值上,因为它包含无效字符 (/
)。
有关 PartitionKey
和 RowKey
中不允许使用的字符的列表,请参阅此页面:https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model。
要解决这个问题,请URL对整个URL进行编码,然后尝试保存。应该可以。
我找到的解决方案是不将 URL 放在 PartitionKey 或 Rowkey 属性中。
当我将字符串 属性 添加到 table 时,我能够毫无问题地添加 URL。
我正在尝试将图像添加到 Azure blob 存储(程序的这一部分工作正常)。
一旦每个图像都在 blob 存储中,我想创建一个 Azure 存储 table,其中的实体有两列。图片类别和图片 URI。
当我尝试插入 Azure 存储 Table 时,应用程序进入 "break mode"。
最终这将由使用 table 到 select 图像 URI 作为网格视图图像源的移动应用程序使用,因此我需要完整的 URI。
我对类别进行了硬编码以尝试缩小问题范围。
我在开发过程中使用了 Azure 存储模拟器。仅供参考。
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Queue;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AzureEmulatorTests
{
class Program
{
static async Task Main(string[] args)
{
const string localPath = "./data/";
const string containerName = "mycontainer";
const string tableName = "mytable";
var storageAccount = CloudStorageAccount.Parse(@"UseDevelopmentStorage=true");
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
await container.CreateIfNotExistsAsync();
var tableClient = storageAccount.CreateCloudTableClient();
var table = tableClient.GetTableReference(tableName);
await table.CreateIfNotExistsAsync();
string[] filenames = Directory.GetFiles(localPath);
foreach (var images in filenames)
{
string _imageBlobReference = Guid.NewGuid() + ".jpg";
var blob = container.GetBlockBlobReference(_imageBlobReference);
await blob.UploadFromFileAsync(images);
string blobUrl = blob.Uri.AbsoluteUri;
ImageFile image = new ImageFile("Birthday", blobUrl);
await table.ExecuteAsync(TableOperation.Insert(image));
}
Console.WriteLine("Files Uploaded... Press any key to continue.");
Console.ReadKey();
}
}
class ImageFile : TableEntity
{
public ImageFile(string Category, string ImageURL)
{
PartitionKey = Category;
RowKey = ImageURL;
}
}
}
基本上问题出在您的 RowKey
属性的值上,因为它包含无效字符 (/
)。
有关 PartitionKey
和 RowKey
中不允许使用的字符的列表,请参阅此页面:https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model。
要解决这个问题,请URL对整个URL进行编码,然后尝试保存。应该可以。
我找到的解决方案是不将 URL 放在 PartitionKey 或 Rowkey 属性中。
当我将字符串 属性 添加到 table 时,我能够毫无问题地添加 URL。