【发布时间】:2015-08-02 22:14:18
【问题描述】:
我正在尝试允许用户通过 HTML5 页面将图像上传到我的网站,并尝试使用 Azure Blob 存储。我已经在后端创建了页面和 C# 代码,但似乎图像在上传过程中被损坏了。我能够获取图像并将其传递给 Azure,它会创建 blob 并将其填充为正确的大小,但是当图像被下载然后打开时,我只会得到一堆垃圾(随机字母和符号)而不是图像.谁能帮我解决这个问题,已经尝试解决这个问题一个多星期了。
[HttpPost, ValidateAntiForgeryToken]
public ActionResult AddSection(AddEditSectionVM model, HttpPostedFileBase LogoFile)
{
try
{
using (var db = new SectionContext())
{
if (db.Sections.Where(s => s.Route == model.Route).Count() > 0)
{
ModelState.AddModelError("Section Route Used", "A section with the same route already exists.");
}
if (LogoFile != null)
{
if (FileHelper.IsValidImage(LogoFile))
{
ModelState.AddModelError("Invalid File Type.", "Images must be JPG, GIF, or PNG files.");
}
}
if (ModelState.IsValid)
{
if (LogoFile != null)
{
string FileName = "Images/" + model.Route + "/Core/Logo" + Path.GetExtension(LogoFile.FileName).ToLower();
model.LogoFileID = FileHelper.UploadFile(FileName, "site", LogoFile);
}
var NewSection = new Section()
{
LogoFileID = model.LogoFileID,
Route = model.Route,
Title = model.Title,
Type = model.Type,
Synopsis = model.Synopsis
};
db.Sections.Add(NewSection);
db.SaveChanges();
ViewBag.Results = "New section added.";
}
return View(model);
}
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
ViewBag.Results = "Error saving section, please try again later.";
return View(model);
}
}
public static int UploadFile(string FileName, string Container, HttpPostedFileBase UploadedFile, int ExistingFileID = 0)
{
var StorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
var BlobClient = StorageAccount.CreateCloudBlobClient();
var StorageContainer = BlobClient.GetContainerReference(Container);
var BlobBlock = StorageContainer.GetBlockBlobReference(FileName);
BlobBlock.Properties.ContentType = UploadedFile.ContentType;
using (UploadedFile.InputStream)
{
BlobBlock.UploadFromStream(UploadedFile.InputStream);
}
using (var db = new SectionContext())
{
var NewFile = new DAL.File();
if (ExistingFileID > 0)
{
NewFile = db.Files.Find(ExistingFileID);
NewFile.Name = FileName;
NewFile.ContentType = UploadedFile.ContentType;
db.Entry(NewFile).State = EntityState.Modified;
db.SaveChanges();
return ExistingFileID;
}
else
{
NewFile.Name = FileName;
NewFile.ContentType = UploadedFile.ContentType;
db.Files.Add(NewFile);
db.SaveChanges();
return NewFile.ID;
}
}
}
从此代码上传的损坏图片的链接:https://gisstore01.blob.core.windows.net/ffinfofiles/ChocoboontheJob/Core/Logo.jpg
【问题讨论】:
-
你是如何下载文件的?
-
@JacobRoberts 通过 Azure 门户,我只需浏览并使用“下载”按钮,然后保存到桌面。如果我转到完整的 URL,它是一个损坏的图像。我可以通过 Azure SDK 上传相同的图像,它可以正常工作吗?所以它必须是代码中的东西
-
您可以尝试将流位置设置为 0,而不是 CloudBlockBlob,而是使用 CloudBlob,这对于您的图像大小来说应该足够了,直到一些 MB。
-
@MaheshJasti 我不确定如何设置流位置,因为我没有先读入内存,而且我不确定您使用
CloudBlob而不是BloudBlockBlob作为唯一位置是什么意思我创建的 blob 是CreateCloudBlobClient。你能给我一些你想让我修改的代码示例吗? -
在您的代码中,而不是 GetBlockBlobReference(FileName);,尝试使用 GetBlobReference("") 并继续使用 Blob 而不是 BlockBlob。
标签: c# azure azure-blob-storage