Question

J'ai un ActionResult qui lie les données au modèle et ajoute la DB. Maintenant, ce que je veux, est d'avoir un téléchargeur de fichier et le ActionResult pour stocker les fichiers et en ajoutant leur nom à la DB (donc je peux montrer les fichiers / images à un point plus tard). Quelle est la meilleure approche? Voici ce que je suis arrivé à ce jour (il peut stocker les fichiers, mais je ne suis pas sûr de savoir comment est intelligente EF et la complexité des types de données peut être):

La classe modèle:

    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 vue (en utilisant 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>

Le contrôleur:

[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);
    }

stocke les fichiers très bien. Maintenant, ce que je veux, est file.FileName être stocke dans la db. Au début, je pensais EF serait tout simplement lier les fichiers ou les noms de fichiers model.FileUpload à la DB. Mais je suppose que le type de données est trop complexe? Donc je pensais de faire un list<HttpPostedFileBase> et en ajoutant le file.FileName là? Ou peut-être créer une toute nouvelle entité / table où tous les noms de fichiers sont stockés sous forme de chaînes avec une référence Id? Toutes les suggestions?

Était-ce utile?

La solution

Je ne pense pas que vous voulez enregistrer le contenu du fichier réel dans la base de données. Donc, je ferais quelque chose comme:

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. Vous devez ajuster le tracé enregistré à la suite, car asp.net ne vous permettra pas de servir des fichiers à partir du dossier App_Data.
  2. le public ICollection<string> Filenames est juste pour vous donner une idée, mais vous avez probablement besoin de changement dans ICollection<FileEntity> Files.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top