我在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”。
答案 0 :(得分:1)
这可能不容易解决。使用流结果类型时,实际上是在操纵HTTP标头。例如,contentDisposition最终被发送到客户端,如下所示:
Content-Disposition: attachment; filename="fname.ext"
根据我的理解,可以使用ISO-8859-1以外的编码发送文本,但问题是客户端(浏览器)是否支持它。我认为你最好的选择是检查你的struts动作中的contentDisposition值,如果它不是latin-1,那么可能会提供一个默认值(希望)有意义。不幸的是,这可能不是i18n可以提供帮助的情况,因为它与重写的http标题有关。
答案 1 :(得分:0)
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;