問題描述
我找到了一些代碼來執行此操作并嘗試將其實現到我的項目中,但到目前為止它一直沒有成功.我沒有收到任何錯誤,但我沒有看到任何圖像存儲在 Visual Studio 內的圖像目錄中.
I've found some code to do this and tried to implement it into my project, but so far it has been unsuccessful. I don't get any errors, but I don't see any images being stored in my images directory inside 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 塊下方的部分工作正常.這只是將文本區域的內容保存到數據庫中.有什么想法嗎?我需要對我的模型進行任何更改嗎?
The part below the if block works fine. That just saves the content of a textarea to the database. Any thoughts? Do I need to make any changes to my model?
型號:
[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; }
}
推薦答案
您的文件未發布,因為您在表單上沒有必要的 enctype
屬性.更改要使用的視圖
Your file is not being posted because you do not have the necessary enctype
attribute on the form. Change the view to use
@using (Html.BeginForm("Create", "Testimonials", FormMethod.Post, new { enctype = "multipart/form-data" }))
您現在將獲取文件并保存它,但與您的 Testimonials
對象沒有關系,因此您無法檢索它.您需要在 Testimonials
表中添加其他字段來存儲文件屬性(如果 Testimonials
可以有多個圖像,則需要一個單獨的表).我還建議您使用唯一標識符將文件保存到您的服務器(例如,一個 Guid
以防止在 2 個用戶上傳同名文件時意外覆蓋).您修改后的模型可能是
You will now get the file and save it, but there is no relationship to your Testimonials
object so you cannot retrieve it. You will need to add additional fields in your Testimonials
table to store the file properties (or a separate table if a Testimonials
can have multiple images). I also recommend you save the file to your server with a unique identifier (e.g. a Guid
to prevent accidental overwriting if 2 users upload files with the same name). You revised model might be
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;放;}
以便您可以強綁定到模型并添加驗證屬性(例如 [FileSize]
屬性,假設您不希望允許用戶上傳 2GB 文件).您的控制器方法將是
I would also recommend using a view model for the view that includes the above properties plus public HttpPostedFileBase Image { get; set; }
so that you can strongly bind to the model and add validation attributes (for example a [FileSize]
attribute assuming you do not want to allow users to upload 2GB files). Your controller method would then be
[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");
}
這篇關于ASP.NET MVC 上傳圖片的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!