JSF 2下载带有西里尔文名称的文件

时间:2013-05-24 12:11:39

标签: java file jsf-2 download

我有一个带有文件的数据表和按钮来下载所选文件。

如果文件名是带有西里尔符号,浏览器会显示“未知文件类型” 例: 我有文件“асдасд.png”,我点击下载 浏览器回复enter image description here

有我的下载方法

public void download(Files file) {
    try {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseHeader("Content-Type", "application/x-download");
        externalContext.setResponseHeader("Content-Length", file.getFileContent().length+"");
        externalContext.setResponseHeader("Content-Disposition", "attachment;filename=\"" + file.getFilename() + "\"");
        externalContext.getResponseOutputStream().write(file.getFileContent());
        facesContext.responseComplete();
    } catch (IOException e1) {
        e1.printStackTrace();
    } catch (Exception e){
        e.printStackTrace();
    }
}

我很确定我需要将文件名编码为UTF-8,但我不知道如何... 请帮忙。

1 个答案:

答案 0 :(得分:7)

使用URLEncoder

URLEncoder.encode(file.getFileName(), "UTF-8")

请注意,OmniFaces Faces#sendFile()已隐式执行此操作。因此,如果您恰好使用OmniFaces,那么您可以直接使用它。

“未知文件类型”部分是由使用不受支持的内容类型引起的。您应该使用正确的内容类型,image/png用于PNG文件。您可以使用ExternalContext#getMimeType()根据文件名获取正确的内容类型。这也已由Faces#sendFile()隐式完成。