Java Struts 文件下载实现指南
在 Struts 框架中实现文件下载功能,通常有两种主要方式:通过 Action 类处理和通过 Stream 结果类型,以下是详细的实现步骤:
使用 Action 类处理文件下载
创建 Action 类
import org.apache.struts2.ServletActionContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action {
private String fileName; // 要下载的文件名
// 提供getter和setter方法
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String execute() throws Exception {
// 设置文件路径(根据实际情况修改)
String filePath = "/path/to/your/files/" + fileName;
File file = new File(filePath);
if (!file.exists()) {
return ERROR;
}
// 设置响应头
ServletActionContext.getResponse().setContentType("application/octet-stream");
ServletActionContext.getResponse().setHeader("Content-Disposition",
"attachment; filename=\"" + fileName + "\"");
// 获取输入输出流
InputStream in = new FileInputStream(file);
OutputStream out = ServletActionContext.getResponse().getOutputStream();
// 写入文件内容
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.flush();
out.close();
return NONE; // 返回NONE表示不需要跳转到任何视图
}
}
配置 struts.xml
<package name="default" extends="struts-default">
<action name="downloadFile" class="com.yourpackage.FileDownloadAction">
<result name="none" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
<result name="error">error.jsp</result>
</action>
</package>
使用 Stream 结果类型(更简洁)
创建 Action 类
import org.apache.struts2.ServletActionContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
private String fileName;
private InputStream inputStream;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getInputStream() throws Exception {
// 设置文件路径(根据实际情况修改)
String filePath = "/path/to/your/files/" + fileName;
File file = new File(filePath);
if (!file.exists()) {
return null;
}
return new FileInputStream(file);
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
配置 struts.xml
<package name="default" extends="struts-default">
<action name="download" class="com.yourpackage.DownloadAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
<result name="error">error.jsp</result>
</action>
</package>
注意事项
- 文件路径安全:确保不要允许用户任意指定文件路径,防止目录遍历攻击
- 文件权限:确保Web服务器有读取指定文件的权限
- 大文件处理:对于大文件,考虑使用流式传输而不是一次性加载到内存
- 中文文件名:如果文件名包含中文,需要进行URL编码:
String encodedFileName = URLEncoder.encode(fileName, "UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
前端调用
在JSP页面中,可以使用简单的链接触发下载:
<a href="<s:url action='download'><s:param name='fileName' value='example.pdf'/></s:url>">下载文件</a>
或者使用JavaScript:
window.location.href = "<s:url action='download'><s:param name='fileName' value='example.pdf'/></s:url>";
就是在Struts框架中实现文件下载的基本方法,根据你的具体需求可以选择最适合的方式。
