1、struts2上传 以下是一个上传涉及的代码,从view到action的各个阶段代码: 页面: Html代码 <form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" > <ul> <li> <input type="file" name="uploadFile" size="20"/> <input type="submit" value="导入"/> </li> </ul> </form> action代码: Java代码 public class UploadFileAction extends ActionSupport { private static final long serialVersionUID = 5563083429360573304L; /** 上传文件 */ private File uploadFile; private String uploadFileFileName; private String uploadFileContentType; public String upload() { try { //这里是上传文件,可做具体处理 IOUtils.copy(new FileInputStream(uploadFile), new FileOutputStream(new File("C:\\" + uploadFileFileName))); System.out.println(uploadFileFileName); System.out.println(uploadFileContentType); } catch (Exception e) { e.printStackTrace(); } return SUCCESS; } } 配置文件就不再描述。以上就是在struts2中上传涉及的代码,同时还可以支持同时上传多个文件: 支持同时上传多个文件: Html代码 <form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" > <ul> <li> <input type="file" name="uploadFiles" size="20"/> <input type="file" name="uploadFiles" size="20"/> <input type="file" name="uploadFiles" size="20"/> <input type="submit" value="导入"/> <input type="input" name="message"/> </li> </ul> </form> 和action代码: Java代码 public class UploadFileAction extends ActionSupport { private static final long serialVersionUID = 5563083429360573304L; /** 上传文件 */ private File[] uploadFiles; private String[] uploadFilesFileName; private String[] uploadFilesContentType; public String upload() { try { int index = 0; for (File file : uploadFiles) { IOUtils.copy(new FileInputStream(file), new FileOutputStream(new File("C:\\" + uploadFilesFileName[index]))); System.out.println(uploadFilesFileName[index]); System.out.println(uploadFilesContentType[index]); index++; } } catch (Exception e) { e.printStackTrace(); } return SUCCESS; }} 2、几点说明 1、在上面上传过程中,页面file域属性名与action中File保持一致。如上: Java代码 name="uploadFile" 和 private File uploadFile 多个文件需要是数组。 2、之所以如此简单,得益于struts2中默认package:struts-default中 Java代码 <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> 在FileUploadInterceptor中讲HttpServletRequest请求对象封装成MultiPartRequestWrapper,对上传文件提供了对上传文件的各种处理: 这里提供了对文件、文件名、contentType等属性获取的封装,当然也有对普通表单字段的封装,即如果在上传的表单中有非file域也统一可以获取,而这在普通的servlet上传中并不能简单的处理,如上面的多个文件上传表单中的message,只需要在action中有相应的getter/setter即可获取这些属性。而完成这一切的是一个叫MultiPartRequest的家伙。 3、MultiPartRequest 这是上传拦截器中处理封装的具体类,这涉及struts2中上传的底层具体实现,在这个接口中,我们能看到struts2中提供了一个默认的实现: Java代码 public class JakartaMultiPartRequest implements MultiPartRequest 在struts2的default.properties中解析有如下说明: Java代码 ### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data # struts.multipart.parser=cos # struts.multipart.parser=pell struts.multipart.parser=jakarta # uses javax.servlet.context.tempdir by default struts.multipart.saveDir= struts.multipart.maxSize=2097152 这里对MIME-type为multipart/form-data的几种支持,而默认为jakarta,即在使用struts2的上传,需要添加相应的依赖(版本自行控制): Java代码 <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> 4、关于file、filename、contentType 前面已经说了,在action中的File需要和也没file域中的名字保持一致,如果多个则是File数组。而如果要获取fileName以及相应的contentType,命名也有一定的限制,如上面的action中: Java代码 private File[] uploadFiles; private String[] uploadFilesFileName; private String[] uploadFilesContentType; 而这里的命名来自FileUploadInterceptor中对MultiPartRequestWrapper解析完放置于ActionContext中所作的处理: 见MultiPartRequestWrapper中: Java代码 if (files != null && files.length > 0) { List<File> acceptedFiles = new ArrayList<File>(files.length); List<String> acceptedContentTypes = new ArrayList<String>(files.length); List<String> acceptedFileNames = new ArrayList<String>(files.length); String contentTypeName = inputName + "ContentType"; String fileNameName = inputName + "FileName"; for (int index = 0; index < files.length; index++) { if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) { acceptedFiles.add(files[index]); acceptedContentTypes.add(contentType[index]); acceptedFileNames.add(fileName[index]); } } if (!acceptedFiles.isEmpty()) { Map<String, Object> params = ac.getParameters(); params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()])); params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()])); params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()])); } }
详细解决方案
struts2下传
热度:90 发布时间:2012-07-15 20:11:39.0
相关解决方案
- struts2.xml的action中的result报错,该怎么处理
- (Struts2+JSON+Ajax) XMLHttpRequest ==500如何解决
- struts2 对象属性流入不进去, 报错:target is null for setProperty(null, "x" [Ljava.lang.Stri
- Struts2 <select>上拉框 回显有关问题
- struts2 添加和修改怎么在一个jsp页面实现
- struts2 查询输出的有关问题
- 零配置的有关问题(struts2+Hibernate)
- struts2 神奇有关问题,太神奇了!
- struts2 的<s:iterator>标签展示未完全初始化的数组出现奇怪的有关问题
- struts2 文件下传有关问题
- struts2+ajax请求失败,帮忙看一上
- struts2-json中诠注@JSON(deserialize=false)是什么用?不是阻止JSON反序列化成JAVA对象吗?求解
- struts2 循环累加属性值有关问题
- struts2,hibernate,spring3 常用框架的API CHM版本,该怎么处理
- struts2 将jsp回到到另一个jsp中
- struts2 提交表单不能跳转页面有关问题!action已经执行,但是不能跳转到指定的页面
- struts2,hibernate,spring3 惯用框架的API CHM版本
- Struts2+Spring+JPA+FREEMARKER 登录程序异常
- struts2+Hibernate一个很奇怪的现象,该如何解决
- struts2 action中部分语句被直接跳过不执行. 请教这会是什么原因
- struts2+iReport 子表格 急需高手解决,已经困惑三天了!
- import cn.luxh.struts2.entity.Novel 急需的jar包是哪个
- struts2 hibernate 分页有关问题
- struts2 + spring 整合有关问题
- 请教哪里可以上到 struts2-json-plugin-2.1.8的源文件
- struts2+freemarker中文参数乱码有关问题
- struts2 exception,该怎么解决
- struts2 fileupload 下传有关问题
- struts2.3.4+spring3.1+mybats帮忙看看这个有关问题
- struts2 部署有关问题