MVC3/EF4.1 Unking httppostedFileBase para modelar y agregando a DB
-
25-10-2019 - |
Pregunta
Tengo un ActionResult que une datos al modelo y lo agrega el DB. Ahora lo que quiero es tener un cargador de archivos y ActionResult para almacenar los archivos y agregar su nombre de archivo al DB (para que pueda mostrar los archivos/imágenes en un punto posterior). ¿Cuál es el mejor enfoque? Esto es lo que obtuve hasta ahora (puede almacenar los archivos, pero no estoy seguro de cuán inteligente es EF y cuán complejos pueden ser los tipos de datos):
La clase modelo:
public class Annonce
{
public int Id { get; set; }
public string Company { get; set; }
public string Size { get; set; }
public IEnumerable<HttpPostedFileBase> FileUpload { get; set; }
}
La vista (usando Mircosoft.web.helpers):
@using (Html.BeginForm("Create", "Annonce", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Annonce</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Company)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company)
@Html.ValidationMessageFor(model => model.Company)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Size)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Size)
@Html.ValidationMessageFor(model => model.Size)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.FileUpload)
</div>
<div class="editor-field">
@FileUpload.GetHtml(uploadText: "Opret")
</div>
</fieldset>
El controlador:
[HttpPost]
public ActionResult Create(Annonce annonce)
{
if (ModelState.IsValid)
{
//System.IO stuff
foreach (var file in annonce.FileUpload)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
}
}
//Database stuff
db.Annoncer.Add(annonce);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(annonce);
}
Esto almacena los archivos bien. Ahora lo que quiero, es file.FileName
ser tiendas en el DB. Al principio, pensé que EF simplemente uniría los archivos o los nombres de archivo desde model.FileUpload
al DB. ¿Pero supongo que el tipo de datos es demasiado complejo? Así que pensé en hacer un list<HttpPostedFileBase>
y agregar el file.FileName
¿allá? ¿O tal vez crear una entidad/tabla completamente nueva donde todos los nombres de archivo se almacenan como cadenas con un ID de referencia? ¿Alguna sugerencia?
Solución
No creo que desee guardar el contenido real del archivo en la base de datos. Entonces haría algo como:
public class AnnonceFile
{
public string filename {get;set;}
}
public class Annonce
{
public int Id { get; set; }
public string Company { get; set; }
public string Size { get; set; }
public ICollection<AnnonceFile> Filenames{ get; set; }
}
//System.IO stuff
foreach (var file in files)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
annonce.Filenames.Add( new AnnonceFile {filename = path});
}
}
//Database stuff
db.Annoncer.Add(annonce);
db.SaveChanges();
return RedirectToAction("Index");
- Debe ajustar la ruta guardada después, ya que ASP.NET no le permitirá servir archivos desde la carpeta APP_DATA.
- la
public ICollection<string> Filenames
es solo darle una idea, pero probablemente necesite cambiar eso enICollection<FileEntity> Files
.