以非英语语言显示文件名,以便为Struts2动态下载文件

时间:2014-03-20 05:22:43

标签: jsp struts2

我在Struts2中开发了一个动态文件下载程序,允许用户下载存储在数据库中的文件。

我的问题是,如果文件名包含非英语语言字符(在这种情况下是“泰语字符”)。文件名将显示为URL。

这是我的JSP

<s:url id="urlTag" action="downloadAmsFile">
     <s:param name="index">1</s:param>
</s:url>
<s:a href="%{urlTag}">Download</s:a>

这是我的结果参数的java代码

setFilename(assetObj.getFileName());
setMimeType(assetObj.getContentType());
setInputStream(new ByteArrayInputStream(assetObj.getBytes()));

这是我的行动

<action name="downloadAmsFile" class="com.title.ams.action.FileUploadAllAction" method="downloadAmsFile">   
    <result name="success" type="stream">
        <param name="contentType">%{contentType}</param>
        <param name="inputName">fileInputStream</param>
        <param name="contentDisposition">attachment;filename=%{contentDisposition}</param>
        <param name="bufferSize">1024</param>       
    </result>               
</action>

如果我下载的文件名为非英语,则文件名为 “downloadAmsFile.action?索引= 1”。

2 个答案:

答案 0 :(得分:1)

这可能不容易解决。使用流结果类型时,实际上是在操纵HTTP标头。例如,contentDisposition最终被发送到客户端,如下所示:

Content-Disposition: attachment; filename="fname.ext"

根据我的理解,可以使用ISO-8859-1以外的编码发送文本,但问题是客户端(浏览器)是否支持它。我认为你最好的选择是检查你的struts动作中的contentDisposition值,如果它不是latin-1,那么可能会提供一个默认值(希望)有意义。不幸的是,这可能不是i18n可以提供帮助的情况,因为它与重写的http标题有关。

答案 1 :(得分:0)

发现它! 我必须将文件名转换为unicode。

String result = "";

    if (text != null) {
        StringBuilder ascii = new StringBuilder(text);
        for(int i = 0; i < text.length(); i++) {
            int code = (int)text.charAt(i);
            if ((0xE01<=code) && (code <= 0xE5B )){
                ascii.setCharAt( i, (char)(code - 0xD60));
            }
        }
       result = ascii.toString();
    }
    return result;