杰瑞科技汇

Struts如何实现文件下载?

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>

注意事项

  1. 文件路径安全:确保不要允许用户任意指定文件路径,防止目录遍历攻击
  2. 文件权限:确保Web服务器有读取指定文件的权限
  3. 大文件处理:对于大文件,考虑使用流式传输而不是一次性加载到内存
  4. 中文文件名:如果文件名包含中文,需要进行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框架中实现文件下载的基本方法,根据你的具体需求可以选择最适合的方式。

分享:
扫描分享到社交APP
上一篇
下一篇