Ich versuche ein Inline-PDF zu zeigen, das in einem neuen Browserfenster geöffnet wird. Ich habe folgendes Szenario:
window.open
, um eine neue Seite zu öffnen, um PDF anzuzeigen) Auf der geöffneten Seite habe ich nur p:media
tag in h:body
mit Wert auf StreamedContent
:
Nun, auf dieser Seite wird mein PDF nicht erzeugt. Im Protokoll kann ich diese zwei Zeilen sehen:
%Vor%Ich habe angefangen zu debuggen und ein paar Dinge herauszufinden.
Zuerst habe ich einen Breakpoint zur @PostConstruct
-Methode meiner RequestScoped
-Bohne hinzugefügt. Interessant ist, dass der Breakpoint zweimal erreicht wird, und zu meiner großen Überraschung danach wird PDF perfekt gezeigt ?!
Nach einiger Fehlersuche durch PrimeResourceHandler
stelle ich fest, dass ValueExpression
in einigen Fällen nicht berechnet wird, sondern NullPointerException
, und während des Debugging habe ich gesehen, dass zwei Anfragen gesendet wurden, und eine zweite Anfrage fehlschlägt, weil dynamicContentId
wird in der ersten Anfrage entfernt und der zweite Aufruf in handleResourceRequest
hat keinen Sinn.
Durch Firebug kann ich zwei Anfragen sehen, zuerst was gut ist mit PDF-Daten, und zweitens auch mit Inhaltstyp Anwendung / pdf aber leer, mit Größe 0.
xhtml-Seite:
%Vor%Backing Bean:
%Vor% Ich muss verstehen, warum zwei Anfragen auf der Seite mit p:media
tag gesendet werden, und um herauszufinden, wie dies funktioniert. Backing Bean ist ein Anforderungsbereich, es erstellt StreamedContent
in @PostConstruct
method und hat Getter und Setter für dieses Feld. Primefaces Version ist 3.4.2, mit Mojarra 2.1.14.
HINZUGEFÜGT:
Es ist einfach, mein Problem zu reproduzieren. Wenn der Code in init
method durch folgenden ersetzt wird:
Problem kann reproduziert werden.
Ich kann dein Problem reproduzieren. Es funktioniert tatsächlich nicht in Firefox (noch in IE9, aber es funktioniert in Chrome). PrimeFaces Lead Cagatay hat auch das mehrmals erwähnt .
Ich bin mir nicht sicher, ob das ein Fehler im PrimeFaces Resource Handler oder im Browser ist. Ich werde es in der Mitte lassen.
In der Zwischenzeit ist Ihre beste Wette ein einfaches Web-Servlet für den Job. Erstellen Sie einfach diese Klasse:
%Vor%Und rufe es wie folgt auf:
%Vor%Das ist es. Keine XML-Konfiguration notwendig. Es funktioniert für mich in allen Browsern. Je nach den funktionalen Anforderungen möchten Sie möglicherweise die Antwortheader für das Browser-Caching weiter verfeinern.
Es ist kein Browser oder Hauptproblem, nur ein lustiges Getterproblem.
Der Getter wird zweimal von p: media aufgerufen (oder wenn Sie die Seite öfter aktualisieren), aber nur der erste Aufruf erhält die richtigen Daten. StreamedContent kapselt einen InputStream, der die Eigenschaft hat, keine Bytes zu geben, wenn sich der Stream am Ende der Datei befindet. Das erste Mal wird es bis zum Ende gelesen (Daten sind in Ordnung), aber bei jedem weiteren Anruf werden keine Daten empfangen. :)
javadoc von inputStream.read () : Wenn kein Byte verfügbar ist, weil der Stream am Ende der Datei steht, wird der Wert -1 zurückgegeben. Andernfalls wird mindestens ein Byte gelesen und in b gespeichert.
Lösung :
%Vor%Ich hoffe, dass mein kleiner Beitrag jedem helfen kann, der keine PDF-Vorschau in Firefox anzeigen kann. Ich habe Primefaces 6 + Spring benutzt und ich hatte das gleiche Problem, aber vielleicht nicht aus dem gleichen Grund. In der Tat habe ich die vorgeschlagene Lösung von Balus C ausprobiert. Es half mir, die PDF in Chrome und IE11 anzuzeigen, aber es funktionierte immer noch nicht in Firefox 52.
Ich habe einen Fehler in der Firefox-Konsole bemerkt: Load verweigert von X-Frame-Optionen: Ссылка lässt kein Framing zu
In meinem Fall lag das daran, dass die Spring-Security-Konfiguration und die Lösung auf diese Weise die Datei feder-context.xml editieren:
Tags und Links pdf stream media jsf-2 primefaces