Frage

Meine App generiert PDFs zur Benutzernutzung.Der HTTP-Header „Content-Disposition“ wird wie erwähnt gesetzt Hier.Dies ist auf „inline;filename=foo.pdf“, was ausreichen sollte, damit Acrobat beim Speichern des PDFs „foo.pdf“ als Dateinamen angeben kann.

Wenn Sie jedoch im im Browser eingebetteten Acrobat auf die Schaltfläche „Speichern“ klicken, ist der Standardname zum Speichern nicht dieser Dateiname, sondern die URL mit den in Unterstriche geänderten Schrägstrichen.Riesig und hässlich.Gibt es eine Möglichkeit, diesen Standarddateinamen in Adobe zu beeinflussen?

Die URLs enthalten eine Abfragezeichenfolge, die nicht verhandelbar ist.Dies kann von Bedeutung sein, aber das Hinzufügen von „&foo=/title.pdf“ am Ende der URL hat keinen Einfluss auf den Standarddateinamen.

Update 2:Ich habe beides ausprobiert

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; filename=foo.pdf

Und

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; name=foo.pdf

(wie durch Firebug überprüft) Leider hat weder das eine noch das andere funktioniert.

Eine Beispiel-URL ist

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

Dies entspricht einem standardmäßigen Acrobat-Dateinamen zum Speichern unter

http___localhost_bar_sessions_958d8a22-0_views_1493881172_export_format=application_pdf&no-attachment=true.pdf

Update 3:Julian Reschke bringt tatsächliche Einsicht und Genauigkeit in diesen Fall ein.Bitte stimmen Sie seiner Antwort zu.Dies scheint in FF kaputt zu sein (https://bugzilla.mozilla.org/show_bug.cgi?id=433613) und IE, funktionieren aber in Opera, Safari und Chrome. http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

War es hilfreich?

Lösung

Ein Teil des Problems ist, dass die entsprechende RFC 2183 href="http://greenbytes.de/tech/webdav/rfc2183.html" nicht wirklich sagen, was mit einer Disposition Art von „inline“ und einem Dateinamen zu tun.

Auch, soweit ich das beurteilen kann, ist die einzige UA, die tatsächlich die Dateinamen für Typen verwendet = inline ist Firefox (siehe Testfall ).

Schließlich ist es nicht offensichtlich, dass das Plugin API tatsächlich macht diese Informationen zur Verfügung (vielleicht someboy mit der API vertraut erarbeiten können).

Dass gesagt wird, ich habe einen Zeiger auf diese Frage zu einem Adobe Person gesendet; vielleicht die richtigen Leute einen Blick.

Siehe auch: siehe Versuch Content-Disposition zu klären, in HTTP in Testfall , hinzugefügt, dass der Acrobat Reader, um anzuzeigen, scheint Plugin nicht die Antwort-Header verwenden (in Firefox), obwohl die Plugin-API Zugang zu ihnen bietet.

Andere Tipps

Stellen Sie den Dateinamen in Content als auch. Dies sollte das Problem lösen.

context.Response.ContentType = "application/pdf; name=" + fileName;
// the usual stuff
context.Response.AddHeader("content-disposition", "inline; filename=" + fileName);

Nach dem Content-Disposition-Header gesetzt, auch Content-Length-Header hinzufügen, dann Binary verwenden, um die PDF zu streamen.

context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());
context.Response.BinaryWrite(fileBytes);

Wie Sie, Ich habe versucht und versucht, diese Arbeit zu bekommen. Schließlich gab ich auf diese Idee, und entschied sich nur für dieses Problem zu umgehen.

Ich bin mit ASP.NET MVC-Framework, so modifizierte ich meine Routen für diesen Controller / Aktion, um sicherzustellen, dass die serviert PDF-Datei ist der letzte Teil des Standorts Teils des URI (vor dem Abfrage-String), und alles andere in die Query-String übergeben.

