我有一个带有文件的数据表和按钮来下载所选文件.
如果文件名是带有西里尔符号,浏览器会显示"未知文件类型"示例:我有文件"асдасд.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,但我不知道如何...请帮忙.
使用URLEncoder
.
URLEncoder.encode(file.getFileName(), "UTF-8")
请注意,这已经由OmniFaces 隐式完成Faces#sendFile()
.因此,如果您恰好使用OmniFaces,那么您可以直接使用它.
"未知文件类型"部分是由使用不受支持的内容类型引起的.您应该使用正确的内容类型,即image/png
PNG文件.您可以使用ExternalContext#getMimeType()
基于文件名获取正确的内容类型.这也已经隐含地完成了Faces#sendFile()
.