上传html页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>写心情</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body style="font-size:14px;"> <h2>写微博 <a href="index.jsp">返回首页</a></h2> <form action="upload" method="post" enctype="multipart/form-data"> <textarea name="sayMessage" rows="4" cols="50"></textarea><br> 发文件<input name="upload" type="file"/><input type="submit" value="发微博"> </form> </body> </html>
上传action:
package com.gifer.action; import java.io.File; import java.io.IOException; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class FileUpLoadAction extends ActionSupport { private static final long serialVersionUID = -1232100382633301276L; private static final Logger log = Logger.getLogger(FileUpLoadAction.class); // 微博内容 private String sayMessage; // 上传多个文件的集合文本 private List<File> upload; // 多个上传文件的类型集合 private List<String> uploadContextType; // 多个上传文件的文件名集合 private List<String> uploadFileName; // 文件存放路径根目录 private String savePath; public String getSayMessage() { return sayMessage; } public void setSayMessage(String sayMessage) { this.sayMessage = sayMessage; } public List<File> getUpload() { return upload; } public void setUpload(List<File> upload) { this.upload = upload; } public List<String> getUploadContextType() { return uploadContextType; } public void setUploadContextType(List<String> uploadContextType) { this.uploadContextType = uploadContextType; } public List<String> getUploadFileName() { return uploadFileName; } public void setUploadFileName(List<String> uploadFileName) { this.uploadFileName = uploadFileName; } public void setSavePath(String savePath) { this.savePath = savePath; } @Override public String execute() throws Exception { // 把上传的文件放到指定的路径下 // savePath = ServletActionContext.getServletContext().getRealPath( // "/WEB-INF/uploadfiles"); savePath = ServletActionContext.getServletContext().getRealPath( savePath); // 写到指定的路径中 File file = new File(savePath); // 如果指定的路径没有就创建 if (!file.exists()) { file.mkdirs(); } // 把得到的文件的集合通过循环的方式读取并放在指定的路径下 for (int i = 0; i < upload.size(); i++) { try { // list集合通过get(i)的方式来获取索引 FileUtils.copyFile(upload.get(i), new File(file, uploadFileName.get(i))); } catch (IOException e) { log.error(e.getMessage(), e); } } return SUCCESS; } }
struts.xml配置:
<action name="upload" class="myFileUploadAction"> <result name="success">/index.jsp</result> <result name="input">/saymessage.html</result> <!--struts2默认只能上传2M文件,类型不限。 配置拦截器来限制上传文件的类型和大小 --> <interceptor-ref name="fileUpload"> <!-- 限定文件上传类型 --> <param name="allowedTypes">image/png,image/x-png,image/jpg,image/pjpeg,image/bmp,image/gif</param> <!-- maximumSize指每个上传文件的大小上限,单位为:byte,这里设为30M,该值不能大于struts.properties中的struts.multipart.maxSize总大小--> <param name="maximumSize">31457280</param> <!-- 文件上传路径 --> <param name="savePath">E:\\UploadFileDemo</param> </interceptor-ref> <!-- 默认拦截器 --> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
<interceptor-ref name="fileUpload">中name="fileUpload"的名字是固定的。
1、在struts.xml的中添加<constant name="struts.multipart.maxSize" value="209715200" />常量设置
2、在struts.xml同目录下,创建一个struts.properties文件,内容如下:
#文件上传保存路径 struts.multipart.saveDir=E\:\\\\UploadFileDemo #文件上传大小上限(单位:byte)这里是200M struts.multipart.maxSize=209715200 #更改上传文件类型不允许的提示信息 struts.messages.error.content.type.not.allowed=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u60A8\u4E0A\u4F20\u7684\u6587\u4EF6\u7C7B\u578B\u4E0D\u88AB\u5141\u8BB8 #更改上传文件太大的提示信息 struts.messages.error.file.too.large=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u60A8\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u4E0A\u9650\uFF0830M\uFF09 #文件上传其它错误信息 struts.messages.error.uploading=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u4E0A\u4F20\u7A0B\u5E8F\u53D1\u751F\u5185\u90E8\u9519\u8BEF
使用第二种方法就OK了。
另外,在配置完struts.properties后,运行发现提示错误,说struts.multipart.saveDir 为空,所以我就加了这个配置。
<param name="allowedTypes">image/png,image/x-png,image/jpg,image/pjpeg,image/bmp,image/gif</param>
对于文件上传类型限制补充2点:
1、在使用image/x-png,上传png文件时,提示文件类型不允许,后来加入image/png就好了。
2、对于上传jpeg文件,需要image/pjpeg。