2016-04-19 7 views
0

Ich weiß, das ist keine neue Frage, aber ich habe mir alle Themen angeschaut und konnte meine Antwort nicht finden. Mein Problem ist, dass ich Bilddaten in SQL db gespeichert habe, aber nicht auf Bearbeitungen oder Index (MVC 5) angezeigt werden kann. Kannst du mir bitte helfen, danke im Voraus. Hier sind meine Codes:Bilddatei aus der Datenbank mit Entitäten anzeigen Asp Net MVC C#

CONTROLLER

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "DrvId,FullName,Address,Postcode,Contact,Email,County,File,Date")] DriverReg driverReg, HttpPostedFileBase[] files) 
     { 
      if (ModelState.IsValid) 
      { 
       try 
       { 
        /*Lopp for multiple files*/ 
        foreach (HttpPostedFileBase file in files) 
        { 
         /*Geting the file name*/ 
         string filename = System.IO.Path.GetFileName(file.FileName); 
         /*Saving the file in server folder*/ 
         file.SaveAs(Server.MapPath("~/Content/UploadedFiles/" + filename)); 
         string filepathtosave = "UploadedFiles/" + filename; 
         /*HERE WILL BE YOUR CODE TO SAVE THE FILE DETAIL IN DATA BASE*/ 
        } 

        ViewBag.Message = "File Uploaded successfully."; 
       } 
       catch 
       { 
        ViewBag.Message = "Error while uploading the files."; 
       } 

       db.DriversReg.Add(driverReg); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(driverReg); 
     } 

MODEL

namespace HopeRemovalsFinal.Models 
{ 
    public class DriverReg 
    { 
     [Key] 
     public int DrvId { get; set; } 
     public string FullName { get; set; } 
     public string Address { get; set; } 
     public string Postcode { get; set; } 
     public string Contact { get; set; } 
     public string Email { get; set; } 
     public string County { get; set; } 
     [DataType(DataType.Upload)] 
     [Display(Name ="Upload File")] 
     [Required(ErrorMessage ="Please choose file to upload")] 
     public string File { get; set; } 
    // public string FileName { get; set; } 
     public DateTime Date { get; set; } 

    } 
    public class DriverDbContext : DbContext 
    { 
     public DriverDbContext() 
      : base("VanRemovals") 
     { 
     } 

     public static DriverDbContext Create() 
     { 
      return new DriverDbContext(); 
     } 

      public DbSet<DriverReg> DriversReg { get; set; } 

    } 
} 

DETAIL-ANSICHT

  <dt> 
       @Html.DisplayNameFor(model => model.File) 
      </dt> 

      <dd> 
       @Html.DisplayFor(model => model.File) 
      </dd> 

Datenbank Ergebnisse

Create New 
FullName Address  Postcode Contact  Email County Upload File  Date  
John manchester M32 7DD  098764587 [email protected] Lancashire uk_map.png 19/04/2016 00:00:00  Edit | Details | Delete 

Die UploadedFiles Ordner leer ist, aber die Datei zu db gespeichert wurde. Danke für Ihre Hilfe.

+0

Wenn Sie sagen "Datei Daten auf db" und "Datei wurde gespeichert", sprechen Sie über die Datei selbst in der db gespeichert wird? Oder speichern Sie den Speicherort im Dateisystem als Zeichenfolge in das Feld "Datei" – JDupont

+0

HALLO Jungs, ja die Datei wurde in der Datenbank gespeichert, kann aber nicht in der Detailansicht anzeigen – prezequias

+0

Sicher? Oder hast du nur den Namen gespeichert? –

Antwort

0

Es scheint seltsam, dass Create mehrere Dateien ermöglicht, während class DriverReg nur eine string File (oder Filename - ist im Moment nicht klar) hat, dass nicht eine Sammlung.

Ich würde sagen, Änderung Create Methode, um ein einzelnes Dateiobjekt zu akzeptieren.
Passen Sie bei Bedarf auch das Formular an, um nur eine Datei zu posten/hochzuladen.

Dann innen Create Änderung dieser:

string filepathtosave = "UploadedFiles/" + filename; 

dazu:

driverReg.File = "UploadedFiles/" + filename; 

Sie müssen möglicherweise mehr ändern, dass wir hier nicht sehen, aber ich denke, tun alle oben sollte mach es schon besser.

+0

Danke Peter, aber ich habe für die oben genannten geändert, und immer noch nur auf Datenbank, nicht auf UploadedFiles Ordner und kann auch keine Bilder angezeigt werden. – prezequias

+0

@prezequias Er hat zwar Recht. Ihr Modell erlaubt nur eine "Datei", von der wir nur annehmen können, dass Sie den Dateipfad in diesem Feld und nicht die Binärdatei-Daten speichern wollen. Sie übergeben ein gepostetes Dateiarray und durchlaufen sie. Erwarten Sie nur eine Datei? – JDupont

+0

Führt das Speichern der Datei zu einer Ausnahme? Wenn ja, überprüfen Sie die Zugriffsrechte für diesen Ordner. Oder wenn keine Ausnahme auftritt, wird sie vielleicht gespeichert, aber nicht dort, wo Sie danach suchen. –

1

Ich habe mehrere Fehler in Ihrem Code gefunden. So ... das ist meine Lösung:

Modell:

[DataType(DataType.Upload)] 
[Display(Name = "Upload File")] 
[Required(ErrorMessage = "Please choose file to upload")] 
[NotMapped] 
public HttpPostedFileBase File { get; set; } 

public string FileName { get; set; } 

Ausblick:

@Html.TextBoxFor(model => model.File, new { type = "file" }) 

Controller:

public ActionResult Create(DriverReg driverReg) 
{ 
    ... 
    var file = driverReg.File; 
    var fileName = "~/Content/UploadedFiles/" + file.FileName; 
    file.SaveAs(Server.MapPath(fileName)); 
    driverReg.FileName = fileName; 
    ... 
} 

Detailansicht:

<dt> 
    @Html.DisplayNameFor(model => model.File) 
</dt> 
<dd> 
    <img src="@Model.FileName" /> 
</dd> 
+1

'driverReg.FileName' wird mit MapPath auf einen absoluten Pfad gesetzt, wodurch es für das img-Tag unbrauchbar wird. Lieber einen relativen Pfad speichern. –

+0

@PeterB: Sicher, ich habe Korrektur gemacht. Vielen Dank –