Struts2文件上传实例

(1)上传表单

这里需要注意的是想要上传文件,form表单的的类型必须是:enctype=”multipart/form-data”,比如说这样:

<s:form action="toAddGoods" method="post" namespace="/goods" enctype="multipart/form-data">     
			<table id="advEdit" width="380" height="66">
				<tr>		         
		          <td><s:textfield name="goods.goodsName" label="商品名称" /></td>
		        </tr>
		        <tr>		         
		          <td><s:textfield name="goods.goodsPrice" label="起拍价格" /></td>
		        </tr>		       
		        <tr>
		          <td><s:textfield name="goods.goodsDesc" label="商品描述" /></td>
		        </tr>
		        <tr>
		          <td><s:file name="goodsImage" label="商品图片"></s:file></td>
		        </tr>
		        <tr>
		          <td><s:submit styleClass="btn" value="添加" align="center" /></td>
		        </tr>
			</table>
		</s:form>

(2)配置struts.xml :

这里需要添加一个名为“fileUpload”的interceptor-ref,主要是对上传文件的格式和大小进行过滤:

i)package是这样定义的:

<package name="goods" namespace="/goods" extends="struts-default">

ii)action是这样的:

<action name="toAddGoods" class="goods" method="toAddGoods">
			<result name="input">/addgoods.jsp</result>
			<result name="index" type="redirect">/index.jsp</result>
			<result name="login" type="redirect">/index.jsp</result>

			<interceptor-ref name="fileUpload">
				<!-- 文件过滤 -->
				<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
				<!-- 文件大小, 以字节为单位 -->
				<param name="maximumSize">4194304</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack" />	

		</action>

注:class没有写action类的完整路径是因为我引入了spring,action类的完整路径通过<bean>标签配置在applicationContext.xml文件中

<bean id="goods" class="com.zxpm.action.GoodsAction" scope="prototype">
		<property name="goodsBiz" ref="goodsBiz" />
	</bean>

(3)action的实现:

package com.zxpm.action;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.zxpm.biz.GoodsBiz;
import com.zxpm.entity.Goods;
import com.zxpm.entity.Users;

public class GoodsAction extends ActionSupport{
	private Goods goods;  //用于封装参数
	private GoodsBiz goodsBiz;  
	private File goodsImage;
	private String fileName;  //上传的临时文件的文件名

	public Goods getGoods() {
		return goods;
	}

	public void setGoods(Goods goods) {
		this.goods = goods;
	}

	public void setGoodsBiz(GoodsBiz goodsBiz) {
		this.goodsBiz = goodsBiz;
	}

	public void setGoodsImage(File goodsImage) {
		this.goodsImage = goodsImage;
	}
	//得到文件名
	public void setGoodsImageFileName(String fileName){
		this.fileName = fileName;
	}

	//省略。。。

	/**
	 * 添加新拍卖商品
	 * */
	public String toAddGoods(){
		//1 保存上传的文件
		String targetDirectory = ServletActionContext.getServletContext().getRealPath("/uploadImages");
		String targetFileName = renameImage(fileName);  //新的文件名
		File target = new File(targetDirectory,targetFileName);  //保存的新文件
		try {
			FileUtils.copyFile(goodsImage, target);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 2 保存新商品描述信息
		goods.setGoodsPic(targetFileName);
		Map<String, Object> session = ActionContext.getContext().getSession();
		Users saler = (Users) session.get("user");
		goods.setSaler(saler);
		goods.setBuyer(saler);
		goods.setGoodsStatus(0);

		goodsBiz.addGoods(goods);

		return "index";
	}

	/**
	 * 文件重命名
	 * */
	public String renameImage(String fileName){
		String formatDate = new SimpleDateFormat("yyMMddHHmmss").format(new Date());  //当前时间字符串
		int random = new Random().nextInt(10000);
		String extension = fileName.substring(fileName.lastIndexOf("."));  //文件后缀

		return formatDate + random + extension;
	}

	//省略。。。
}

注:i)这里定义的File类型变量goodsImage实际上是上传的临时文件的File对象,私有属性fileName就是上传文件的原始文件名,然后使用setter方法进行赋值。之所以这样做,是因为使用goodsImage.getName()获取到的文件后缀不是上传的文件的真实后缀,仅仅只是xxx.tmp

