如何为任何内容类型制作可下载的commandLink(pdf / zip / docx / jpeg等)

时间:2015-05-14 11:06:37

标签: jsf primefaces

我想创建一个可下载的链接。我使用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”。我希望在此部分中独立。对于每种内容类型,强制要求单独的代码吗? 无论数据表中的内容类型如何,我都希望共享此文件。谢谢。

1 个答案:

答案 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答案的最后一种情况。