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环境搭建 Struts2类型转换 Struts2输入校验 拦截器 文件的上传与下载 Struts2的国际化 深入探析 struts2与servlet API耦合方法
struts2学习笔记和源码,struts2原理。文件上传、i18n等等
基于 Struts2.1.8 包括Struts2的基本应用、文件上传、拦截器、输入校验、国际化、OGNL表达式、Struts2标签等内容。
NULL 博文链接:https://zhaolianyang.iteye.com/blog/859890
NULL 博文链接:https://zhaolianyang.iteye.com/blog/883505
NULL 博文链接:https://zhaolianyang.iteye.com/blog/888978
NULL 博文链接:https://zhaolianyang.iteye.com/blog/903956
NULL 博文链接:https://zhaolianyang.iteye.com/blog/890983
Struts 1.3 备忘笔记 【资源特点】 1、以项目形式组织,包含所有的源代码 2、内含详细的注释说明 3、知识点较全面 【内容目录】 01 Struts_01HandworkApply : 手工配置Struct应用程序,演示用户提交数据后服务器的...
多文件上传 博文链接:https://wuzhaohuixy-qq-com.iteye.com/blog/710102
Struts 2.1.8 学习源码内容 Struts2_01FirstDemo : 跑通第一个Struts2的实例 Struts2_02CURD : 关于Struts2的增、删、改和查 实际业务中数据来自数据库,从DAO层查询...Struts2_06FileUpload : Struts2上传文件的使用
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
整合入门(spring,struts,hibernate的整合)资料(1) 中大软件工厂项目前培训资料(1) 完整笔记+源码(1) ssh(1) C#查询参数化例子(1) 学习笔记+完整源码(1) 介绍与深入(1) 学习笔记(不含整合)(1) C#(1) .CHM格式文件制作...
4. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。 5. 本站不保证本站提供的下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。 IDER ...
ext学习笔记一 小试iBatis RIA(Rich Internet Application)的现状和未来 Java应用中域名解析不过期的解决方法 Java编程那些事儿45—数组使用示例1 一步步熟悉OFBiz 用Java做客户端调用.NET写...