(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">p_w_picpath/bmp,p_w_picpath/png,p_w_picpath/gif,p_w_picpath/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
转载于:https://blog.51cto.com/983836259/1741571