在本地计算机中使用Azure存储模拟器时找不到上载的图像

时间:2014-04-21 07:39:43

标签: asp.net azure-storage-blobs

asp.net 4.5,Web Forms,vs2013,Identity 2.0,Entity Framework 6.0

我计划使用Azure存储blob来存储用户上传的图像。所以我下载了Azure存储模拟器以在我的本地计算机上进行测试。

似乎容器已正确创建并且图像已正确保存 - 因为我在运行应用程序时没有收到任何异常。

但问题是我在网页上看不到这张图片。调试代码,我看到这个图像的URI是

http://127.0.0.1:10000/devstoreaccount1/images/my_sub_folder_2/my_image.jpg

我将此网址粘贴到浏览器,IE告诉我:

The webpage cannot be found 404

Chrome告诉我:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>ResourceNotFound</Code>
<Message>
The specified resource does not exist. RequestId:e4b64fa8-5985-4aa4-bfbe-50aabd497537 Time:2014-04-21T07:26:04.4264011Z
</Message>
</Error>

我使用AzureStorageAccess.CreateContainer()在存储中创建容器,并使用AzureStorageAccess.UploadBlob()将用户上传的图像(流)保存到存储中。代码如下。

public class AzureStorageAccess
{
// create a container in Azure Storage Emulator
    static public void CreateContainer(string containerName)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount
            .Parse("UseDevelopmentStorage=true");
        // CloudConfigurationManager.GetSetting("StorageConnectionString")
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        container.CreateIfNotExists();
    }

// upload a stream to Azure Storage Emulator
    static public void UploadBlob(System.IO.Stream stream, string containerName, string blobRelativeURI, out string blobURI)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount
            .Parse("UseDevelopmentStorage=true");
        // CloudConfigurationManager.GetSetting("StorageConnectionString")
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobRelativeURI);
        blockBlob.UploadFromStream(stream);
        blobURI = blockBlob.Uri.AbsoluteUri;
    }
}

我在web.config中有这个连接字符串。最初我使用的是这个连接字符串。后来当我试图解决问题时,我在stackoverflow中阅读了一些我应该使用Parse("UseDevelopmentStorage=true")的帖子。您可以在上面的代码中看到用于读取此连接字符串的代码。

<add key="StorageConnectionString"         value="DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1"
/>  

谁能告诉我这是什么问题?非常感谢你!

3 个答案:

答案 0 :(得分:37)

这种情况正在发生,因为默认情况下容器会关闭公共读取访问权限。如果您使用Public Read Access

Container属性更改为Visual Studio Server Explorer,则可以从浏览器访问blob

enter image description here

或者,如果您想通过SDK在代码中执行此操作,请在创建容器之前添加以下行。

        //Create container
        container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Container });
        container.CreateIfNotExists();

答案 1 :(得分:0)

另一种实现方法是直接通过Microsoft Azure Storage Explorer。 右键单击您的Blob容器,然后选择设置公共访问级别...

Microsoft Azure Storage Explorer

答案 2 :(得分:0)

关于创建集公共访问:

public async ValueTask<bool> CreateContainer(string name)
{
    try {
        await _blobServiceClient.CreateBlobContainerAsync(name, PublicAccessType.BlobContainer);
        return true;
    }
    catch { }
    return false;
}
相关问题