Struts2:中文文件名下载与编码解决方案

需积分: 10 2 下载量 98 浏览量 更新于2024-07-26 收藏 128KB DOCX 举报
在Struts2框架中,实现文件下载功能并支持中文文件名是一个常见的需求。本文将介绍如何通过配置和编写Action来解决这一问题。首先,我们来看一下如何创建一个基本的文件下载Action。 基本文件下载Action(FileDownloadAction) XML配置如下: ```xml <action name="download" class="example.FileDownloadAction"> <result name="success" type="stream"> <param name="contentType">text/plain</param> <param name="inputName">inputStream</param> <!-- 使用文件的真实名称,这里设定为 "struts2中文.txt" --> <param name="contentDisposition">attachment;filename="struts2中文.txt"</param> <param name="bufferSize">4096</param> </result> </action> ``` 在这个例子中,`FileDownloadAction` 类负责处理下载请求。当用户请求`download` 动作时,Struts2会从`inputStream`获取文件内容,并设置`contentDisposition`参数为`attachment`,确保浏览器会将其以下载的形式呈现。`filename`参数指定了用户看到的文件名,即"struts2中文.txt",这样即使文件名包含中文字符,也能正确显示。 支持中文文件名的高级文件下载Action(FileDownloadAction2) 对于更复杂的情况,比如希望在文件名中使用动态值或者支持用户自定义的文件名,我们可以创建一个新的Action,如`FileDownloadAction2`。这里引入了`<param>`元素,其中的`downloadFileName` 属性用于动态设置文件名,它与Action类中的`getDownloadFileName()`方法相对应。 ```xml <action name="download2" class="example.FileDownloadAction2"> <!-- 初始文件名为 "Struts中文件.txt" --> <param name="fileName">Struts中文件.txt</param> <result name="success" type="stream"> <param name="contentType">text/plain</param> <param name="inputName">inputStream</param> <!-- 使用getDownloadFileName()方法返回的编码过的文件名 --> <param name="contentDisposition">attachment;filename="${downloadFileName}"</param> ... </result> </action> ``` 在`FileDownloadAction2` 类中,你需要重写`getDownloadFileName()` 方法,根据用户输入或者其他逻辑来生成最终的下载文件名。例如: ```java public String getDownloadFileName() { // 根据用户请求或者其他逻辑生成文件名,例如:String downloadFileName = request.getParameter("customFileName") + ".txt"; return downloadFileName; } ``` 这样,无论用户指定的文件名是中文还是其他字符,只要通过`getDownloadFileName()` 方法正确处理,都可以被浏览器识别并下载。 总结来说,Struts2实现文件下载的关键在于配置Action和利用`stream`类型的结果来处理文件流,同时通过参数`contentDisposition`控制文件名的显示和下载。对于包含中文的文件名,需要确保正确地进行字符编码和转换。这提供了灵活且兼容性高的文件下载解决方案,适用于实际的Web开发项目。