【问题标题】:Displaying images from azure blob container显示来自 azure blob 容器的图像
【发布时间】:2016-11-18 19:21:00
【问题描述】:

我有一个 asp mvc 应用程序,我试图在其中显示已存储在 Azure blob 存储中的图像。

当我返回字符串时,浏览器只会显示为损坏的图像。当我右键单击并“检查”并单击生成的 URI 时,我收到以下消息

BlobNotFound 指定的 blob 不存在。 RequestId:f7c32876-0001-013e-539d-dede28000000 时间:2016-07-15T13:30:49.7560775Z

我已经下载了Azure Storage Explorer 并且可以看到该文件。我试图将容器上的访问级别从no public access 更改为read access for blobs only(但我认为我是在代码中使用PublicAccess = BlobContainerPublicAccessType.Blob 行进行的)。

如何显示存储中包含的图像?

public string Index()
    {
        CloudBlockBlob blob = GetBlobInContainer("blobContainerTjsContainer", "PS-ICON-120x120_140.jpg");
        return "<img src="+ blob.Uri.AbsoluteUri +" alt='PS Image'>";
    }

CloudBlockBlob GetBlobInContainer(string container, string fileName)
    {
        //use web.config appSetting to get connection setting .NET Framework's ConfigurationManager class can also be used for this
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        //create the blob client
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        //retrieve a refernce to a container
        CloudBlobContainer blobContainer = blobClient.GetContainerReference(CloudConfigurationManager.GetSetting(container));
        //set permission to show to public
        blobContainer.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob});
        blobContainer.CreateIfNotExists();
        // Retrieve reference to a blob named "photo1.jpg".
        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName);
        return blockBlob;
    }

编辑

进一步阅读后我改变了

// Retrieve reference to a blob named "photo1.jpg".
        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName);
        return blockBlob;

// Retrieve reference to a blob named "photo1.jpg".
        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName);
        blockBlob.Properties.ContentType = "image/jpg";
        blockBlob.SetProperties();
        return blockBlob;

此更改返回异常

异常详情:System.Net.WebException:远程服务器返回错误:(404) Not Found。

上传时我需要做一些不同的事情吗?

编辑

@Gaurav Mantri

我可以看到它存储为application/octet-stream,但是当我尝试将其更改为 image/jpg 时使用

blockBlob.Properties.ContentType = "image/jpg";
    blockBlob.SetProperties();

我在设置属性时遇到 404 异常。当我拉取图像时,在调试时我可以看到图像名称与我上传时的名称相同

在上传时我使用了以下代码

    void UploadFile(string filePath)
    {
        //use web.config appSetting to get connection setting .NET Framework's ConfigurationManager class can also be used for this
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        //create the blob client
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        //retrieve a refernce to a container
        CloudBlobContainer blobContainer = blobClient.GetContainerReference(CloudConfigurationManager.GetSetting("blobContainerTjsContainer"));
        //create a container if it doesnt exist
        blobContainer.CreateIfNotExists();
        //gets the reference to the blob that will be written or OVER written
        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("my-image-blob");

        using (var fileStream = System.IO.File.OpenRead(filePath))
        {
            blockBlob.UploadFromStream(fileStream);
        }
    }

【问题讨论】:

  • 您是否在您的 blob 容器中看到名为 PS-ICON-120x120_140.jpg 的文件?你能分享一下 Azure 存储资源管理器的屏幕截图吗?
  • 我已尝试添加足够多的额外信息,如果您需要更多信息,请告诉我
  • 谢谢。所以我注意到了一些事情:1)在UploadFile 中,您没有像在GetBlobInContainer 函数中那样设置blob 容器的ACL。您能否检查一下 blob 容器的 ACL 是否确实是 Blob 而不是 Private? 2) 实际上,您向GetBlobInContainer 函数传递的blob 名称与您在UploadFile 中所做的不同。请确保两者相同。
  • 感谢您的第一条评论,我尝试了一些方法,即调用 blockBlob.Properties.ContentType 但不要调用 blockBlob.SetProperties();我没想到这会起作用,因为我认为 blockBlob.SetProperties();保存设置。已经成功了,谢谢你的帮助。我很乐意将您提供的任何相关答案标记为正确
  • 我真的不确定我到底做了什么对你有帮助 :P 但我很高兴听到你没有被阻止。请自己提供一个答案,告诉你你做了什么。回答自己的问题甚至接受它是完全可以的:)。

标签: c# azure azure-storage azure-web-app-service


【解决方案1】:

感谢 Gaurav 的 cmets,我能够解决我的问题。

我正在下载如下文件

CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName);
blockBlob.Properties.ContentType = "image/jpg";
blockBlob.SetProperties();
return blockBlob;

但是在存储文件时我没有设置内容类型,所以它被保存为application/octet-stream,上面的代码在调用文件时试图转换类型。通过在上传之前设置类型,我可以简单地调用文件并将其显示为图像,例如

CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("my-image-blob");
blockBlob.Properties.ContentType = "image/jpg";

using (var fileStream = System.IO.File.OpenRead(filePath))
{
    blockBlob.UploadFromStream(fileStream);
}

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2011-05-27
    • 2014-07-05
    • 2013-06-12
    相关资源
    最近更新 更多