Struts2上传文件要用到commons-fileupload和commons-io这两个组件
先看一个用Servlet而不用Struts2上传的例子吧
页面
<form action="/struts2/UploadServlet" method="post" enctype="multipart/form-data">
信息:<input type="text" name="info"/><br/>
文件:<input type="file" name="file"/><br/>
<input type="submit" name="submit"/>
</form>
Servlet代码
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
//创建工厂DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
//获得当前项目的Path(这里是当前项目下的/upload/fileupload的路径)
String path = request.getRealPath("/upload/fileupload");
//设置临时文件的存放路径
factory.setRepository(new File(path));
//设置临时文件的大小
factory.setSizeThreshold(1024*1024*2);
//创建ServletFileUpload对象,用工厂
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//调用ServletFileUpload对象的parseRequest方法获得一个装了FileItem的List
List<FileItem> list = upload.parseRequest(request);
//每个FileItem里面封装了页面表单的信息(一个)
for(FileItem fileItem : list){
//ifFormField表示是平常的表单(非file类型的)
if(fileItem.isFormField()){
//获得表单名字,如<input type="text" name="info"/>这个里面的info
String name = fileItem.getFieldName();
//获得值value,并设置为UTF-8编码
String value = fileItem.getString("utf-8");
request.setAttribute(name, value);
}else{
//获得表单名字,如<input type="file" name="file"/>这个里面的info
String name = fileItem.getFieldName();
//获得名字,这个和非file表单不一样
String value = fileItem.getName();
//获得最后一个\的位置
int i = value.lastIndexOf("\\");
//在这个位置上加1,获得这个位置之后的String
value = value.substring(i+1);
request.setAttribute(name, value);
//组件已经封装好的write方法,当然也可以用request.getInputStream()来完成
fileItem.write(new File(path,value));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//因为要传参数,所以转发
RequestDispatcher dispatcher = request.getRequestDispatcher("/upload/success.jsp");
dispatcher.forward(request, response);
}
}
用Struts2上传文件(多文件,一个文件和多个文是一样的)
先看页面,用了struts2的标签
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form method="post" action="upload" enctype="multipart/form-data">
<s:textfield name="username" label="username"></s:textfield>
<s:password name="password" label="password"></s:password>
<s:file name="fileUpload" label="filePath"></s:file>
<s:file name="fileUpload" label="filePath"></s:file>
<s:file name="fileUpload" label="filePath"></s:file>
<s:file name="fileUpload" label="filePath"></s:file>
<s:submit value="Submit"></s:submit>
</s:form>
再看Action
public class FileUploadAction extends ActionSupport implements
ApplicationAware, SessionAware, ServletRequestAware,
ServletResponseAware {
private static final long serialVersionUID = 1L;
private Map application;
private Map session;
private HttpServletRequest request;
private HttpServletResponse response;
private String username;
private String password;
private List<File> fileUpload;
private List<String> fileUploadFileName;
private List<String> fileUploadContentType;
@Override
public String execute() throws Exception {
for(int i = 0;i<fileUpload.size();i++ ){
InputStream is = new FileInputStream(this.fileUpload.get(i));
String path = this.request.getRealPath("/upload/file");
OutputStream os = new FileOutputStream(new File(path,this.fileUploadFileName.get(i)));
byte[] b = new byte[1024*200];
int length = 0;
while((length = is.read(b))>0){
os.write(b, 0, length);
}
System.out.println("path = " + path);
System.out.println("fileName" + this.fileUploadFileName.get(i) + "contentType" +this.fileUploadContentType.get(i));
os.close();
is.close();
}
return Action.SUCCESS;
}
struts.xml配置文件
<action name="upload" class="com.langhua.action.FileUploadAction">
<result name="success">/upload/uploadsuccess.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
最后上传成功展示页面
username:${username}<br/>
password:${password}<br/>
fileName:${fileUploadFileName}<br/>
fileContentType:${fileUploadContentType}
使用Converter转换Action里面的fileUploadFileName,fileUploadContentType
public class UploadConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
List<String> list = new ArrayList<String>();
for(String value : values){
list.add(value);
}
return list;
}
@Override
public String convertToString(Map context, Object o) {
List<String> list = (List<String>) o;
StringBuffer sb = new StringBuffer();
for(String value : list){
sb.append(value).append(" ");
System.out.println(value);
}
return sb.toString();
}
}
再配置上
fileUploadFileName=com.langhua.converter.UploadConverter
fileUploadContentType=com.langhua.converter.UploadConverter
页面使用struts2的标签就转换了
fileName:<s:property value="fileUploadFileName"/><br/>
fileContentType:<s:property value="fileUploadContentType"/><br/>
还可在struts.xml里面配置
<constant name="struts.multipart.saveDir" value="c:/temp"></constant>
<constant name="struts.multipart.maxSize" value="209715200"></constant>
设置上传时temp文件放的位置和最大文件的大小
还有其它的可以配置,他们都在org.apache.struts2.default.properties里面有的
比如说改连结的后缀名,编码,用的上传文件的类库
struts.i18n.encoding=UTF-8
struts.multipart.parser=jakarta
struts.action.extension=action
Struts2下载文件
<action name="download" class="com.langhua.action.DownloadAction" method="downloadFile">
<!--type 为 stream 应用 StreamResult 处理-->
<result name="success" type="stream">
<!--默认为 text/plain-->
<!-- <param name="contentType">image/pjpeg</param> -->
<!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文
件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 download.action 作为文件名,
这里使用的是动态文件名,${fileName}, 它将通过 Action 的 getFileName() 获得文件名 -->
<param name="contentDisposition">attachment;filename="${filename}"</param>
<!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法,
比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->
<param name="inputName">inputStram</param>
<param name="bufferSize">4096</param><!-- 输出时缓冲区的大小 -->
</result>
</action>
type为stream的参数来自这个类
package org.apache.struts2.dispatcher;
public class StreamResult extends StrutsResultSupport {
protected String contentType = "text/plain";
protected String contentLength;
protected String contentDisposition = "inline";
protected String inputName = "inputStream";
protected InputStream inputStream;
protected int bufferSize = 1024;
}
分享到:
相关推荐
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
本篇学习笔记将引导我们从零开始,通过一个简单的"HelloWorld"项目,了解Struts2的基础知识。 首先,我们需要在本地环境中搭建Struts2的开发环境。这包括安装JDK、配置Java环境变量、下载Apache Struts2的最新版本...
### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...
在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...
- **发展历程**: Struts2 是在 WebWork 框架的基础上发展起来的,因此学习 Struts2 实际上也是学习 WebWork。 #### 二、Struts2 的核心组件分析 **控制器**: - **Servlet VS Filter**: - **Servlet**: - 在内存...
- **文件上传与下载**:Struts2内置支持文件上传与下载功能,方便实用。 - **批量数据处理**:支持批量处理表单提交的数据,简化复杂操作。 #### 五、总结 Struts2框架虽然已经不是目前最流行的Web开发框架,但在...
在本篇“Struts2学习笔记十四”中,我们将深入探讨Struts2框架如何实现文件上传和下载功能,这是web应用中常见的需求,尤其在处理用户提交的表单数据时。我们将不涉及具体代码,而是重点讲解相关概念和技术原理。 ...
### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...
- Struts2通过其强大的插件体系结构支持各种扩展插件,这些插件可以为开发人员提供额外的功能,如数据验证、国际化、文件上传等功能,极大地简化了开发过程。 ##### 1.5 远程调用支持 - Struts2支持多种远程调用...
在本篇“Struts2学习笔记十三”中,我们将深入探讨Struts2如何处理文件上传和下载,这是Web开发中常见的需求。 文件上传在Web应用中广泛用于让用户提交图片、文档或其他类型的数据。Struts2提供了一个名为`...
### Struts2.1学习笔记 #### Struts2的来源与优点 - **来源**:Struts2是在WebWork2的基础上发展起来的,它继承了WebWork2的优点,并且进行了改进,使其更适合现代Web应用程序的需求。与Struts1相比,Struts2的...