第一步:添加配置文件
在struts.xml文件中添加如下内容:
<constant name="struts.multipart.saveDir" value="/tmp"/> --------------》这个用于存放临时文件
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
name="myRequestParser" class="com.base.wrapper.RequestParseWrapper" -----------》这个类没有实际作用,见第二步
scope="default" optional="true" />
<constant name="struts.multipart.handler" value="myRequestParser" />
第二步:创建RequestParseWrapper类
这个类对应struts.xml文件 ,在com.base.wrapper包下(包按自己需求创建)创建该类就行了,不需要在该类中做任何操作
public class RequestParseWrapper extends JakartaMultiPartRequest {
public void parse(HttpServletRequest servletRequest, String saveDir)throws IOException
{
}
}
第三步:创建文件上传实体类
创建文件上传实体类
简单介绍该类:该类根据自己的业务需要,在指定的文件夹(根目录)下,把每天上传的重新命名的文件放在单独的文件夹(文件夹的名字是今天的日期yyyymmdd)下,
其中可能涉及自己写的一些工具方法,这些方法主要是关于文件路径创建的,可以跳过,但不影响文章的阅读。该类把上传文件的原来的名字和处理后的名字封装
成了该类的属性,方便使用。该类完全支持多文件上传,但需要把该类的属性改成list集合,具体操作,你懂得
public class FileUploadModel {
@SuppressWarnings("unchecked")
public void fileUpload() throws Exception{
try {
//获取文件的跟路径
String uploadDir = ResourceConfig.getSysUploadWebPath();
//前缀 文件夹
String prefix = TimeUtil.nowDate();
//存放文件的临时文件夹
String tempDir = uploadDir + prefix +"\\";
File fileDir = new File(tempDir);
if(!fileDir.exists()){
fileDir.mkdir();
}
// 磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// threshold 极限、临界值,即硬盘缓存 1M 达到1M后flush
factory.setSizeThreshold(1024 * 1024);
// repository 贮藏室,即临时文件目录
factory.setRepository(new File(tempDir));
//文件上传核心类
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置允许上传的最大文件大小 20M
upload.setSizeMax(20 * 1024 * 1024);
HttpServletRequest request = ServletActionContext.getRequest();
// 解析HTTP请求消息头
List<FileItem> fileItems = upload.parseRequest(request);
log.info("length:"+fileItems.size());
Iterator<FileItem> iter = fileItems.iterator();
while(iter.hasNext()) {
FileItem item = (FileItem)iter.next();
if(!item.isFormField()) {
log.info("处理上传的文件 ...");
// 此时的文件名包含了完整的路径,得注意加工一下
filename = item.getName();
//上传文件的大小
long fileSize = item.getSize();
if("".equals(filename) && fileSize == 0){
log.info("获取文件名失败,文件名为空...");
return;
}else if (fileSize > 20 * 1024 * 1024){
// 如果上传的软件超过20M
log.info("文件保存失败,上传文件过大,请控制在20M以内");
return;
}
log.info("完整的文件名:" + filename);
//文件名
String suffix = TimeUtil.now() + "_" + RandomUtil.randomAlphabetic(4);
// 文件扩展名
String nameExt = "";
// 获取扩展名即获取文件的格式
nameExt = FileNameUtil.getNameExt(item.getName());;
//处理后的完整的文件名
String tmpPath = tempDir + suffix + "." + nameExt;
proFileName = proFileName+prefix +"\\"+ suffix + "." + nameExt;
File uploadFile = new File(tmpPath);
if(!uploadFile.exists()){
uploadFile.createNewFile();
}
//将上传的文件写到指定的文件中
item.write(uploadFile);
log.info("文件保存完毕");
}else{
String name = item.getFieldName();
String value = item.getString();
log.info("表单....."+name+"="+value);
}
}
} catch (Exception e) {
log.info("上传文件发生异常 ...");
e.printStackTrace();
throw e;
}
}
//日志跟踪
private Logger log = Logger.getLogger(FileUploadModel.class);
//处理后的完整的文件名
private String proFileName = "\\";
//上传文件的完整文件名
private String filename = "";
get/set方法............
}
第四步:调用上传类
在需求的action对应的方法中调用FileUploadModel upload = new FileUploadModel();
upload.fileUpload();
String fileName = upload.getFilename();//文件原来的名字
String proFileName = upload.getProFileName();//文件处理后的完整路径和名字
第五步:jsp文件的处理
<form name="" action="" method="post" enctype="multipart/form-data" target="targetFrame"> <input type="file" name="abcc"> ------->name一定要有值
</form>
<iframe name="targetFrame" style="width:0%;display: none;;"></iframe> ----------->可以理解为伪ajax异步刷新