我想创建一个可下载的链接。我使用primefaces 5.0和jsf 2.2。我有一些文件(pdf,zip / rar,docx,jpeg等),我想用commandLink在数据表上共享这些文件。仅适用于在谷歌下载文件(具有特定内容类型)。(例如:download only a pdf)。但是如何为任何内容类型文件执行此操作?
c://uploads/files/dir1/foo.zip
---------""------/dir2/boo.pdf
---------""------/dir3/doo.jpeg etc.
您可以在下面看到与特定内容类型相关的类似代码。
private StreamedContent file;
public FileDownloadView() {
InputStream stream = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/resources/demo/images/optimus.jpg");
file = new DefaultStreamedContent(stream, "image/jpg", "downloaded_optimus.jpg");
}
public StreamedContent getFile() {
return file;
}
你可以在这部分看到:
DefaultStreamedContent(stream, "image/jpg", "downloaded_optimus.jpg");
只下载“image / jpg”。我希望在此部分中独立。对于每种内容类型,强制要求单独的代码吗? 无论数据表中的内容类型如何,我都希望共享此文件。谢谢。
答案 0 :(得分:2)
创建新的bean,如:
public class MyFile {
private String name;
private String type;
private String encoding;
private String path;
// ... Setters and getters ...
public Attachment () {
this.encoding = "UTF-8";
}
}
在托管bean中
private DefaultStreamedContent streamToDownload;
private MyFile myFile;
// @ here setter and getter too .
public void prepareForDownlaod() {
InputStream stream = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream(myFile.getPath());
streamToDownload= new DefaultStreamedContent(stream, myFile.getType(), myFile.getName(), myFile.getEncoding());
}
在xhtml文件中:
<p:commandLink ajax="false" value="Download" action="#{managedBean.prepareForDownlaod()}">
<p:fileDownload value="#{managedBean.streamToDownload}" />
</p:commandLink>
试试这个我希望这对你有用。
修改强>
我存储数据的解决方案,例如存储在数据库中的数据,或者您可以使用externalContext.getMimeType
设置文件类型,您可以参考BalusC答案的最后一种情况。