4

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

如果文件名带有西里尔符号,浏览器会显示“未知文件类型”示例:我有文件“асдасд.png”,然后单击下载浏览器响应 在此处输入图像描述

有我的下载方法

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,但我不知道如何......请帮忙。

4

1 回答 1

7

使用URLEncoder.

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

请注意,这已经由OmniFaces Faces#sendFile()隐式完成。因此,如果您碰巧已经使用了 OmniFaces,那么您可以直接使用它。

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

于 2013-05-24T12:50:07.703 回答