`

struts2学习笔记6-上传与下载文件

阅读更多
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学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    struts2学习笔记1-HelloWorld项目

    本篇学习笔记将引导我们从零开始,通过一个简单的"HelloWorld"项目,了解Struts2的基础知识。 首先,我们需要在本地环境中搭建Struts2的开发环境。这包括安装JDK、配置Java环境变量、下载Apache Struts2的最新版本...

    struts2学习笔记黑马程序员

    ### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...

    struts2学习笔记(完美总结)——转自OPEN经验库

    在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...

    struts2综合笔记

    - **发展历程**: Struts2 是在 WebWork 框架的基础上发展起来的,因此学习 Struts2 实际上也是学习 WebWork。 #### 二、Struts2 的核心组件分析 **控制器**: - **Servlet VS Filter**: - **Servlet**: - 在内存...

    Struts2学习笔记

    - **文件上传与下载**:Struts2内置支持文件上传与下载功能,方便实用。 - **批量数据处理**:支持批量处理表单提交的数据,简化复杂操作。 #### 五、总结 Struts2框架虽然已经不是目前最流行的Web开发框架,但在...

    struts2学习笔记十四(第14讲.Struts2的文件上传和下载续二)

    在本篇“Struts2学习笔记十四”中,我们将深入探讨Struts2框架如何实现文件上传和下载功能,这是web应用中常见的需求,尤其在处理用户提交的表单数据时。我们将不涉及具体代码,而是重点讲解相关概念和技术原理。 ...

    传智播客struts2全程学习笔记

    ### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...

    Struts2学习笔记与心得

    - Struts2通过其强大的插件体系结构支持各种扩展插件,这些插件可以为开发人员提供额外的功能,如数据验证、国际化、文件上传等功能,极大地简化了开发过程。 ##### 1.5 远程调用支持 - Struts2支持多种远程调用...

    struts2学习笔记十三(第13讲.Struts2的文件上传和下载续)

    在本篇“Struts2学习笔记十三”中,我们将深入探讨Struts2如何处理文件上传和下载,这是Web开发中常见的需求。 文件上传在Web应用中广泛用于让用户提交图片、文档或其他类型的数据。Struts2提供了一个名为`...

    Struts2.1学习笔记

    ### Struts2.1学习笔记 #### Struts2的来源与优点 - **来源**:Struts2是在WebWork2的基础上发展起来的,它继承了WebWork2的优点,并且进行了改进,使其更适合现代Web应用程序的需求。与Struts1相比,Struts2的...

Global site tag (gtag.js) - Google Analytics