`
一日一博
  • 浏览: 230471 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2之上传下载和页面渲染图片功能

阅读更多
Struts2的上传下载是整合了commons-fileupload-1.2.2.jar这个包的功能,不过还需要commons-io-2.3.jar这个包的支持。其实上传下载功能主要是配置,下面是我的一个小例子,
可以实现上传下载,并且渲染图片到页面的效果,AbstractBaseAction这个基类代码可以翻看我之前写的博文中有贴出代码。
大概主要下面几点:
1.提交表单form的enctype属性
2.struts.xml的配置,下载要注意result的type,上传要注意拦截器的配置,这里我还配置了资源文件,利用国际化来做文件上传表单的验证功能。

<?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>
	<constant name="struts.devMode" value="true" />
	<constant name="struts.custom.i18n.resources" value="messages" />
	<constant name="struts.configuration.xml.reload" value="true" />
	<constant name="struts.enable.SlashesInActionNames" value="true" />
	<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
	<constant name="struts.multipart.maxSize" value="30480000" />
	<constant name="struts.ui.theme" value="simple" />

	<package name="main" extends="struts-default">

		<default-interceptor-ref name="paramsPrepareParamsStack" />

		<action name="*-*" class="com.chou.web.PlayerAction" method="{2}">
			<interceptor-ref name="token">
				<param name="includeMethods">save</param>
			</interceptor-ref>
			<interceptor-ref name="paramsPrepareParamsStack">
				<param name="fileUpload.allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png,image/pjpeg</param>
				<param name="fileUpload.allowedExtensions">.jpg,.gif,.jpeg,.bmp,.png</param>
				<param name="fileUpload.maximumSize">20971520</param>
			</interceptor-ref>

			<result name="input">player-load.jsp</result>
			<result name="invalid.token">player-load.jsp</result>
			<result name="success">{1}-{2}.jsp</result>
			<result name="list" type="redirect">player-list</result>
			<result name="download" type="stream">
				<param name="contentType">${fileContentType}</param>
				<param name="contentLength">${fileContentLength}</param>
				<param name="contentDisposition">attachment;filename="${fileFileName}"</param>
				<param name="inputName">fileStream</param>
				<param name="bufferSize">4096</param>
			</result>
		</action>

	</package>
</struts>


public class PlayerAction extends AbstractBaseAction<Player> {

	private static final long serialVersionUID = -3068068486865209475L;

	PlayerDao playerDao = new PlayerDao();

	/**
	 * 文件属性
	 */
	private File file;

	private String fileFileName;
	
	private InputStream fileStream;

	private String fileContentType;

	private int fileContentLength;

	public String list() throws Exception {
		return SUCCESS;
	}

	public void prepareSave() throws Exception {
		Player player = getModel();
		if (getId() != null) {
			player = playerDao.loadPlayer(getId());
		}
		setModel(player);
	}

	public String save() throws Exception {
		// System.out.println(fileContentType);
		// System.out.println(fileFileName);
		Player player = getModel();
		if (file != null) {// 新增或者修改照片操作
			FileInputStream fis = null;
			byte[] buf = new byte[(int) file.length()];
			try {
				fis = new FileInputStream(file);
				fis.read(buf);
				player.setImage(buf);
			} catch (IOException e) {
				e.printStackTrace();
				addActionError("读取上传文件失败。");
				LOG.error("读取上传文件失败。", e, new String[0]);
				return ERROR;
			} finally {
				if (fis != null) {
					try {
						fis.close();
					} catch (IOException e) {
						LOG.error("关闭FileInputStream失败。", e, new String[0]);
					}
				}
			}
		} else if (file == null && getId() != null) {// 修改操作,但是不修改照片
			player.setImage(playerDao.loadPlayer(getId()).getImage());
		}
		if (player != null) {
			player.setCreatetime(new Date());
			playerDao.saveOrUpdate(player);
			return "list";
		}
		return INPUT;
	}

	public void prepareLoad() throws Exception {
		Player player = getModel();
		if (getId() != null) {
			player = playerDao.loadPlayer(getId());
			player.setImage(null);
		} else {
			player.setBirthday(new Date());
			player.setContract("输入详细合同情况");
		}
		setModel(player);
	}

	public String load() throws Exception {
		return SUCCESS;
	}

	public void prepareDownload() throws Exception {
		Player player = getModel();
		if (getId() != null) {
			player = playerDao.loadPlayer(getId());
		}
		setModel(player);
	}

	public String download() throws Exception {
		if (getId() != null) {
			try {
				Player player = getModel();
				setFileContentType("image/jpg");
				setFileContentLength(player.getImage().length);
				setFileFileName(new String(player.getName().getBytes(),
						"iso-8859-1") + ".jpg");
				setFileStream(new ByteArrayInputStream(player.getImage()));
			} catch (Exception e) {
				LOG.error("加载文件出错。", new String[0]);
			}
		}
		return "download";
	}
        //把图片渲染到页面
	public String showImage() throws Exception {
		byte[] bigImgByte = null;
		OutputStream out = null;
		HttpServletResponse response = ServletActionContext.getResponse();
		if (getId() == null) {
			response.setHeader("Content-disposition", "attachment; filename="
					+ "no.jpg");
			response.setContentType("image/jpeg");
			out = response.getOutputStream();
			out.write(bigImgByte);
			out.flush();
			return NONE;
		}
		Player player = playerDao.loadPlayer(getId());
		if (player.getImage() == null) {
			return NONE;
		}
		bigImgByte = player.getImage();
		try {
			response.setHeader("Content-disposition", "attachment; filename="
					+ player.getName().trim().replace(" ", "") + ".jpg");
			response.setContentType("image/jpeg");
			out = response.getOutputStream();
			out.write(bigImgByte);
			out.flush();
		} catch (Exception e) {
			System.out.println("没有图片!!");
		} finally {
			try {
				if (null != out)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return NONE;
	}

	/**
	 * getter....setter
	 */

}


<body>
		<div align="center"><h1>添加球员</h1></div>
		<s:if test="hasErrors()">
			<s:fielderror/>
			<s:actionerror/>
		</s:if>
		<s:form id="sForm" action="player-save" enctype="multipart/form-data" method="post" onsubmit="return verifyUpload()">
		<s:hidden name="id" />
		<s:token/>
		<table align="center" border="1">
			<tr>
				<th>姓名</th>
				<td><s:textfield name="name" maxlength="20" required="true"/></td>
				<th>出生日期</th>
				<td>
				</td>
			</tr>
			<tr>	
				<th>身高</th>
				<td><s:textfield name="high" maxlength="5"/></td>
				<th>体重</th>
				<td><s:textfield name="weight" maxlength="5"/></td>
			</tr>
			<tr>
				<th>球队</th>
				<td><s:textfield name="team" maxlength="30"/></td>
				<th>位置</th>
				<td><s:select name="place" list="placeKinds" listKey="key" listValue="value"/></td>
			</tr>
			<tr>
				<th>号码</th>
				<td><s:textfield name="no" maxlength="2"/></td>
				<th>选秀顺位</th>
				<td><s:textfield name="draft" maxlength="30"/></td>
			</tr>
			<tr>
				<th>国籍</th>
				<td><s:textfield name="nationality" maxlength="10"/></td>
				<th>毕业学校</th>
				<td><s:textfield name="school" maxlength="50"/></td>
			</tr>
			<tr>
				<th>本季工资</th>
				<td><s:textfield name="salary" maxlength="10"/></td>
				<th>球员图片</th>
				<td>
					<s:file name="file" />
				</td>
			</tr>
			<tr>
				<td>
					<img style="cursor:pointer" alt="<s:property value="name"/>" src="<s:url action="player-showImage" ><s:param name="id"><s:property value="id"/></s:param></s:url>">
				</td>
				<th>合同情况</th>
				<td colspan="2"><s:textarea name="contract" cols="30" rows="4"/></td>
			</tr>
			<tr>
				<td colspan="4" align="center">
					<s:reset value="重置"/>&nbsp;&nbsp;&nbsp;&nbsp;
					<s:submit value="提交"/>
				</td>
			</tr>
		</table>
		</s:form>
	</body>

struts.messages.error.content.type.not.allowed=文件上传失败:你要上传的文件"{1}"文件类型不匹配
struts.messages.error.file.extension.not.allowed=只允许上传图片,请检查文件"{1}"后缀名
struts.messages.error.file.too.large=文件“{1}”大小超过所允许的上限(20M)

struts.messages.invalid.token=请不要重复提交表单
xwork.default.invalid.fieldvalue=无效的数据,请检查日期、数值类型数据的格式是否正确"{0}"
分享到:
评论

相关推荐

    struts2讲义 struts2讲义struts2讲义struts2讲义struts2讲义

    综上所述,Struts2是一个功能强大且灵活的Java Web开发框架,它不仅提供了丰富的特性,还通过其独特的设计模式和插件机制,使得开发者能够快速构建高质量的Web应用程序。通过对Struts2核心概念和技术的理解,开发者...

    struts与struts2的区别

    Struts2支持OGNL(Object-Graph Navigation Language)作为其默认表达式语言,允许在JSP页面中直接访问对象属性和执行方法,而Struts1使用的是JSP EL(Expression Language)或者自定义的Struts标签。 **4. 视图...

    Struts2之struts2标签库了解和使用案例struts025

    Struts2是一个强大的Java EE应用程序框架,用于构建和维护可扩展、模块化和易于管理的Web应用程序。在Struts2中,标签库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更加专注于业务逻辑而不是繁琐的...

    struts2 2.3.1api

    - 注解配置:在2.3.1版本中,Struts2支持在Action类和方法上使用注解进行配置,使得代码更简洁,更易于维护。 4. **插件系统** - Struts2具有强大的插件机制,可以方便地扩展其功能。例如,Freemarker或Velocity...

    struts2测试案例

    它建立在Apache Jakarta的.struts1之上,并吸取了其他框架的优点,如WebWork,提供了更丰富的功能和更好的灵活性。 在初学者的`struts2测试案例`中,我们可以学习到以下核心知识点: 1. **Action类**:Struts2的...

    马士兵Struts2笔记2013

    为了调试目的,可以开启Struts2的值栈调试功能,查看栈中的内容,帮助开发者了解当前请求的状态和数据流。 9. **Struts2访问Web元素** Struts2可以通过OGNL(Object-Graph Navigation Language)轻松地访问和操作...

    Struts2和Struts1的什么区别

    综上所述,Struts2相较于Struts1,在灵活性、可扩展性、易用性和性能方面都有显著提升,特别是在模型驱动、表达式语言、视图管理和拦截器机制等方面展现了明显的优势。然而,选择何种框架还需根据项目需求、团队熟悉...

    struts1.3.10 和 struts2.0.14 包

    Struts 2是Struts 1的后续版本,它吸取了WebWork框架的优点,提供了更强大的功能和更灵活的设计。Struts 2的核心概念包括Action、Result、Interceptor和Freemarker或JSP作为视图。Action类取代了Struts 1中的...

    struts1.x和struts2.x区别

    综上所述,Struts2.x相对于Struts1.x在多个方面进行了改进和优化,包括但不限于Action的实现方式、工作流程、数据绑定、视图技术以及验证机制,这些改进共同构成了Struts2.x相较于Struts1.x的优势,使其成为现代Web...

    struts 2完全学习手册

    Struts 2是Struts框架的一个重要分支,它继承了Struts 1.x的一些特性,并在此基础上进行了大幅度的改进与扩展,使之成为了一个更为强大、灵活的Web开发框架。Struts 2主要应用于Java EE平台上的Web应用开发,其核心...

    struts2使用手册

    - **功能齐全的标签库(Tag Library)**:Struts2提供了丰富的标签库,可以帮助开发者更高效地开发页面逻辑,减少了页面代码的复杂度。 - **开源性**:Struts2是开源项目,这意味着开发者可以自由地获取其源代码并...

    图解Struts2 带有文字说明

    - Struts2的核心特性之一,可以插入在Action调用前后,实现日志、权限验证、事务管理等功能。 - 默认拦截器栈包含一系列预定义的拦截器,如params(处理参数)、i18n(国际化)和exception(异常处理)。 4. **...

    Struts2 in action 中文版

    综上所述,《Struts2 in Action》中文版不仅介绍了Struts2框架的基本原理和架构,还深入探讨了如何利用Struts2来构建高效、可维护的Web应用。无论是初学者还是有经验的开发者,都能从这本书中获得宝贵的指导和启发。

    struts2所需全部jar包

    在创建一个Struts2工程时,通常需要依赖一系列的jar包来支持其核心功能和其他组件的运行。标题"struts2所需全部jar包"和描述中的"编写struts2工程所必须的几个jar包,绝对全,够用"都表明这些是构建和运行Struts2...

    Struts2深入理解

    综上所述,Struts2不仅继承和发展了传统的MVC设计模式,还引入了许多创新机制,如强大的配置机制、灵活的拦截器体系结构以及OGNL表达式语言等,使得开发者能够更加高效地构建复杂的企业级应用。

    struts2电子书

    Struts2框架是基于MVC(Model-View-Controller)设计模式的,它的出现是为了改善Struts1的一些局限性,提供了更强大的功能和灵活性。在Struts2中,Action类是处理用户请求的核心,通过配置Action映射,可以将HTTP...

    struts2.3.4源代码

    6. **Interceptor**: 拦截器是Struts2的核心特性之一,允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。 7. **ValueStack**: 用于存储Action的属性和OGNL表达式,便于在视图层和控制器之间传递数据。...

    Struts2 API 以及标签手册

    这个框架基于MVC(Model-View-Controller)设计模式,为开发者提供了丰富的功能和API,使得开发者能够更专注于业务逻辑,而不是底层的HTTP处理和页面渲染。 **Struts2 API** Struts2 API是Struts2框架的核心组件之...

    struts2 lib2

    综上所述,"struts2 lib2"涉及到的是Struts2框架的使用和其相关库文件的管理,理解这些知识点对于开发和维护基于Struts2的Java Web应用具有重要意义。开发者需要熟悉Struts2的架构、插件系统、OGNL表达式以及如何...

Global site tag (gtag.js) - Google Analytics