JAVA Web 之 struts2文件上传下载演示(一)
一、文件上传演示
1.需要的jar包
大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/lib目录下面即可,需要的jar包如下图所示,其中的javax.servlet.jar是额外添加的,我到网上随便搜了一个下载地址http://ishare.iask.sina.com.cn/f/19185878.html?retcode=0,当然附件里面也有
2.配置web.xml
配置WebContent/WEB-INF/web.xml中的内容,如果你的项目已经配置好了struts,这步可以跳过.
- <?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
- <display-name>UpDownDemo</display-name>
- <!-- 配置struts2 -->
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- </filter>
- <!-- 所有类型的请求都会被struts拦截 -->
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
3.Web界面
其中有一点是特别需要注意的:定义form的时候,一定要添加enctype="multipart/form-data",并且一定要设置method="post"。
示例<form action="upload" enctype="multipart/form-data" method="post">
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>文件上传演示</title>
- </head>
- <body>
- <div align="center">
- <form action="upload" enctype="multipart/form-data" method="post">
- 请选择文件<br>
- <input type="file" name="file">
- <br><br>
- <input type="submit" value="确认上传">
- </form>
- </div>
- </body>
- </html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传演示</title>
</head>
<body>
<div align="center">
<form action="upload" enctype="multipart/form-data" method="post">
请选择文件<br>
<input type="file" name="file">
<br><br>
<input type="submit" value="确认上传">
</form>
</div>
</body>
</html>
4.后台JAVA代码
代码中有解析
- package action;
- import java.io.File;
- import java.io.IOException;
- import java.io.Serializable;
- import org.apache.commons.io.FileUtils;
- import org.apache.struts2.ServletActionContext;
- import util.Encrypter;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * @author Kingt.W
- */
- @SuppressWarnings("serial")
- public class FileAction extends ActionSupport implements Serializable {
- /*
- * 这里定义的变量,一定要跟网页的<input type="file" name="file">中的name属性的值一致.
- * 如果网页中定义的是<input type="file" name="img">,那么在这里就要定义File img;
- */
- private File file;
- /*
- * 这里定义的fileFileName一定要是xxxFileName的形式,否则无法取到文件的文件名.
- * 其中xxx必须与上面定义的File类型的变量一致,如果上面定义的是File img,那么这里就
- * 定义为String imgFileName
- */
- private String fileFileName;
- /*
- * 这里定义的是文件的类型,如果不需要获取文件类型的话,可以不定义.
- * 命名规则跟xxxFileName类似,这里一定要定义成xxxContentType形式.
- */
- private String fileContentType;
- /*
- * 这这个变量是重命名后的文件名
- */
- private String newFileName;
- //getters and setters我省略了,没有复制上来
- public String upload() {
- System.out.println("文件名:" + fileFileName);
- System.out.println("文件类型:" + fileContentType);
- if (file != null) {
- //文件的保存路径是WebContent/file目录下
- String realpath = ServletActionContext.getServletContext()
- .getRealPath("/file");
- System.out.println("文件的保存路径:" + realpath);
- //文件的后缀
- String suffix = fileFileName.substring(fileFileName
- .lastIndexOf("."));
- if (fileFileName.lastIndexOf(".") == -1) {
- return INPUT;
- }
- //上传以后,会重命名文件的名称,将其命名为全部是数字的文件名,防止可能出现的乱码.
- //当然, 只是为了防止出现乱码,一般不会出现乱码
- newFileName = Encrypter.randFileName() + suffix;
- File savefile = new File(new File(realpath), newFileName);
- //如果保存的路径不存在,则新建
- if (!savefile.getParentFile().exists())
- savefile.getParentFile().mkdirs();
- try {
- //复制文件
- FileUtils.copyFile(file, savefile);
- System.out.println("文件上传成功");
- } catch (IOException e) {
- e.printStackTrace();
- System.out.println("文件上传失败");
- return INPUT;
- }
- }
- return SUCCESS;
- }
- }
package action;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import util.Encrypter;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author Kingt.W
*/
@SuppressWarnings("serial")
public class FileAction extends ActionSupport implements Serializable {
/*
* 这里定义的变量,一定要跟网页的<input type="file" name="file">中的name属性的值一致.
* 如果网页中定义的是<input type="file" name="img">,那么在这里就要定义File img;
*/
private File file;
/*
* 这里定义的fileFileName一定要是xxxFileName的形式,否则无法取到文件的文件名.
* 其中xxx必须与上面定义的File类型的变量一致,如果上面定义的是File img,那么这里就
* 定义为String imgFileName
*/
private String fileFileName;
/*
* 这里定义的是文件的类型,如果不需要获取文件类型的话,可以不定义.
* 命名规则跟xxxFileName类似,这里一定要定义成xxxContentType形式.
*/
private String fileContentType;
/*
* 这这个变量是重命名后的文件名
*/
private String newFileName;
//getters and setters我省略了,没有复制上来
public String upload() {
System.out.println("文件名:" + fileFileName);
System.out.println("文件类型:" + fileContentType);
if (file != null) {
//文件的保存路径是WebContent/file目录下
String realpath = ServletActionContext.getServletContext()
.getRealPath("/file");
System.out.println("文件的保存路径:" + realpath);
//文件的后缀
String suffix = fileFileName.substring(fileFileName
.lastIndexOf("."));
if (fileFileName.lastIndexOf(".") == -1) {
return INPUT;
}
//上传以后,会重命名文件的名称,将其命名为全部是数字的文件名,防止可能出现的乱码.
//当然, 只是为了防止出现乱码,一般不会出现乱码
newFileName = Encrypter.randFileName() + suffix;
File savefile = new File(new File(realpath), newFileName);
//如果保存的路径不存在,则新建
if (!savefile.getParentFile().exists())
savefile.getParentFile().mkdirs();
try {
//复制文件
FileUtils.copyFile(file, savefile);
System.out.println("文件上传成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件上传失败");
return INPUT;
}
}
return SUCCESS;
}
}
5.配置struts.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
- <struts>
- <package name="struts" namespace="/" extends="struts-default">
- <action name="upload" class="action.FileAction" method="upload">
- <result name="success">download.jsp</result>
- <result name="input">download.jsp</result>
- </action>
- </package>
- </struts>
6.小注
至此,文件上传的功能就实现了。
<1>文件下载演示,请查看另一篇博客
http://blog.csdn.net/red_titan/article/details/7843279
<2>由于我是在J2EE Eclipse下建的项目,所以如果大家把附件下载以后,导入J2EE Eclipse是可以直接运行的,导入其他的IDE应该是没法直接运行,但是可以先新建好项目以后,把我的项目中的文件放到对应的目录下面即可
<3>效果图如下
选择文件,然后点击【确认上传】
上传文件的内容如下图所示
然后就可以在 eclipse工作空间\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\UpDownDemo\file下面找到刚刚上传的文件了。
打开文件,发现两个记事本中的内容一样(在java代码中我有解释为啥会把文件重命名)