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?

¿Fue útil?

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");  
  1. Debe ajustar la ruta guardada después, ya que ASP.NET no le permitirá servir archivos desde la carpeta APP_DATA.
  2. la public ICollection<string> Filenames es solo darle una idea, pero probablemente necesite cambiar eso en ICollection<FileEntity> Files.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top