我设法成功上传了一张图像,并且验证和上传过程正常进行,但是由于我尝试上传多张图像,因此没有验证或上传工作。
是称为“ ProductImage”的模型,它代表应该保存在磁盘和数据库中的“图像”对象。
public class ProductImage
{
public int ID { get; set; }
[Display(Name = "File")]
[StringLength(100)]
[Index(IsUnique = true)]
public string FileName { get; set; }
}
}
及其ProductImage的 controller (将接收的文件作为“ HttpPostedFileBase [] files”)通过它们,检查1-null和2-file的长度,如果它们是true,则检查使用ValidateFile()检查文件是否为jpeg,png和...并且小于2mb,如果文件有效,则将文件保存在磁盘中,然后继续将文件保存在数据库中,否则会引发错误消息。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Upload(HttpPostedFileBase[] files)
{
bool allValid = true;
string inValidFiles = "";
//check the user has entered a file
if (files[0] != null)
{
//if the user has entered less than ten files
if (files.Length <= 10)
{
//check they are all valid
foreach (var file in files)
{
if (!ValidateFile(file))
{
allValid = false;
inValidFiles += ", " + file.FileName;
}
}
//if they are all valid then try to save them to disk
if (allValid)
{
foreach (var file in files)
{
try
{
SaveFileToDisk(file);
}
catch (Exception)
{
ModelState.AddModelError("FileName", "Sorry ,and error has occured saving the file to disk,please try again.");
}
}
}
//else add an error listing out the invalid files
else
{
ModelState.AddModelError("FileName", "All files must be gif,png,jpeg or jpg and less than 2mb in size.The following files" + inValidFiles + "are not valid");
}
}
//the user has entered more than 10 files
else
{
ModelState.AddModelError("FileName", "Please only upload up to ten files at a time");
}
}
//if the user has not entered a file return an error message
else
{
ModelState.AddModelError("FileName", "Please choose a file");
}
if (ModelState.IsValid)
{
bool duplicates = false;
bool otheDbError = false;
string dublicatesFiles = "";
foreach (var file in files)
{
//try and save each file
var productToAdd = new ProductImage { FileName = file.FileName };
try
{
db.ProductImages.Add(productToAdd);
db.SaveChanges();
}
//if there is an exception check if it is caused by a duplicate file
catch (DbUpdateException ex)
{
SqlException innException = ex.InnerException.InnerException as SqlException;
if (innException != null && innException.Number == 2601)
{
dublicatesFiles += ", " + file.FileName;
duplicates = true;
}
else
{
otheDbError = true;
}
}
}
//add a list of duplicate files to the error message
if (duplicates)
{
ModelState.AddModelError("FileName", "All files uploaded except the files" + dublicatesFiles + "which already exist in the system." + "please delete them and try again if you wish to re-add them");
return View();
}
else if (otheDbError)
{
ModelState.AddModelError("FileName","Sorry an error has occurred saving to the database ,please try again ");
return View();
}
}
return RedirectToAction("Index");
}
这些是 helper方法:ValidateFile()和SaveFileToDisk()
private bool ValidateFile(HttpPostedFileBase file)
{
string FileExtension = System.IO.Path.GetExtension(file.FileName).ToLower();
string[] allowedFileTypes = { ".gif", ".png", ".jpeg", "jpg" };
if ((file.ContentLength > 0 && file.ContentLength < 2097152) && allowedFileTypes.Contains(FileExtension))
{
return true;
}
return false;
}
private void SaveFileToDisk(HttpPostedFileBase file)
{
WebImage img = new WebImage(file.InputStream);
if (img.Width > 190)
{
img.Resize(190, img.Height);
}
img.Save(Constants.ProductImagePath + file.FileName);
if (img.Width > 100)
{
img.Resize(100, img.Height);
}
img.Save(Constants.ProductThumbnailPath + file.FileName);
}
}
}
并且我还更新了Upload.chtml页面中的“ multiple”属性,以允许更新一些文件
<input type="file" name="files" id="files" multiple="multiple" class="form-control"/>
现在不管我做什么,上传正确或错误的文件,而不是显示错误消息或将其保存在databse或磁盘中,它只执行了最后一行代码
return RedirectToAction("Index");
返回索引页面,出什么问题了?