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

时间:2015-07-26 20:25:11

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

我正在尝试将用户通过网页上传的图像保存为Azure存储。我已经构建了代码并对其进行了测试,我正在连接并创建blob而没有任何问题,但它似乎没有正确保存文件,因为当我通过HTTP访问文件时我只是得到了#34;破碎的图像&# 34;图标。如果我直接从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);
        }

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

1 个答案:

答案 0 :(得分:1)

我已经运行了一个快速原型,我设法上传并下载图片就好了,所以我怀疑你的问题可能是以下之一:

1)Blob容器默认不允许公共访问。可能是目前图片存储得很好,但您的浏览器根本没有权限查看它。看看你的" ffinfofiles" 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()