ii)ServletActionContext.getServletContext().getRealPath(“/uploadImages”);是获取想要保存的路径在磁盘上的绝对路径

iii)这里使用了FileUtils这个开源组件来保存文件,而不是自己手动写IO流,理由很简单:方便快速

iv)为了避免上传的文件多了造成文件名重复,同时为了增大“黑客”攻击的难度,因此统一将上传的文件进行重命名,采用当前时间+几位随机数组成的字符串的形式

(4)结果:

我这里效果是这样的:

其中图片的路径是:http://localhost:8080/OnlineAuction/uploadImages/1601261632188204.jpg

时间: 2024-12-14 14:56:03

Struts2文件上传实例的相关文章

【SSH2(实践篇)】--Struts2文件上传下载实例

上篇文章又一次回顾了Struts2的运行机制,对它的运行步骤做了一步步的解析,这个解析不但再一次理清了Struts2的使用方法,而且对它的映射机制进行了深入的解析,并在最后通过一个实例来介绍了Struts2的一种使用方法,这里将做一个有关文件上传下载的实例. 一.文件上传 Struts2并没有提供文件上传的组件,所以想要实现上传的功能就必须通过第三方组件来实现,在Struts2引用的jar中包含了文件上传的组件,它是通过commons-fileupload.jar和commons-io.jar来

struts2多上传实例代码

原文:struts2多上传实例代码 源代码下载地址:http://www.zuidaima.com/share/1550463682284544.htm 单文件上传 多文件上传 上传目录自定义 上传文件类型自定义 用户注册页面 http://localhost:端口/项目名称/reg.jsp 注册成功 多文件上传页面 上传成功 登陆页面 项目截图 缺少jar包:http://www.zuidaima.com/jar/search/servlet-api-2.4.htm

struts2 文件上传下载

四.文件的上传(拦截器)和下载(stream结果类型)(需要练一遍) 1.文件上传 必要前提: a.表单method必须是post: b.enctype取值必须是multipart/form-data: c.提供文件选择域. 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-t

struts2文件上传下载

文件上传 1.struts2中文件上传介绍 struts2文件上传需要使用apache提供的文件上传组件(commons-fileupload.jar和commons-io.jar). struts2文件上传的核心是通过fileupload拦截器实现的. 2.如何实现文件上传 1>.添加commons-fileupload和commons-io包 2>.在jsp页面做如下配置 将form的method属性值设置为post 给form标记添加属性enctype="multipart/f

struts2文件上传突破2M限制

strutsuploadfileactionclass struts配置文件 [html] view plaincopyprint? 1. <action name="FileUpload" class="cn.timefly.strutsTest.FileUploadAction">   2.     <result name="success">/FileUploadResult.jsp</result> 

PHP中,文件上传实例

PHP中,文件上传一般是通过move_uploaded_file()来实现的.  bool move_uploaded_file ( string filename, string destination ) 本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的).如果文件合法,则将 其移动为由 destination 指定的文件. 如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_fi

如何自学Struts2之Struts2文件上传[视频]

如何自学Struts2之Struts2文件上传[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95 由于本次视频没有声音,将会在下节课"Struts2数据库访问"这一节课,一起再讲一下. 注意:不好意思,不知道为什么在这次录制过程中没有声音,很抱歉,本节重点是碰到一个空指针异常,原因是fileUpload这个拦截器要放在其他拦截器之前才没有问题,材料

SpringMVC多文件上传实例

后台Conroller import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Date;

如何自学Struts2之Struts2文件上传和数据库访问[视频]

如何自学Struts2之Struts2文件上传和数据库访问[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95 由于上次视频没有声音,所以在这节课"Struts2数据库访问"一起再讲一下.