2016-05-18 6 views
1

Ich habe eine Liste von PDF-Dateien auf der Website (asp.net Webforms). Ich möchte sie mit der Option Speichern unter öffnen, statt direkt herunterzuladen.Öffnen Sie PDF-Datei mit Speichern als Option in asp.net Webformular

Ich habe versucht, download -Eigenschaft zu der Verknüpfung hinzuzufügen, die nicht funktioniert hat. nur war anscheinend HTTPHandler für *.pdf Anfrage.

sah ich ein Stück Code für MVC basierend Beispiel here

return new FileStreamResult(stream, "application/pdf") 
{ 
    FileDownloadName = "file.pdf" 
}; 

, wie ich das so, dass es offene PDF-Dateien mit Speichern unter Option Httphandler in as.net webform umwandeln kann.

Ich möchte es in einer Weise tun, so dass, wenn jemals Benutzer auf eine PDF-Datei zu dieser Zeit Handler in Aktion treten sollte.

OR

kann ich eine andere Datei handlePDF.aspx erstellen und Code schreiben, auch und wird Link von pdf-Datei ändern unten

<a href="handlePDF.aspx?file=file1.pdf">File One </a> 

Antwort

2

Wenn das, was Sie versuchen zu tun ist, wenn sie klicken Sie auf der Datei Download-Link erscheint es mit save as oder open Dialogfeld, dies ist mit der Browser-Konfiguration des Benutzers zu tun. Im Falle von PDFs glaube ich, dass Firefox open in tab als Standardoption hat. Wenn Sie versuchen, die Datei als Datei-Stream zu übertragen, wird sie wahrscheinlich auch in eine neue Registerkarte geladen.

tl; dr: Client Randproblem

+0

Kann diese Option nicht verwenden, da es Clientanforderung ist, können wir nicht jeden Browser konfigurieren. Ich will es vermeiden, da es auf dem Server schwer ist, pdf als einen Strom zu senden, Serverressourcen zu nehmen. – Learning

+0

Haben Sie den Ansatz 'File One 'versucht? –

+0

Ich muss zuerst 'handlePDF.aspx' erstellen, sonst wird der Fehler Seite nicht gefunden. Ich habe bereits versucht, "target =" _ blank "' vorher auf den Link herunterzuladen, es funktioniert nicht – Learning

1

Sie auf dem richtigen Weg sind. Serving PDF-Dateien werden in der Regel von einem HttpHandler behandelt. Das heißt, es sei denn, sie können direkt aus dem Dateisystem von StaticHandler ...

bedient werden Der Schlüssel, der benötigt wird, damit der Browser den "Öffnen oder Speichern" -Dialog aufrufen kann, ist der Content-Disposition Header in der Antwort .

Hier ist ein (nicht getestet) Implementierung, die Sie auf dem richtigen Weg bekommen sollten:

public void ProcessRequest(HttpContext context) 
{ 
    string fileName = context.Request.QueryString["file"]; 
    if(fileName == null || fileName == "") 
    { 
     throw new ArgumentException("The file argument cannot be null or empty"); 
    } 

    // fetch file here from db/filesystem/other storage 
    byte[] fileBytes = LoadFileBytes(fileName); 

    context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 
    context.Response.ContentType = "application/pdf"; 
    context.Response.BinaryWrite(fileBytes); 
} 

Wenn Sie im Speicher puffern die gesamte Datei vermeiden wollen, dies auch (benötigt für die .Net 4.0 funktionieren könnte CopyTo Methode auf dem Strom):

public void ProcessRequest(HttpContext context) 
{ 
    string fileName = context.Request.QueryString["file"]; 
    if(fileName == null || fileName == "") 
    { 
     throw new ArgumentException("The file argument cannot be null or empty"); 
    } 

    // fetch file stream from db/filesystem/other storage 
    Stream fileStream = GetFileStream(fileName); 

    context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 
    context.Response.ContentType = "application/pdf"; 
    fileStream.CopyTo(context.Response.OutputStream); 
}