我正试图将图像添加到Azure blob存储中,(程序的这部分工作正确)。
一旦每个图像在blob存储中,我想创建一个Azure存储表,实体有两列。图像类别,以及图像URI。
当我尝试插入Azure存储表时,应用程序进入 "中断模式"。
最终,这将被一个移动应用程序使用,该应用程序使用该表选择图像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.comen-usrestapistorageservicesunderstanding-the-table-service-data-model。.
为了解决这个问题,请将整个URL编码,然后尝试保存。这样应该可以。
我发现的解决方案是不要把URL放在PartitionKey或Rowkey属性中。
当我在表中添加了一个字符串属性时,我能够顺利添加URL。