您的位置:首页 > 编程语言 > Java开发

【Struts2】中文文件的下载与下载权限的控制

2015-03-23 08:47 429 查看
中文文件的下载的下载还是小事,毕竟在服务器上面放置的文件一般都以用户ID与时间戳命名为好。不然一些浏览器无法解释中文,就无法提供一个正常的中文链接给用户下载。但是利用Struts2实现下载权限的控制真的是一个很实用的功能。

一、基本目标

设置一个很简单的问题,用户输入错误答案则不能下载,必须输入正确答案才能下载,如下图,而且被下载的文件在服务器的File文件下面,名称叫做“中文没有问题”的一张图片。浏览器遇到纯图片地址是不会调用下载工具的,而是直接显示。



二、基本准备

1、在Eclipse for Javaee新建一个Web工程名叫StrutsDownload,在WEB-INF的lib中放入Struts2的核心包,写好web.xml,具体在《【Struts2】Struts2纯手工安装、配置以及Helloworld,以最新版struts 2.3.20 GA做例子》(点击打开链接)说过,不赘述。之后再WebContent网站工程文件夹中,新建一个文件夹叫File,里面放一张图片“中文没有问题.jpg”。搞好之后网站目录结构如下。



2、首先写错误提示页error.jsp,这一页没有什么内容。就是一个错误提示与返回超级链接,具体如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!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>回答错误,禁止下载</title>
</head>
<body>
回答错误,禁止下载<br />
<a href="download.jsp">返回</a>
</body>
</html>
3、输入答案下载页download.jsp,这一页有一个只有一个输入框与提交按钮的表单,处理的Action是Download,也没有什么好讲的。

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!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>文件下载权限管理</title>
</head>
<body>
	请问1+1=?
	<form action="download" method="post">
		<input type="text" name="password" /><br />
		<input type="submit" value="提交" />
	</form>
</body>
</html>
4、struts.xml

对于这个文件,必须注意的是,这次的如果download.java处理的结果是返回success的话,其返回给用户,也就是View层的链接是一个二进制流result,正如上次在《【Struts2】利用JQuery实现Struts2的Ajax功能》(点击打开链接)讲Ajax返回处理字符串一样的,设置返回结果的类型是流的话,在下面必须指明一个inputName的参数,说明这流到底是download.java中提供的哪一个流,虽然基本上download.java只会提供一个文件流、字符流等二进制流而已。流的概念就是Java中流的概念,具体在《【Java】输入与输出与JDK1.5之后的新型字符串StringBuilder》(点击打开链接)说过了。而返回error的话,才是返回一个超级链接。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC  
      "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
      "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="test" extends="struts-default">
		<action name="download" class="test.download" method="run">
			<result name="success" type="stream">
				<param name="inputName">result</param>
			</result>
			<result name="error">error.jsp</result>
		</action>
	</package>
</struts>
5、下载权限管理文件download.java

这文件的任务主要有一个两个,一个是对前台传递过来的password字符串进行判断,看答案是否正确,你完全可以改成怒取Session,看用户是否有登录之类,一个是利用封装好的方法组织一个输入流给struts.xml。

package test;

import java.io.*;//这是搞文件必须有的

import org.apache.struts2.ServletActionContext;//这个包中包含组织文件流的方法

import com.opensymphony.xwork2.*;//这是搞struts必须有的

@SuppressWarnings("serial")
public class download extends ActionSupport {

	private String password;
	// 这个输入流是用来存放下载文件的。
	private InputStream result;

	public String run() throws Exception {
		//这样能够组织一个文件流
		String filePath="\\Files\\中文没有问题.jpg";
		result= ServletActionContext.getServletContext().getResourceAsStream(filePath);
		//trim是用来清楚空格、回车那些视觉上是空白的鬼东西。
		//看用户回答是否符合要求,也就是判断用户回答1+1=是否是2
		if(password.trim().equals("2")){
			//备注,利用(String)ActionContext.getContext().getSession().get("username");
			//能取到当前用户存在Session的用户名哦!
			return SUCCESS;
		}
		else{
			//不符合要求,返回一个跳转到error.jsp的地址给用户,不返回文件流
			return "error";
		}
	}

	// eclipse自动生成
	// 虽然password只进不出,其getter可以不要,但是还是排着吧,前台不调用就没问题
	// 输入流Result只出不进,其setter也是可以不要的,但是系统一次性生成getter与setter
	// 为何要手贱删除呢
	public String getPassword() {
		return password;
	}

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

	public InputStream getResult() {
		return result;
	}

	public void setResult(InputStream result) {
		this.result = result;
	}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: