Strut2文件下载

Struts2控制文件下载,可以在文件下载之前做一些操作。这里就以权限控制为例,简单实现一下Struts2的文件下载。

一、Struts2文件下载的Action配置,是提供了一个能返回InputStream流的方法,这个方法是被下载文件的入口。方法名在struts的配置文件里面配置。

DownloadAction.java

package actions;

import java.io.InputStream;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport {
    private String inputPath;

    public void setInputPath(String inputPath) {
        this.inputPath = inputPath;
    }

    public InputStream getTargetFile() throws Exception {
        return ServletActionContext.getServletContext().getResourceAsStream(
                "/测试.jpg");
    }

    // 下载文件前的权限控制
    // 取出session中的用户名判断是否允许下载,如不允许,跳转到登录页面登录。
    @Override
    public String execute() throws Exception {
        System.out.println(ServletActionContext.getServletContext()
                .getRealPath("/测试.jpg"));
        ActionContext ctx = ActionContext.getContext();
        Map session = ctx.getSession();
        String user = (String) session.get("user");
        if (user != null && user.equals("yangys")) {
            return SUCCESS;
        }
        ctx.put("tip", "您还没有登录系统!");
        return LOGIN;
    }
}

二、配置下载文件的Action

配置下载文件的Action需要将result类型配置为stream,如下粗体部分,一般指定4个参数

  • contentType 下载文件的类型
  • inputName 下载文件的InputStream入口方法名去掉get,首字母小写
  • contentDisposition 下载文件的文件名
  • bufferSize 下载文件时缓冲大小,单位字节

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <package name="yang" extends="struts-default">
        <action name="login" class="actions.LoginAction">
            <result name="success">index.jsp</result>
        </action>
        <action name="download" class="actions.DownloadAction">
            <param name="inputPath">"/测试.jpg"</param>
            <result type="stream">
                <param name="contentType">image/jpg</param>
                <param name="inputName">targetFile</param>
                <param name="contentDisposition">filename="测试.jpg"</param>
                <param name="bufferSize">4096</param>
            </result>
            <result name="login">login.jsp</result>
        </action>
    </package>
</struts>

在这里,为了实现权限控制,配置了一个login的Action,是为了实现登录后可以下载文件的效果。同时,也提供了一个简单的LoginAction.java

package actions;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    //登录成功后,将用户信息保存在session中
    @Override
    public String execute() throws Exception {
        ActionContext ctx = ActionContext.getContext();
        if (username != null && username.equals("yangys")) {
            ctx.getSession().put("user", username);
            return SUCCESS;
        }
        ctx.put("tip", "用户名或密码错误!");
        return LOGIN;
    }

}

三、两个jsp页面代码如下:

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="文件下载测试"/></title>
</head>
<body>
    <s:form action="download">
        <s:submit value="下载" />
    </s:form>
</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="loginPage" /></title>
</head>
<body>
    <s:form action="login">
        <s:textfield name="username" key="user" />
        <s:submit name="login"/>
    </s:form>
</body>
</html>

注:本示例是为了演示,下载文件时检查是否已经登录,如没有登录,则需要登录,登录成功后即可下载。故将下载文件表单放在了index.jsp中

你可能感兴趣的:(Strut2文件下载)