ASP.NET MVC上传图片
ASP.NET MVC upload image
我找到了一些代码来执行此操作并尝试将其实现到我的项目中,但到目前为止还没有成功。我没有收到任何错误,但我没有看到任何图像存储在 visual studio.
的图像目录中
查看:
@using (Html.BeginForm())
{
<span>Please enter your story here:</span>
<textarea id="testimonial" name="testimonial"></textarea>
<button type="submit">Submit</button>
<input type="file" name="file" />
}
控制器:
[HttpPost]
public ActionResult Create(Testimonials testimonials)
{
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
file.SaveAs(path);
}
}
TestimonialsContext testContext = new TestimonialsContext();
testContext.testimonialContext.Add(testimonials);
testContext.SaveChanges();
return RedirectToAction("Index");
}
if 块下面的部分工作正常。这只是将文本区域的内容保存到数据库中。有什么想法吗?我需要对模型进行任何更改吗?
型号:
[Table("Testimonials")]
public class Testimonials
{
public int Id { get; set; }
public string Testimonial { get; set; }
}
上下文 class:
public class TestimonialsContext:DbContext
{
public DbSet<Testimonials> testimonialContext { get; set; }
}
您的文件未发布,因为您在表单上没有必要的 enctype
属性。更改视图以使用
@using (Html.BeginForm("Create", "Testimonials", FormMethod.Post, new { enctype = "multipart/form-data" }))
您现在将获取文件并保存它,但与您的 Testimonials
对象没有关系,因此您无法检索它。您将需要在 Testimonials
table 中添加其他字段以存储文件属性(如果 Testimonials
可以有多个图像,则需要单独的 table)。我还建议您使用唯一标识符将文件保存到您的服务器(例如 Guid
以防止在 2 个用户上传同名文件时意外覆盖)。您修改后的模型可能是
public class Testimonials
{
public int Id { get; set; }
public string Testimonial { get; set; }
public string ImagePath { get; set; }
public string ImageDisplayName { get; set; }
}
我还建议为视图使用包含上述属性和 public HttpPostedFileBase Image { get; set; }
的视图模型,以便您可以强绑定到模型并添加验证属性(例如 [FileSize]
属性假设您不想让用户上传 2GB 的文件)。您的控制器方法将是
[HttpPost]
public ActionResult Create(TestimonialVM model)
{
// ModelState.IsValid check omitted
Testimonials testimonials = new Testimonials();
// map view model properties to the data model
....
if (model.Image != null && model.Image.ContentLength > 0)
{
string displayName = model.Image.FileName;
string fileExtension = Path.GetExtension(displayName);
string fileName = string.Format("{0}.{1}", Guid.NewGuid(), fileExtension)
string path = Path.Combine(Server.MapPath("~/Images/"), fileName)
model.Image.SaveAs(path);
// Update data model
testimonials.ImagePath = path;
testimonials.ImageDisplayName = displayName;
}
TestimonialsContext testContext = new TestimonialsContext();
testContext.testimonialContext.Add(testimonials);
testContext.SaveChanges();
return RedirectToAction("Index");
}
我找到了一些代码来执行此操作并尝试将其实现到我的项目中,但到目前为止还没有成功。我没有收到任何错误,但我没有看到任何图像存储在 visual studio.
的图像目录中查看:
@using (Html.BeginForm())
{
<span>Please enter your story here:</span>
<textarea id="testimonial" name="testimonial"></textarea>
<button type="submit">Submit</button>
<input type="file" name="file" />
}
控制器:
[HttpPost]
public ActionResult Create(Testimonials testimonials)
{
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
file.SaveAs(path);
}
}
TestimonialsContext testContext = new TestimonialsContext();
testContext.testimonialContext.Add(testimonials);
testContext.SaveChanges();
return RedirectToAction("Index");
}
if 块下面的部分工作正常。这只是将文本区域的内容保存到数据库中。有什么想法吗?我需要对模型进行任何更改吗?
型号:
[Table("Testimonials")]
public class Testimonials
{
public int Id { get; set; }
public string Testimonial { get; set; }
}
上下文 class:
public class TestimonialsContext:DbContext
{
public DbSet<Testimonials> testimonialContext { get; set; }
}
您的文件未发布,因为您在表单上没有必要的 enctype
属性。更改视图以使用
@using (Html.BeginForm("Create", "Testimonials", FormMethod.Post, new { enctype = "multipart/form-data" }))
您现在将获取文件并保存它,但与您的 Testimonials
对象没有关系,因此您无法检索它。您将需要在 Testimonials
table 中添加其他字段以存储文件属性(如果 Testimonials
可以有多个图像,则需要单独的 table)。我还建议您使用唯一标识符将文件保存到您的服务器(例如 Guid
以防止在 2 个用户上传同名文件时意外覆盖)。您修改后的模型可能是
public class Testimonials
{
public int Id { get; set; }
public string Testimonial { get; set; }
public string ImagePath { get; set; }
public string ImageDisplayName { get; set; }
}
我还建议为视图使用包含上述属性和 public HttpPostedFileBase Image { get; set; }
的视图模型,以便您可以强绑定到模型并添加验证属性(例如 [FileSize]
属性假设您不想让用户上传 2GB 的文件)。您的控制器方法将是
[HttpPost]
public ActionResult Create(TestimonialVM model)
{
// ModelState.IsValid check omitted
Testimonials testimonials = new Testimonials();
// map view model properties to the data model
....
if (model.Image != null && model.Image.ContentLength > 0)
{
string displayName = model.Image.FileName;
string fileExtension = Path.GetExtension(displayName);
string fileName = string.Format("{0}.{1}", Guid.NewGuid(), fileExtension)
string path = Path.Combine(Server.MapPath("~/Images/"), fileName)
model.Image.SaveAs(path);
// Update data model
testimonials.ImagePath = path;
testimonials.ImageDisplayName = displayName;
}
TestimonialsContext testContext = new TestimonialsContext();
testContext.testimonialContext.Add(testimonials);
testContext.SaveChanges();
return RedirectToAction("Index");
}