PDF kann nicht in p: Medien angezeigt werden, die aus gestreamten Inhalten in Primefaces generiert wurden

8

Ich versuche ein Inline-PDF zu zeigen, das in einem neuen Browserfenster geöffnet wird. Ich habe folgendes Szenario:

  1. In einigen ActionListen, die von ajax aufgerufen werden, erzeuge ich PDF-Inhalt, setze Daten in Sitzung und sende Javascript aus, um ausgeführt zu werden ( window.open , um eine neue Seite zu öffnen, um PDF anzuzeigen)
  2. 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:

%Vor%

Problem kann reproduziert werden.

    
partlov 23.01.2013, 16:31
quelle

3 Antworten

9

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.

    
BalusC 23.01.2013, 20:52
quelle
4

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%     
steve 17.06.2014 06:13
quelle
2

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:

%Vor%
    
jmoran 02.04.2017 00:04
quelle

Tags und Links