Frage

Ich habe ein ActionResult, der Daten an das Modell bindet und es die DB fügt. Nun, ich möchte nun einen Datei -Uploader und das ActionResult haben, um die Dateien zu speichern und ihren Dateinamen zum DB hinzuzufügen (damit ich die Dateien/Bilder zu einem späteren Punkt anzeigen kann). Was ist der beste Ansatz? Hier ist, was ich so weit habe (es kann die Dateien speichern, aber ich bin mir nicht sicher, wie intelligent EF ist und wie komplex die Datentypen sein können):

Die Modellklasse:

    public class Annonce
{
    public int Id { get; set; }
    public string Company { get; set; }
    public string Size { get; set; }
    public IEnumerable<HttpPostedFileBase> FileUpload { get; set; }
}

Die Ansicht (mit 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>

Der Controller:

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

Dies speichert die Dateien gut. Nun, was ich will, ist, ist file.FileName Geschäfte in der DB sein. Zuerst würde ich, obwohl EF einfach die Dateien oder Dateinamen binden würde model.FileUpload zum dB. Aber ich denke, der Datentyp ist zu komplex? Also ich habe eine zu machen list<HttpPostedFileBase> und Hinzufügen der file.FileName dort? Oder erstellen Sie vielleicht eine ganz neue Entität/Tabelle, in der alle Dateinamen als Zeichenfolgen mit einem Referenz-ID gespeichert werden? Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie die tatsächlichen Dateiinhalte in der Datenbank speichern möchten. Also würde ich so etwas tun wie:

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. Sie müssen den später gespeicherten Pfad anpassen, da ASP.NET Sie nicht ermöglichen, Dateien aus dem Ordner app_data zu servieren.
  2. das public ICollection<string> Filenames soll dir nur eine Idee geben, aber du musst das wahrscheinlich ändern ICollection<FileEntity> Files.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top