2017-12-28 22 views
0

Verwenden von ASP.NET MVC und SQL Server 2016. Ich habe Anlagen, die als Binärdaten in SQL Server gespeichert.ASP.NET MVC Liste der Anlagen (aus Binärdaten)

Tabelle mit Daten wie folgt aussieht:

attachment_ID | attachment_GUID | attachment_data | attachment_name| 
    --------------|------------------|-----------------|----------------| 
     211  | A893C2Z1-4C0 | 0x255044462... | file1.doc | 
     212  | A893C2R5-4F0 | 0x255044455... | file5.pdf | 

I Liste dieser Anhänge angezeigt werden müssen (Namen), als Hyperlinks in HTML-Seite. Wenn ich also auf den Namen des Anhangs klicke, sollte der Download-Vorgang gestartet werden.

Brauchen Sie Hilfe mit einem ASP.NET MVC-Controller.

Ich habe Controller, die eine Datei direkt heruntergeladen:

using System; 
using System.Data.SqlClient; 
using System.IO; 
using System.Web; 
using System.Web.Mvc; 
using System.Collections.Generic; 

namespace Project.SERVER.Controllers 
{ 
    public class AttachmenttoHTMLController : Controller 
    { 
     #region View attachments 
     [HttpGet] 
     public ActionResult Get() 
     { 
      SqlConnection connection = Project.SERVER.Classes.INT_DataBase.getConnection(); 
      SqlCommand command = new SqlCommand("SELECT * FROM AllAttachments WHERE document_GUID='F3A2AC32-D98D'", connection); 
      command.Dispose(); 

      SqlDataAdapter sqlDtAdptr = new SqlDataAdapter(command); 
      System.Data.DataTable result = new System.Data.DataTable(); 
      result.Dispose(); 
      sqlDtAdptr.Fill(result); 
      sqlDtAdptr.Dispose(); 
      connection.Dispose(); 
      connection.Close(); 

      if (result.Rows.Count > 0 && !System.Convert.IsDBNull(result.Rows[0]["attachment_data"])) 
      { 
       byte[] file = (byte[])result.Rows[0]["attachment_data"]; 
       Response.ContentType = result.Rows[0]["attachment_contentType"].ToString(); 

       return File(file, Response.ContentType, result.Rows[0]["attachment_fileName"].ToString()); 
      } 
      else return new EmptyResult(); 
     } 
     #endregion 
    } 
} 

Was soll ich mit dem Code hinzufügen, mit der Option zu erreichen Controller für Anlagenliste zum Download, wenn darauf geklickt?

Antwort

1

Sie müssen zuerst die Binärdaten in Image Format in Ihr Verzeichnisprojekt speichern.

Verwenden FileResult

HTML:

<div> 
    @Html.ActionLink("Download", "Download", "Home"); 
</div> 

Homecontroller:

public FileResult Download() 
    { 
     String path = HostingEnvironment.ApplicationPhysicalPath + "Image\\Capture.PNG"; 
     string fname= Path.GetFileName(path); 
     byte[] fileBytes = System.IO.File.ReadAllBytes(path); 
     string fileName = fname; 
     return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 

    } 

Unter der Annahme, dass Sie eine Liste in Ihrem Modell haben

List<Attachment> lst = new List<Attachment>(); 

Diese Liste enthält den Inhalt Ihrer Daten aus Ihrer Datenbank und speichert das Byte in imageformat in Ihrem Projektordner.

Ihr Code von oben sollte hier fallen das Byte mit einem Dateinamen sogar id .PNG oder irgendwelche gespeichert. Hinzufügen von lst.id und lst.filename für HTML-Zwecke.

public class Attachment 
     { 
      public int id { get; set; } 
      public string filename { get; set; } 
     } 

Ihre HTML wie folgt aussehen:

<table> 
@{ 
      if (Models.GetAttachment.lst.Count > 0) 
      { 
        for (int m = 0; m < Models.GetAttachment.lst.Count; m++) 
       { 
       <tr> 

        <td> 
         @Html.ActionLink("Download", "Download", new { id = Models.GetAttachment.lst.Coun[m].id }) 
        </td> 
       </tr> 
       } 
      } 


    } 
</table> 

Homecontroller Mit id:

public FileResult Download(int?id) 
     { 
      String path = HostingEnvironment.ApplicationPhysicalPath + "Image\\Capture.PNG"; 
      string fname= Path.GetFileName(path); 
      byte[] fileBytes = System.IO.File.ReadAllBytes(path); 
      string fileName = fname; 
      return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 

     } 

dem Zweck id für jeden Benutzer auf die Datei in Ihrem Projektverzeichnis zu finden.

+0

Angenommen, Ihr 'Capture.PNG' befindet sich innerhalb des' Image'-Ordners unter Ihrem Projektverzeichnis. –

+0

Wenn Sie viele Dateien von Ihrer DB haben, können Sie sie mit einer Schleife in Ihr HTML einfügen, um einen Link für jede einzelne Datei zu erstellen. –

+0

Ich brauchte eine Weile, um es herauszufinden und zu reproduzieren. Diese Lösung funktioniert, danke für Ihre Hilfe! – Dmitry