p:fileDownload-bean-Methode wird aufgerufen, aber Datei-download wird nicht angezeigt
Hallo, ich mache Datei-upload-und download die gleiche Datei mit JSF und Primefaces.
Bin ich mit Techniken aus verschiedenen Foren und blogs kombiniert(BelusC 's blog und Primefaces-Showcase).
Die Hauptidee dieses Betriebes ist, dass ein Benutzer eine Datei hochladen und
generieren Sie einen Download-link für die hochgeladene Datei so, dass er download
und sehen Sie es vor dem Absenden.
Hier ist mein code:
index.xhtml
<h:form>
<p:fileUpload showButtons="false" label="Attach Refrral"
auto="true" fileUploadListener="#{fileBean.uploadListener}"/>
</h:form>
<h:form >
<p:commandLink>
See Uploaded File
<p:fileDownload value="#{fileBean.refrralFile}"/>
</p:commandLink>
</h:form>
FileBean.java
private StreamedContent refrralFile;
public void uploadListener(FileUploadEvent evt)throws Exception
{
UploadedFile fx = evt.getFile();
File mainDir = new File("C:/","fileStorage");
if(!mainDir.exists())
{
mainDir.mkdir();
}
File subDir = new File(mainDir,"AttachedRefrrals");
if(!subDir.exists())
{
subDir.mkdir();
}
String fileName = fx.getFileName();
File f = new File(subDir,fileName);
FileOutputStream fos = new FileOutputStream(f);
IOUtils.copy(fx.getInputstream(), fos);
InputStream is = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream(f.getAbsolutePath());
refrralFile = new DefaultStreamedContent(is, new MimetypesFileTypeMap().getContentType(f), fileName);
}
public StreamedContent getRefrralFile() {
return refrralFile;
}
Unter Verwendung der obigen code-Datei, ist das hochladen Erfolgreich, aber wenn ich auf Datei-download-link ths werfen Ausnahme:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
Ich verwendet FacesContext#responseComplete(), als seine vorgeschlagen worden, viele Orte, nun download-link funktioniert nicht.
Bitte korrigieren Sie mich wenn ich bin falsch in meiner Technik oder code und schlage einen besseren Weg, wenn Sie wissen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
<p:commandLink>
feuert standardmäßig ein ajax-request. Sie können nicht download von Dateien via ajax. JavaScript wer ist verantwortlich für die Verarbeitung der ajax-request, der keine Ahnung hat was zu tun mit abgerufen binäre Datei, die ganz anders ist, als die erwartete XML-Antwort. JavaScript hat aus offensichtlichen Gründen der Sicherheit keine Einrichtungen zum auslösen einer Speichern Als Dialog mit beliebigem Inhalt.So, um das konkrete problem zu beheben, verwenden
oder nur
Siehe auch:
<p:fileDownload>
showcase-Seite - dies auch explizit zeigtajax="false"