您好我正在使用JSF和Primefaces进行文件上传和下载相同的文件操作。
我正在使用来自不同论坛和博客的技术(BelusC的博客和Primefaces Showcase)。
此操作的主要思想是让用户上传文件和 为上传的文件生成下载链接,以便他可以下载 并在提交前查看。
这是我的代码:
的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;
}
使用上面的代码文件正在成功上传但如果我点击文件下载链接则抛出异常:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
我使用了 FacesContext #responseComplete(),因为它已被许多地方建议,现在下载链接根本无法使用。
如果我的技术或代码出错,请纠正我,如果你知道,请提出更好的建议。
答案 0 :(得分:12)
<p:commandLink>
默认触发ajax请求。您无法通过ajax下载文件。负责处理ajax请求的JavaScript不知道如何处理检索到的二进制文件,这与预期的XML响应完全不同。出于明显的安全原因,JavaScript无法触发与任意内容的另存为对话。
因此,要解决您的具体问题,请使用
<p:commandLink ajax="false">
或只是
<h:commandLink>