JSF PrimeFaces Dateidownload-problem
Ich bin mit PrimeFaces für ein neues Projekt und es ist schon eine beeindruckende Reihe von Komponenten.
Wie auch immer, ich habe ein problem mit der "realen Welt" verwenden des filedownload-Komponente.
In meiner Seite ich habe eine datalist zeigt, dass die Anhänge, die auf ein bestimmtes Dokument, und ich möchte einen link zum direkt-download, die Datei innerhalb des datalist-Element.
Hier ist mein xhtml code:
<p:dataList id="ListaAllegati" value="#{documentBean.documento.allegati}" type="definition" var="attach" style="border: none" ">
<f:facet name="description">
<h:outputText value="#{attach.name}" />
<p:commandLink ajax="false" title="Download" action="#{documentBean.selectAttach}>
<h:graphicImage style="margin-left: 10px; border: none" value="./images/article.png" height="24" width="24" ></h:graphicImage>
<p:fileDownload value="#{documentBean.downloadFile}"/>
<f:setPropertyActionListener target="#{documentBean.selectedAttach}" value="#{attach}" />
</p:commandLink>
</f:facet>
</p:dataList>
und die relative java bean (request-scoped):
private StreamedContent downloadFile;
public StreamedContent getDownloadFile() {
log.info("getter dell'allegato invocato");
InputStream stream = null;
byte[] rawFile = null;
if (selectedAttach == null) {
log.warn("Nessun allegato passato");
return null;
} else {
try {
log.info("Recupero del file " + selectedAttach.getGuid());
rawFile = attachManager.retrieveFile(selectedAttach.getGuid());
} catch (Exception e) {
String msg = "Errore durante il recupero del file";
log.error(msg, e);
FacesMessage fmsg = new FacesMessage(msg, "");
FacesContext.getCurrentInstance().addMessage(null, fmsg);
}
stream = new ByteArrayInputStream(rawFile);
DefaultStreamedContent file = new DefaultStreamedContent(stream,
selectedAttach.getMimeType(), selectedAttach.getName());
return file;
}
}
public void selectAttach() {
log.info("commandLink action invocata");
}
private Allegato selectedAttach;
public Allegato getSelectedAttach() {
return selectedAttach;
}
public void setSelectedAttach(Allegato selectedAttach) {
log.info("Allegato selezionato");
if (selectedAttach==null) log.warn("L'allegato passato è nullo");
this.selectedAttach = selectedAttach;
}
So, paar Frage:
- Bin ich das richtige zu tun versucht, übergeben Sie die ausgewählte Anlage, die Art und Weise? Ansonsten, wie kann ich ein parameter übergeben werden, sagen die Bohne wich-Anhang angeklickt wurde?
- Warum ich das erste mal auf der Kommandozeile link, nichts passieren? Sie machen eine Rundfahrt mit dem server, aber es passiert nichts. Zum zweiten mal, es gibt mir eine Ausnahme.
- Warum documentBean.selectAttach wird nie genannt und die documentBean.selectedAttach Eigenschaft ist nie (auch nicht beim zweiten mal)?
Danke an alle für jeden Hinweis
InformationsquelleAutor themarcuz | 2011-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie man die row-Objekt aus der Datentabelle ist, beantwortet diese Frage:
Diese Antworten sind im Prinzip alle drei Fragen.
Als die Ausnahme in der Sekunde auf, das ist wahrscheinlich, weil Sie nicht Rückkehr aus der
catch
blockieren, wenn eine Ausnahme ausgelöst wurde in IhremgetDownloadFile()
Methode. Sie sind weiterhin der Rest des Codes fließen, während dierawFile
nochnull
. Fix es dementsprechend auch. Hinzufügen einesreturn null
zu Endecatch
oder so etwas. Besser noch, Sie sollte die Buchung der gesamten stacktrace in der Frage, wie Sie scheinen nicht in der Lage sein, um es zu verstehen. Im Grunde enthält bereits die Antwort 🙂Ich habe auch etwas Experimentieren, und alles scheint zu funktionieren wie erwartet, wenn ich entfernen Sie die primefaces filedownload-tag: offensichtlich nicht Anhängen heruntergeladen wird 🙂 aber alle Set-Methoden, die get-und die Aktion aufgerufen wird, wie erwartet, auch das erste mal, dass ich auf das Bild klicken. Es scheint mir, dass es ein Problem mit primefaces filedownload-Komponente...
gut, nach der letzten Anweisung in deinem catch-block, Sie fahren mit rawFile wahrscheinlich null. Rückkehr vor. Oder besser, don ' T catch Exception (zu breit), und eine entsprechende Fehler-Seite für alles erfasste.
InformationsquelleAutor BalusC
Primefaces hat ein eigenes servlet für die Datei-download-und upload-Komponenten-Griff-all dies asynchron.
Versuchen, etwas zu tun wie das, was ich in meinem code
Und in der managed bean,
<p:fileDownload>
. Er nur tun, dieStreamedContent
Schaffung job in der getter-statt in der action-Methode.InformationsquelleAutor maple_shaft