【问题标题】:Unable to upload images to Azure blob from HTML upload无法通过 HTML 上传将图像上传到 Azure Blob
【发布时间】:2015-10-16 23:01:36
【问题描述】:

我正在尝试将用户通过网页上传到 Azure 存储的图像作为 blob 保存。我已经构建了代码并对其进行了测试,我正在毫无问题地连接和创建 blob,但它似乎没有正确保存文件,因为当我通过 HTTP 访问文件时,我只是得到“损坏的图像”图标。如果我直接从 Azure 门户下载文件并尝试在图像编辑器(绘制)中打开它,我会收到一条消息,指出该文件不是有效的位图文件。您可以在

看到我刚刚尝试上传的文件

https://gisstore01.blob.core.windows.net/ffinfofiles/Test/Core/Logo.jpg

这是我用来上传文件的代码。我不知道这里出了什么问题,有什么建议吗?

        var StorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"].ToString());
        var BlobClient = StorageAccount.CreateCloudBlobClient();
        var Container = BlobClient.GetContainerReference("ffinfofiles");
        var FileExtension = Path.GetExtension(UploadedFile.FileName.ToLower());
        var BlobBlock = Container.GetBlockBlobReference(FileName + FileExtension);
        BlobBlock.Properties.ContentType = UploadedFile.ContentType;

        using (UploadedFile.InputStream)
        {
            BlobBlock.UploadFromStream(UploadedFile.InputStream);
        }

哦,这是一个使用 C# 的 ASP.Net 4.6 应用程序。

【问题讨论】:

    标签: c# asp.net file-upload azure-blob-storage


    【解决方案1】:

    我已经运行了一个快速原型,并且成功地上传和下载了图像,所以我怀疑您的问题可能是以下问题之一:

    1) 默认情况下,Blob 容器不允许公共访问。可能是图像目前存储良好,但您的浏览器没有查看它的权限。查看您的“finfofiles”blob 容器设置并确保“公共读取访问”设置为 true

    2) 您用于设置上传调用的信息都是动态的,因此您作为参数传入的数据始终有可能是错误的。仔细检查 UploadedFile.FileName.ToLower() 的广告是否正确,更重要的是 UploadedFile.ContentType 是否正确

    3) 继续上面第 2 项的想法,您必须确保 UploadedFile.InputStream 有效。除非您确实从本地磁盘以外的其他来源流式传输文件内容,否则我实际上只会读取文件字节并使用 BlobBlock.UploadFromByteArray() 重载。请记住,这样做虽然您首先将文件有效地读入内存,但在这种情况下,如果您的文件足够小,例如 jpg,这应该不是问题

    结论:

    这是我用作概念证明的代码。

    var StorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"].ToString());
    var BlobClient = StorageAccount.CreateCloudBlobClient();
    var Container = BlobClient.GetContainerReference("ffinfofiles");
    Container.CreateIfNotExists();
    
    var BlobBlock = Container.GetBlockBlobReference(filename);
    BlobBlock.Properties.ContentType = "image/jpg";
    var fileContent = System.IO.File.ReadAllBytes(Server.MapPath("~/images/" + filename));
    BlobBlock.UploadFromByteArray(fileContent,0,fileContent.Length);
    

    PS:为了进一步改善这一点,请考虑使用 Async 重载,即 BlobBlock.UploadFromByteArrayAsync()

    【讨论】:

    • 看起来您是直接从硬盘中取出文件,您是否尝试使用 HTML 上传表单并获得相同的结果?我检查了 blob 的权限,它们设置为“Blob - 通过匿名请求访问 Blob”。我没有“公共读取访问”权限,但有一个“私人”并且未被选中。我现在无法调试,因为 VS 2015 已经破坏了我的调试,但我知道变量正在通过查看 blob 名称正确传递。据我所知,它没有保存图像的实际数据。
    • 我也不想在上传之前先将文件读入内存,因为我在 Azure WebSits 中运行,这有可能导致网站崩溃
    • 我刚刚做了一些测试并将 BlobReference 硬编码为“TestImage.jpg”,现在当我拉起图像时,它只是一堆垃圾(随机字母/字符)。我什至尝试使用不同的图像来确保它不是图像,所以我现在确信在上传过程中文件内容没有正确保存。当我下班回家时,我将关闭它并打开一个新问题
    • 酷,好吧!至少现在你知道问题出在哪里了!抱歉,今天很忙,我无法为您提供进一步的帮助,但我会留意您的其他帖子并尝试提供帮助,如果没有人已经这样做了。
    • 我已经打开了一个关于上传的新问题,希望你能在这里找出问题所在stackoverflow.com/questions/31733382/…
    猜你喜欢
    • 2015-05-15
    • 2014-06-21
    • 2017-04-26
    • 2018-12-17
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2016-02-05
    相关资源
    最近更新 更多