Beispiel:

Alt URI:

http: // server / app / Bericht / showpdf param1 = foo & param2 = bar & filename = myreport.pdf

New URI:

http: // server / app / Bericht / showpdf / myreport. pdf? param1 = foo & param2 = bar

Der resultierende Header sieht genau wie das, was Sie beschrieben haben (content-type application / pdf, Disposition inline ist, Dateiname ist unnütz Teil des Headers). Acrobat zeigt sie im Browser-Fenstern (ohne Speicher als Dialog) und der Dateinamen, die automatisch gefüllt ist, wenn ein Benutzer die Acrobat Speichern-Schaltfläche klickt ist der Bericht Dateiname.

Ein paar Überlegungen:

für den Dateinamen, um anständig aussehen, sollten sie keine Zeichen entgangen (dh keine Leerzeichen, usw.) ... was ein wenig zu begrenzen ist. Meine Dateinamen werden in diesem Fall automatisch generiert und vor Räume in ihnen hatten, die als ‚% 20ern wurden zeigt sich in das zum Speichern Dialog Dateinamen. Ich ersetzte die Räume mit Unterstrichen, und das funktioniert.

Dies ist kein Name die beste Lösung, aber es funktioniert. Es bedeutet auch, dass Sie die Dateinamen haben, zur Verfügung haben, um es einen Teil der ursprünglichen URI zu machen, die möglicherweise Chaos mit Workflow Ihres Programms. Wenn es zur Zeit aus einer Datenbank während der serverseitigen Aufruf erzeugt oder abgerufen werden, die das PDF erzeugt, müssen Sie den Code verschieben, die den Dateinamen Javascript als Teil eines Formulars Vorlage erzeugt, oder wenn es aus einer Datenbank kommt es ein schneller ajax-Aufruf die Dateinamen zu erhalten, wenn die URL erstellen, die in der inlined PDF zur Folge hat.

Wenn Sie die Dateinamen von einer Benutzereingabe in einem Formular nehmen, dann ist das validiert werden soll nicht entgangen Zeichen enthalten, welche Benutzer verärgern wird.

Ich hoffe, das hilft.

Versuchen Sie die Dateinamen am Ende der URL platzieren, bevor andere Parameter. Das funktionierte für mich. http://www.setasign.de/support/ Tipps-und-Trick / Dateiname-in-Browser-Plugin /

Ändern Sie in ASP.NET 2.0 die URL von

http://www. server.com/DocServe.aspx?DocId=XXXXXXX

Zu

http://www. server.com/DocServe.aspx/MySaveAsFileName?DocId=XXXXXXX

Dies funktioniert für Acrobat 8 ​​und der Standarddateiname „SaveAs“ lautet jetzt MySaveAsFileName.pdf.

Sie müssen jedoch die zulässigen Zeichen einschränken MySaveAsFileName (keine Punkte usw.).

Apache mod_rewrite kann dieses Problem lösen.

Ich habe einen Web-Service mit einem Endpunkt bei /foo/getDoc.service. Natürlich wird Acrobat-Dateien als getDoc.pdf speichern. Ich fügte hinzu, die folgenden Zeilen in apache.conf:

LoadModule     RewriteModule         modules/mod_rewrite.so
RewriteEngine  on
RewriteRule    ^/foo/getDoc/(.*)$    /foo/getDoc.service     [P,NE]

Wenn ich jetzt /foo/getDoc/filename.pdf?bar&qux verlangen, wird es intern zu /foo/getDoc.service?bar&qux neu geschrieben, so dass ich treffe den richtigen Endpunkt des Web-Service, aber Acrobat denkt, dass es meine Datei als filename.pdf retten wird.

