2013-11-14 5 views
13

Ich habe eine Webseite mit einer Tabelle von Objekten.Datei von Link in meiner Webseite herunterladen

Eine meiner Objekteigenschaften ist der Dateipfad, diese Datei befindet sich im selben Netzwerk. Was ich tun möchte, ist diesen Dateipfad unter dem Link (zum Beispiel Download) einzupacken und nachdem der Benutzer auf diesen Link geklickt hat, wird die Datei auf den Benutzerrechner heruntergeladen.

so in meinem Tisch:

@foreach (var item in Model) 
     {  
     <tr> 
      <th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th> 
      <td width="1000">@item.fileName</td> 
      <td width="50">@item.fileSize</td> 
      <td bgcolor="#cccccc">@item.date<td> 
     </tr> 
    } 
    </table> 

ich diesen Download-Link erstellt:

<th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th> 

Ich möchte diesen Download-Link zu meinem file path wickeln und klicken Sie auf thie Link wird auf mein Controller anlehnen:

public FileResult Download(string file) 
{ 
    byte[] fileBytes = System.IO.File.ReadAllBytes(file); 
} 

Was muss ich meinem Code hinzufügen, um das zu erreichen?

Antwort

24

Geben Sie FileContentResult von Ihrer Aktion zurück.

public FileResult Download(string file) 
{ 
    byte[] fileBytes = System.IO.File.ReadAllBytes(file); 
    var response = new FileContentResult(fileBytes, "application/octet-stream"); 
    response.FileDownloadName = "loremIpsum.pdf"; 
    return response; 
} 

Und der Download-Link,

<a href="controllerName/[email protected]" target="_blank">Download</a> 

Dieser Link wird eine GET-Anfrage an Ihre Download-Aktion mit dem Parameter filename machen.

EDIT: für Dateien nicht gefunden Sie können,

public ActionResult Download(string file) 
{ 
    if (!System.IO.File.Exists(file)) 
    { 
     return HttpNotFound(); 
    } 

    var fileBytes = System.IO.File.ReadAllBytes(file); 
    var response = new FileContentResult(fileBytes, "application/octet-stream") 
    { 
     FileDownloadName = "loremIpsum.pdf" 
    }; 
    return response; 
} 
+0

Und wie, dass dieser Controller, um sicherzustellen, mothed meinen Dateipfad empfangen? Was muss ich aus meiner Sicht hinzufügen? – user2978444

+0

Sie haben bereits einen Link, der nur eine GET-Anfrage Ihre controller/Aktions auf das href Attribut gesetzt machen kann – mecek

+0

ich nun Methode meines Controller erreichen kann, aber die Datei ist null:

Download

user2978444

0

In der Ansicht schreiben:

<a href="/ControllerClassName/DownloadFile?file=default.asp" target="_blank">Download</a> 

In der Steuerung schreiben:

public FileResult DownloadFile(string file) 
    { 
     string filename = string.Empty; 
     Stream stream = ReturnFileStream(file, out filename); //here a backend method returns Stream 
     return File(stream, "application/force-download", filename); 
    } 
0

Dieses Beispiel funktioniert gut für mich:

public ActionResult DownloadFile(string file="") 
     { 

      file = HostingEnvironment.MapPath("~"+file); 

      string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      var fileName = Path.GetFileName(file); 
      return File(file, contentType,fileName);  

     } 

Ausblick:

<script> 
function SaveImg() 
{ 
    var fileName = "/upload/orders/19_1_0.png"; 
    window.location = "/basket/DownloadFile/?file=" + fileName; 
} 
</script> 
<img class="modal-content" id="modalImage" src="/upload/orders/19_1_0.png" onClick="SaveImg()">