我正在尝试将用户通过网页上传到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应用程序。
我运行了一个快速的原型,并且设法成功上传和下载了该图像,因此我怀疑您的问题可能是以下之一:
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句