Wenn Sie asp.net verwenden, können Sie PDF-Dateinamen durch Seite (url) Dateinamen steuern. Wie andere Benutzer geschrieben, ist Acrobat etwas s ... wenn es die PDF-Dateinamen wählen, wenn Sie „Speichern“ Taste drücken: nimmt es den Namen der Seite, entfernt die Erweiterung und „.pdf“ hinzufügen. So /foo/bar/GetMyPdf.aspx gibt GetMyPdf.pdf.

Die einzige Lösung, die ich gefunden ist „dynamisch“ Seitennamen durch einen asp.net-Handler zu verwalten:

  • eine Klasse erstellen, die IHttpHandler
  • implementiert
  • Karte einen Handler in web.config auf die Klasse beschränkt

Mapping1: Alle Seiten haben ein gemeinsames radix (MyDocument _):

<httpHandlers>  
<add verb="*" path="MyDocument_*.ashx" type="ITextMiscWeb.MyDocumentHandler"/>

Mapping2: völlig freie Dateinamen (müssen einen Ordner im Pfad):

<add verb="*" path="/CustomName/*.ashx" type="ITextMiscWeb.MyDocumentHandler"/>

Einige Tipps hier (die pdf dynamisch mit iTextSharp erstellt):
http: // fhtino. blogspot.com/2006/11/how-to-show-or-download-pdf-file-from.html

Statt Befestigung Sie können Inline versuchen:

Response.AddHeader("content-disposition", "inline;filename=MyFile.pdf");

habe ich inline in einer früheren Web-Anwendung, die Crystal Reports Ausgabe in PDF erzeugt und gesendet, dass in Browser an den Benutzer.

Datei-Download-Dialog (PDF) mit speichern und öffnen Option

Punkte zu beachten:

  1. Return-Stream mit dem richtigen Array-Größe aus dem Dienst
  2. Lesen Sie die Byte arrary aus dem Strom mit dem richtigen Byte-Länge auf der Basis von Strom Länge.
  3. gesetzt korrekter content

Hier ist der Code für den Lesestrom und öffnen Sie die Datei-Download-Dialog für die PDF-Datei

private void DownloadSharePointDocument()
{
    Uri uriAddress = new Uri("http://hyddlf5187:900/SharePointDownloadService/FulfillmentDownload.svc/GetDocumentByID/1/drmfree/");
    HttpWebRequest req = WebRequest.Create(uriAddress) as HttpWebRequest;
    // Get response   
    using (HttpWebResponse httpWebResponse = req.GetResponse() as HttpWebResponse)
    {
        Stream stream = httpWebResponse.GetResponseStream();
        int byteCount = Convert.ToInt32(httpWebResponse.ContentLength);
        byte[] Buffer1 = new byte[byteCount];
        using (BinaryReader reader = new BinaryReader(stream))
        {
            Buffer1 = reader.ReadBytes(byteCount);
        }
        Response.Clear();
        Response.ClearHeaders();
        // set the content type to PDF 
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment;filename=Filename.pdf");
        Response.Buffer = true;
        Response.BinaryWrite(Buffer1);
        Response.Flush();
       // Response.End();
    }
}

Ich glaube, das bereits in einem Geschmack oder eine andere erwähnt worden, aber ich werde versuchen, und geben Sie es in meinen eigenen Worten.

Statt diese:

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

Ich benutze diese:

/bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf?GeneratePDF=1

Anstatt „Export“ Verfahren mit der Anforderung, wenn eine Anfrage kommt, sehe ich in der URL für GeneratePDF = 1. Wenn gefunden, betreiben ich was auch immer Code in „Export“ lief statt zuzulassen, dass mein System zu suchen, um zu versuchen und ein PDF in der Lage /bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf zu dienen. Wenn GeneratePDF nicht in der URL gefunden wird, übertrage ich einfach die folgende Datei angefordert. (Beachten Sie, dass ich nicht einfach auf die angeforderte Datei umleiten - sonst würde ich in einer Endlosschleife am Ende)

