C# ASP.NET MVC上载图像

C# ASP.NET MVC上载图像,c#,asp.net-mvc,upload,C#,Asp.net Mvc,Upload,我已经找到了一些代码来实现这一点,并尝试将其实现到我的项目中,但到目前为止还没有成功。我没有收到任何错误,但我没有看到任何图像存储在VisualStudio中的images目录中 视图: if块下面的部分工作正常。这只是将textarea的内容保存到数据库中。有什么想法吗?我需要对我的模型进行任何更改吗 型号: [Table("Testimonials")] public class Testimonials { public int Id { get; set; } publi

我已经找到了一些代码来实现这一点,并尝试将其实现到我的项目中,但到目前为止还没有成功。我没有收到任何错误,但我没有看到任何图像存储在VisualStudio中的images目录中

视图:

if块下面的部分工作正常。这只是将textarea的内容保存到数据库中。有什么想法吗?我需要对我的模型进行任何更改吗

型号:

[Table("Testimonials")]
public class Testimonials
{
    public int Id { get; set; }
    public string Testimonial { get; set; }
}
上下文类:

public class TestimonialsContext:DbContext
{
    public DbSet<Testimonials> testimonialContext { get; set; }
}
公共类证明上下文:DbContext
{
公共数据库集上下文{get;set;}
}

由于表单上没有必要的
enctype
属性,因此未过账您的文件。将视图更改为使用

@using (Html.BeginForm("Create", "Testimonials", FormMethod.Post, new { enctype = "multipart/form-data" }))
现在,您将获取并保存该文件,但它与您的
证明文件
对象没有关系,因此您无法检索它。您需要在
推荐信
表中添加其他字段来存储文件属性(如果
推荐信
可以有多个图像,则需要单独的表)。我还建议您使用唯一标识符(例如
Guid
)将文件保存到服务器,以防止在两个用户上载同名文件时意外覆盖。您修改的模型可能是

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中没有更新…在visual studio中,单击文件夹(图像),然后单击解决方案资源管理器选项中的“显示所有文件”。它将显示所有文件,即使这些文件未添加到项目中。您需要单击“刷新”以显示新添加的文件。您的文件将不会发送到服务器,因为您尚未将
enctype=“multipart/form data”
属性添加到form@StephenMuecke谢谢,我做到了。现在,我想知道如何将此文件路径添加到与推荐表相同的表中的数据库中。现在我得到的只是System.Web.HttpPostedFileWrapper。如何传入路径字符串以将其与证明文件同时添加到数据库中?顺便说一句,我更新了我的代码,以反映到目前为止我所做的更改。你不能只更改原始问题,我已回滚更改(我以前的评论没有意义,没有人可以添加答案)。如果你有一个新问题,那就问一个新问题。嘿,伙计,很抱歉花了这么长时间才回复你。到目前为止,我的问题是“file.SaveAs(path)”。名称“file”在当前上下文中不存在。我尝试在它上面的两行后面添加分号,但仍然无效…感谢您的帮助。很抱歉,它的
model.Image.SaveAs(path);
:)-请参阅updateNow I get“字符串或二进制数据将被截断。语句已终止。“我对您的方式有问题,因此我修改了原始方式以包含您的编辑。我没有使用鉴定VM,而是保留了原始方法,而没有使用“model.Image”,我将其称为在参数中创建的对象(public ActionResult Create(Certificationals Certificationals,HttpPostedFileBase Certificational_ImgName))。我很好奇,在保存更改时是否需要声明ImagePath=path和ImageDisplayNAme=displayName?好的,所以我意识到错误是我的表不允许足够的字符。奇怪的是,我认为varchar(100)就足够了。谢谢你的帮助,你摇滚!你的代码中的
file.SaveAs(path);
和我的答案中的
model.Image.SaveAs(path);
没有区别,所以错误与我显示的代码无关。
public class Testimonials
{
    public int Id { get; set; }
    public string Testimonial { get; set; }
    public string ImagePath { get; set; }
    public string ImageDisplayName { get; set; }
}
[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");
}