目录结构-----------------------------------------------------------------------------------------
1.上传工具类
package org.usc.utils; import java.io.File; import java.io.FileInputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.Properties; /** * @Desc:动态读取配置文件类</br> * @Filename:UploadConfigurationRead.java</br> * @Author:jwdstef</br> * @Date:2012-6-13下午03:24:41</br> */ public class UploadConfigurationRead { /** * 属性文件全名,需要的时候请重新配置PFILE */ private static String PFILE = "upload.properties"; /** * 配置文件路径 */ private URI uri = null; /** * 属性文件所对应的属性对象变量 */ private long m_lastModifiedTime = 0; /** * 对应于属性文件的文件对象变量 */ private File m_file = null; /** * 属性文件所对应的属性对象变量 */ private Properties m_props = null; /** * 唯一实例 */ private static UploadConfigurationRead m_instance = new UploadConfigurationRead(); /** * 私有构造函数 * * @throws URISyntaxException */ private UploadConfigurationRead() { try { m_lastModifiedTime = getFile().lastModified(); if (m_lastModifiedTime == 0) { System.err.println(PFILE + "file does not exist!"); } m_props = new Properties(); m_props.load(new FileInputStream(getFile())); } catch (URISyntaxException e) { System.err.println(PFILE+"文件路径不正确"); e.printStackTrace(); } catch (Exception e) { System.err.println(PFILE+"文件读取异常"); e.printStackTrace(); } } /** * 查找ClassPath路径获取文件 * * @return File对象 * @throws URISyntaxException */ private File getFile() throws URISyntaxException { URI fileUri = this.getClass().getClassLoader().getResource(PFILE).toURI(); m_file = new File(fileUri); return m_file; } /** * 静态工厂方法 * * @return 返回ConfigurationRead的单一实例 */ public synchronized static UploadConfigurationRead getInstance() { return m_instance; } /** * 读取一特定的属性项 */ public String getConfigItem(String name, String defaultVal) { long newTime = m_file.lastModified(); // 检查属性文件是否被修改 if (newTime == 0) { // 属性文件不存在 if (m_lastModifiedTime == 0) { System.err.println(PFILE + " file does not exist!"); } else { System.err.println(PFILE + " file was deleted!!"); } return defaultVal; } else if (newTime > m_lastModifiedTime) { m_props.clear(); try { m_props.load(new FileInputStream(getFile())); } catch (Exception e) { System.err.println("文件重新读取异常"); e.printStackTrace(); } } m_lastModifiedTime = newTime; String val = m_props.getProperty(name); if (val == null) { return defaultVal; } else { return val; } } /** * 读取一特定的属性项 * * @param name * 属性项的项名 * @return 属性项的值(如此项存在), 空(如此项不存在) */ public String getConfigItem(String name) { return getConfigItem(name, ""); } }
package org.usc.file; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import org.usc.utils.UploadConfigurationRead; import com.opensymphony.xwork2.ActionSupport; /** * @Desc:多文件上传工具类</br> * @Filename:UploadAction.java</br> * @Author:jwdstef</br> * @Date:2012-6-13下午03:26:23</br> */ public class UploadAction extends ActionSupport { private static final long serialVersionUID = 1L; // 实际上传文件 private File upload; // 文件的内容类型 private String uploadContentType; // 上传文件名 private String uploadFileName; private List<UploadFiles> uploadFiles = new ArrayList<UploadFiles>(); public String execute() throws Exception { try { String targetDirectory = ServletActionContext.getServletContext() .getRealPath("/"+ UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim());// 获得路径 // 上传的文件名 String fileName = uploadFileName; // 文件类型 String type = uploadContentType; // 保存的文件名称,使用UUID+后缀进行保存 String realName = UUID.randomUUID().toString()+ getExt(fileName); File target = new File(targetDirectory, realName); // 上传至服务器的目录 FileUtils.copyFile(upload, target); // 在把路径写入数据库即可 // 创建文件 UploadFiles uf = new UploadFiles(); uf.setUploadContentType(type); uf.setUploadFileName(fileName); uf.setUploadRealName(realName); uploadFiles.add(uf);// 添加到需要下载文件的List集合中 ServletActionContext.getRequest().setAttribute("uploadFiles", uploadFiles); } catch (Exception e) { e.printStackTrace(); addActionError(e.getMessage()); return INPUT; } return SUCCESS; } public File[] getUpload() { return upload; } public void setUpload(File[] upload) { this.upload = upload; } public String[] getUploadContentType() { return uploadContentType; } public void setUploadContentType(String[] uploadContentType) { this.uploadContentType = uploadContentType; } public String[] getUploadFileName() { return uploadFileName; } public void setUploadFileName(String[] uploadFileName) { this.uploadFileName = uploadFileName; } public static String getExt(String fileName) { return fileName.substring(fileName.lastIndexOf(".")); } }
package org.usc.file; /** * @Desc:上传文件工具VO类</br> * @Filename:UploadFiles.java</br> * @Author:jwdstef</br> * @Date:2012-6-13下午03:23:36</br> */ public class UploadFiles { //上传的文件名称 private String uploadFileName; //类型 private String uploadContentType; //保存的文件真实名称,UUID private String uploadRealName; //如果使用数据库的话,建议这三个字段都进行保存 public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } public String getUploadRealName() { return uploadRealName; } public void setUploadRealName(String uploadRealName) { this.uploadRealName = uploadRealName; } }
package org.usc.file; import java.io.InputStream; import java.io.UnsupportedEncodingException; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.ServletActionContext; import org.usc.utils.UploadConfigurationRead; public class DownloadAction extends ActionSupport { private static final long serialVersionUID = 6329383258366253255L; private String fileName; private String fileRealName; public void setFileName() { // 得到请求下载的文件名 String fname = ServletActionContext.getRequest().getParameter("name"); String frealname = ServletActionContext.getRequest().getParameter("realname"); try { /* * 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。 * 这里使用request.setCharacterEncoding解码无效. * 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件 */ fname = new String(fname.getBytes("ISO-8859-1"), "UTF-8"); frealname= new String(frealname.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception e) { e.printStackTrace(); } this.fileName = fname; this.fileRealName = frealname; // System.out.println(fileName); // System.out.println(fileRealName); } /* * @getFileName 此方法对应的是struts.xml文件中的: <param * name="contentDisposition">attachment;filename="${fileName}"</param> * 这个属性设置的是下载工具下载文件时显示的文件名, 要想正确的显示中文文件名,我们需要对fileName再次编码 * 否则中文名文件将出现乱码,或无法下载的情况 */ public String getFileName() throws UnsupportedEncodingException { fileRealName = new String(fileRealName.getBytes(), "ISO-8859-1"); return fileRealName; } /* * @getDownloadFile 此方法对应的是struts.xml文件中的: <param * name="inputName">downloadFile</param> 返回下载文件的流,可以参看struts2的源码 */ public InputStream getDownloadFile() { this.setFileName(); return ServletActionContext.getServletContext().getResourceAsStream("/"+UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim()+"/" + fileName); } @Override public String execute() throws Exception { return SUCCESS; } }
#Whether Struts is in development mode or not struts.devMode=true #Whether the localization messages should automatically be reloaded struts.i18n.reload=true #Whether to reload the XML configuration or not struts.configuration.xml.reload=true struts.multipart.maxSize = 633542440
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="utf8" /> <package name="file" namespace="/" extends="struts-default"> <action name="showUpload"> <result>/upload.jsp</result> </action> <action name="upload" class="org.usc.file.UploadAction"> <result name="input">/upload.jsp</result> <!-- <result name="success">/upload_success.jsp</result>--> <result name="success">/download.jsp</result> <interceptor-ref name="fileUpload"> <!--大家可以设置成自己的配置,想文件类型和大小等限制 --> <!-- <param name="maximumSize">633542440</param> --> <!-- <param name="allowedTypes">application/vnd.ms-excel</param> --> <!-- --> <!-- 容许文件类型为doc,ppt,xls,pdf,txt,java--> <!-- --> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="download" class="org.usc.file.DownloadAction"> <result name="success" type="stream"> <param name="contentDisposition">attachment;filename="${fileName}"</param> <param name="inputName">downloadFile</param> </result> </action> </package> </struts>7.upload.properties上传文件路径文件
uploadFilePath=upload/file
上传到项目对应的webroot的upload文件下的file文件中8.上传文件jsp页面
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>upload</title> </head> <body> <script type="text/javascript"> <s:form action="upload.action" theme="simple" method="post" enctype="multipart/form-data"> <table align="center" width="50%" border="1"> <tr> <td> 上传文件 </td> <td id="more" > <s:file name="upload"></s:file> </td> </tr> <tr> <td> <s:submit value=" 确认 "></s:submit> </td> <td> <s:reset value=" 重置 "></s:reset> </td> </tr> </table> </s:form> </body> </html>
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <title>download</title> </head> <body> <table align="center" width="50%" border="1"> <tr> <td align="center"> 文件下载 </td> </tr> <c:forEach var="uploadFiles" items="${uploadFiles}"> <tr> <td> <a href="download.action?name=${uploadFiles.uploadRealName }&realname=${uploadFiles.uploadFileName }">${uploadFiles.uploadFileName }</a> </td> </tr> </c:forEach> </table> </body> </html>