Sie können immer zwei Verbindungen haben. Einer, der das Dokument im Browser geöffnet wird, und eine andere, um es herunterzuladen (einen falschen Inhaltstyp verwendet wird). Dies ist, was Google Mail funktioniert.

Für alle noch in diesem suchen, habe ich die Lösung hier und wunderbar funktioniert. Dank Fabrizio!

So wie ich das gelöst (mit PHP) ist wie folgt:

Angenommen, Ihre URL ist SomeScript.php?id=ID&data=DATA und die Datei, die Sie verwenden möchten, ist TEST.pdf.

die URL ändern, um SomeScript.php/id/ID/data/DATA/EXT/TEST.pdf.

Es ist wichtig, dass der letzte Parameter ist der Dateiname von Adobe (die ‚EXT‘ alles Mögliche sein können) verwendet werden soll. Stellen Sie sicher, es gibt keine Sonderzeichen in der obigen Zeichenfolge, BTW.

Nun, an der Spitze der SomeScript.php hinzu:

$_REQUEST = MakeFriendlyURI( $_SERVER['PHP\_SELF'], $_SERVER['SCRIPT_FILENAME']);

Dann diese Funktion in dem SomeScript.php (oder Ihre Funktionsbibliothek):

function MakeFriendlyURI($URI, $ScriptName) {

/* Need to remove everything up to the script name */
$MyName = '/^.*'.preg_quote(basename($ScriptName)."/", '/').'/';
$Str = preg_replace($MyName,'',$URI);
$RequestArray = array();

/* Breaks down like this
      0      1     2     3     4     5
    PARAM1/VAL1/PARAM2/VAL2/PARAM3/VAL3
*/

$tmp = explode('/',$Str);   
/* Ok so build an associative array with Key->value
   This way it can be returned back to $_REQUEST or $_GET
 */
for ($i=0;$i < count($tmp); $i = $i+2){
    $RequestArray[$tmp[$i]] = $tmp[$i+1];
}
return $RequestArray;       
}//EO MakeFriendlyURI

Jetzt $_REQUEST (oder $_GET wenn Sie bevorzugen) wie normale $_REQUEST['id'] zugegriffen wird, $_REQUEST['data'], etc.

Und Adobe wird Ihre gewünschten Dateinamen als Standard speichern als oder E-Mail info verwenden, wenn Sie es inline senden.

Ich war hier umgeleitet, weil ich das gleiche Problem haben. Ich habe auch versucht Troy Howard Abhilfe ist aber scheint nicht zu funktionieren.

Der Ansatz, den ich auf diesem einem tat, ist nicht mehr Response-Objekt zu verwenden, um die Datei on the fly zu schreiben. Da das PDF bereits auf dem Server vorhanden, was ich tat, war auf meiner Seite deutet auf die PDF-Datei zu umleiten. Funktioniert prima.

http://forums.asp.net/t/143631.aspx

Ich hoffe, meine vage Erklärung gab Ihnen eine Idee.

Credits zum Vivek .


Nginx

location /file.pdf
{
    # more_set_headers "Content-Type: application/pdf; name=save_as_file.pdf";
    add_header Content-Disposition "inline; filename=save_as_file.pdf";
    alias /var/www/file.pdf;
}

Überprüfen Sie mit

curl -I https://example.com/file.pdf

Firefox 62.0b5 (64-Bit): OK.

Chrome 67.0.3396.99 (64-Bit): OK.

IE 11: No comment

.

Versuchen Sie dies, wenn die ausführbare Datei ist "get.cgi"

http: //server,org/get.cgi/filename .pdf? file = filename.pdf

Ja, es ist völlig verrückt. Es existiert keine Datei „filename.pdf“ auf dem Server genannt, gibt es Verzeichnis überhaupt unter dem ausführbaren get.cgi.

Aber es scheint zu funktionieren. Der Server ignoriert die filename.pdf und der PDF-Reader ignoriert die "get.cgi"

Dan

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top