第一步:在webx项目lib目录下加入struts.jar包
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
ognl-3.0.6.jar
struts2-core-2.3.24.1.jar
struts2-dojo-plugin-2.3.24.1.jar
xwork-core-2.3.24.1.jar
第二步配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Struts08</display-name>
<!-- struts2.配置-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- struts2配置-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
第三步配置struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置字符编码 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 设置自动装载国际化 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 设置动态方法调用 -->
<constant name="struts.enable.DnamicMethodInvocation" value="true" />
<!-- 设置开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 指定每次配置文件更改后,自动重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置访问方式 -->
<constant name="struts.action.extension" value="action,," />
<!-- 去除多余的格式 -->
<constant name="struts.ui.theme" value="simple" />
<!--设置上传文件大小20MB,默认为2MB大小 -->
<constant name="struts.multipart.maxSize" value="20971520"></constant>
<package name="default" extends="struts-default" namespace="/">
<!-- 文件上传配置 -->
<action name="m" class="com.action.UploadManyFile">
<!-- 文件上传到user目录下-->
<param name="path">/user</param>
<param name="size">10240000</param>
</action>
<!-- 文件下载配置 -->
<action name="down" class="com.action.FileDownloadAction">
<param name="path">/user</param>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">filename=${fn}</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
第四步jsp写入代码
<%@ page language="java" pageEncoding="UTF8"%>
<!Doctype html>
<html >
<head>
<meta charset="UTF-8" />
<title>struts2 多文件上传</title>
</head>
<body>
<h1>struts-多文件 上传</h1>
<form action="m.action" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name" value="张三"><br>
文件:<input type="file" name="fs" multiple ><br>
文件1:<input type="file" name="fs" multiple ><br>
文件2:<input type="file" name="fs" multiple ><br>
文件3:<input type="file" name="fs" multiple ><br>
<input type="submit" value="上传"><br>
</form>
<hr>
<h1>文件下载</h1>
<a href="user/abc.jpg">下载</a>
<a href="user/abc.rar">下载zip</a>
<a href="down.action?fn=abc.rar">struts2文件下载</a>
</body>
</html>
第四步在src目录下建立UploadManyFile
import java.io.File;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class UploadManyFile extends ActionSupport implements ServletContextAware{
private String name;//
private File[] fs; //文件名
private String [] fsFileName;
private String[] fsContentType;//文件类型
private String path;//文件路径
private int size; //文件大小
private ServletContext ctx;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public File[] getFs() {
return fs;
}
public void setFs(File[] fs) {
this.fs = fs;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String[] getFsFileName() {
return fsFileName;
}
public void setFsFileName(String[] fsFileName) {
this.fsFileName = fsFileName;
}
public String[] getFsContentType() {
return fsContentType;
}
public void setFsContentType(String[] fsContentType) {
this.fsContentType = fsContentType;
}
@Override
public void setServletContext(ServletContext ctx) {
this.ctx=ctx;
}
@Override
public String execute() throws Exception {
String p=ctx.getRealPath(path);
File f=new File(p);
if(!f.exists()){
f.mkdirs();
}
for(int i=0;i<fs.length;i++){
System.out.println(path);
System.out.println(p);
System.out.println(size);
System.out.println(fs[i].length());
System.out.println("------------");
/*
* 如果文件大于上传限定值
*/
if(fs[i].length()<size){
FileUtils.copyFile(fs[i],new File(f,fsFileName[i]));
}
}
return null;
}
}
第五步建立FileDownloadAction
package com.action;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action {
private String fn; //文件名
private String path; //路径
public String getFn() {
return fn;
}
public void setFn(String fn) {
this.fn = fn;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public InputStream getInputStream() throws Exception{
//获得路径和文件名
String ip=ServletActionContext.getServletContext().getRealPath(path)+"/"+fn;
InputStream is=new FileInputStream(ip);
return is;
}
}
第六步输入项目名称运行
文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利。Struts2 已经有默认的 upload 拦截器。我们只需要写参数,它就会自动帮我们封装好。
一、 单文件上传
1.1 web.xml 配置 Struts2 核心过滤器
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
1.2 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致)
<!-- 文件上传的必要前提: 1.请求方式必须是post 2.enctype属性的取值必须是multipart/form-data 3.提供一个文件选择域 文件上传 --> <s:form action="upload.action" enctype="multipart/form-data"> <s:file name="myfile" label="请选择文件"></s:file> <s:submit value ="提交"></s:submit> </s:form>
1.3 实现文件上传的 UploadAction
public class UploadAction extends ActionSupport { //表单上提供的字段 private File myfile; //struts2在文件上传时提供的属性 private String myfileFileName;//上传的文件名。上传字段名称+FileName 注意大小写 private String myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写 public String upload (){ //1.拿到ServletContext ServletContext servletContext = ServletActionContext.getServletContext(); //2.调用realPath方法,获取根据一个虚拟目录得到的真实目录 String realPath = servletContext.getRealPath("/WEB-INF/file"); //3.如果这个真实的目录不存在,需要创建 File file = new File(realPath ); if(!file.exists()){ file.mkdirs(); } //4.把文件存过去 //拷贝:把文件的临时文件复制到指定的位置。注意:临时文件还在 //FileUtils.copyFile(myfile, new File(file,myfileFileName)); //剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了 myfile.renameTo(new File(file,myfileFileName)); return SUCCESS; } public File getMyfile() { return myfile; } public void setMyfile(File myfile) { this.myfile = myfile; } public String getMyfileFileName() { return myfileFileName; } public void setMyfileFileName(String myfileFileName) { this.myfileFileName = myfileFileName; } public String getMyfileContentType() { return myfileContentType; } public void setMyfileContentType(String myfileContentType) { this.myfileContentType = myfileContentType; } }
1.4 配置 struts.xml(注意:修改文件上传的总的大小。)
<struts> <!--constant修改struts2的默认配置值 --> <!--修改struct2称为开发模式,修改配置之后会自动加载 --> <constant name="struts.devMode" value="true" /> <!-- 限制上传文件的大小,第一种方式:通过修改struts2的常量。 在default.properties中配的struts.multipart.maxSize=2097152--> <constant name="struts.multipart.maxSize" value="4097152" /> <package name="p1" extends="struts-default"> <action name ="upload" class = "com.fhcq.action.UploadAction" method="upload"> <!-- 第二种方式:通过给fileUpload的拦截器注入参数的形式,控制上传文件的大小 无法使用 <param name="fileUpload.maximumSize">31457280</param>--> <interceptor-ref name="defaultStack"> <!-- 限制上传文件的扩展名。如果有多个,使用逗号分隔 <param name="fileUpload.allowedExtensions">jpg,png,bmp</param>--> <!-- 限制上传文件的MIME类型。 如果有多个,使用逗号分隔 --> <param name="fileUpload.allowedTypes">image/jpg,image/pjpeg,image/png </param> </interceptor-ref> <result>/index.jsp</result> <result name="input" type="redirect">/upload.jsp</result> </action> </package> </struts>
1.5 配置 fileupload_message.properties,放置在 src 下用来显示错误的资源文件信息
struts.messages.error.content.type.not.allowed=
\u4E0A\u4F20\u6587\u4EF6\u7684\u7C7B\u578B\u4E0D\u662F\u88AB\u652F\u6301\u7684: {0} "{1}" "{2}" {3}
二、 多文件上传
在以上单文件上传的基础上,修改内容如下:
2.1 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致)
<!-- 文件上传的必要前提: 1.请求方式必须是post 2.enctype属性的取值必须是multipart/form-data 3.提供一个文件选择域 --> <s:form action="upload.action" enctype="multipart/form-data"> <s:file name="myfile" label="请选择文件"></s:file> <s:file name="myfile" label="请选择文件"></s:file> <s:submit value ="提交"></s:submit> </s:form>
2.2 实现文件上传的 UploadAction
public class UploadAction extends ActionSupport { //表单上提供的字段 private File[] myfile; //struts2在文件上传时提供的属性 private String[] myfileFileName;上传的文件名。上传字段名称+FileName 注意大小写 private String[] myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写 public String upload (){ //1.拿到ServletContext ServletContext servletContext = ServletActionContext.getServletContext(); //2.调用realPath方法,获取根据一个虚拟目录得到的真实目录 String realPath = servletContext.getRealPath("/WEB-INF/files"); //3.如果这个真实的目录不存在,需要创建 File file = new File(realPath ); if(!file.exists()){ file.mkdirs(); } //4.把文件存过去 //剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了 for(int i=0;i<myfile.length;i++){ myfile[i].renameTo(new File(file,myfileFileName[i])); } return SUCCESS; } public File[] getMyfile() { return myfile; } public void setMyfile(File[] myfile) { this.myfile = myfile; } public String[] getMyfileFileName() { return myfileFileName; } public void setMyfileFileName(String[] myfileFileName) { this.myfileFileName = myfileFileName; } public String[] getMyfileContentType() { return myfileContentType; } public void setMyfileContentType(String[] myfileContentType) { this.myfileContentType = myfileContentType; } }