无法通过 HTML 上传将图像上传到 Azure blob

Unable to upload images to Azure blob from HTML upload

我正在尝试将用户通过网页上传到 Azure 存储的图像作为 blob 保存。我已经构建了代码并对其进行了测试,我可以毫无问题地连接和创建 blob,但它似乎没有正确保存文件,因为当我通过 HTTP 访问文件时,我只得到 "Broken image" 图标。如果我直接从 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 应用程序。

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

1)Blob 容器默认不允许 public 访问。可能是图像目前存储良好,但您的浏览器没有权限查看它。查看您的 "ffinfofiles" blob 容器设置并确保 "Public Read Access" 设置为 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:要进一步改进,请考虑使用异步重载,即 BlobBlock.UploadFromByteArrayAsync()