MVC3/EF4.1 Bindung httppostedFileBase zu modellieren und zu dB hinzuzufügen
-
25-10-2019 - |
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?
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");
- Sie müssen den später gespeicherten Pfad anpassen, da ASP.NET Sie nicht ermöglichen, Dateien aus dem Ordner app_data zu servieren.
- das
public ICollection<string> Filenames
soll dir nur eine Idee geben, aber du musst das wahrscheinlich ändernICollection<FileEntity> Files
.