我正在尝试将用户通过网页上传的图像保存为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应用程序。
答案 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()