JAVA Web 之 struts2文件上传下载演示(一)
一、文件上传演示
1.需要的jar包
大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/lib目录下面即可,需要的jar包如下图所示,其中的javax.servlet.jar是额外添加的,我到网上随便搜了一个下载地址,当然附件里面也有
2.配置web.xml
配置WebContent/WEB-INF/web.xml中的内容,如果你的项目已经配置好了struts,这步可以跳过.
Xml代码:
1 23 UpDownDemo 4 5 67 10 11struts2 8org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 912 15 16struts2 13/* 1417 19index.jsp 18
3.Web界面
其中有一点是特别需要注意的:定义form的时候,一定要添加enctype="multipart/form-data",并且一定要设置method="post"。
示例<form action="upload" enctype="multipart/form-data" method="post">
Html代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 7文件上传演示 8 9 1011 1718 19
4.后台JAVA代码
代码中有解析
java代码:
1 package action; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.Serializable; 6 7 import org.apache.commons.io.FileUtils; 8 import org.apache.struts2.ServletActionContext; 9 10 import util.Encrypter;11 12 import com.opensymphony.xwork2.ActionSupport;13 14 /**15 * @author Kingt.W16 */17 @SuppressWarnings("serial")18 public class FileAction extends ActionSupport implements Serializable {19 /*20 * 这里定义的变量,一定要跟网页的中的name属性的值一致.21 * 如果网页中定义的是,那么在这里就要定义File img;22 */23 private File file;24 /*25 * 这里定义的fileFileName一定要是xxxFileName的形式,否则无法取到文件的文件名.26 * 其中xxx必须与上面定义的File类型的变量一致,如果上面定义的是File img,那么这里就27 * 定义为String imgFileName28 */29 private String fileFileName;30 /*31 * 这里定义的是文件的类型,如果不需要获取文件类型的话,可以不定义.32 * 命名规则跟xxxFileName类似,这里一定要定义成xxxContentType形式.33 */34 private String fileContentType;35 /*36 * 这这个变量是重命名后的文件名37 */38 private String newFileName;39 40 //getters and setters我省略了,没有复制上来41 42 public String upload() {43 System.out.println("文件名:" + fileFileName);44 System.out.println("文件类型:" + fileContentType);45 46 if (file != null) {47 //文件的保存路径是WebContent/file目录下48 String realpath = ServletActionContext.getServletContext()49 .getRealPath("/file");50 System.out.println("文件的保存路径:" + realpath);51 52 //文件的后缀53 String suffix = fileFileName.substring(fileFileName54 .lastIndexOf("."));55 if (fileFileName.lastIndexOf(".") == -1) {56 return INPUT;57 }58 59 //上传以后,会重命名文件的名称,将其命名为全部是数字的文件名,防止可能出现的乱码.60 //当然, 只是为了防止出现乱码,一般不会出现乱码61 newFileName = Encrypter.randFileName() + suffix; 62 63 File savefile = new File(new File(realpath), newFileName);64 //如果保存的路径不存在,则新建65 if (!savefile.getParentFile().exists())66 savefile.getParentFile().mkdirs();67 68 try {69 //复制文件70 FileUtils.copyFile(file, savefile);71 System.out.println("文件上传成功");72 } catch (IOException e) {73 e.printStackTrace();74 System.out.println("文件上传失败");75 return INPUT;76 }77 }78 79 return SUCCESS;80 }81 }
5.配置struts.xml
xml代码:
1 2 34 5 106 9download.jsp 7download.jsp 8
6.小注
至此,文件上传的功能就实现了。
<1>文件下载演示,请查看另一篇博客
<2>由于我是在J2EE Eclipse下建的项目,所以如果大家把附件下载以后,导入J2EE Eclipse是可以直接运行的,导入其他的IDE应该是没法直接运行,但是可以先新建好项目以后,把我的项目中的文件放到对应的目录下面即可
<3>效果图如下
选择文件,然后点击【确认上传】
上传文件的内容如下图所示
然后就可以在 eclipse工作空间\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\UpDownDemo\file下面找到刚刚上传的文件了。
打开文件,发现两个记事本中的内容一样(在java代码中我有解释为啥会把文件重命名)