`
ducklsl
  • 浏览: 24799 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Struts2自学笔记——Struts2的文件上传

阅读更多
      利用Struts2实现文件上传的方式主要分为两种,一种是使用最基础的FileInputStream读取到内存,然后利用FileOutputStream来实现文件的写入硬盘;另外一种是使用Apache的commons-io这个jar包封装好的方法,其中FileUtils类的copyFile(srcFile,destFile)方法将struts2默认的临时目录中的文件复制到实际的上传目录中。
       构建项目的方式就和构架构建普通的Struts2的项目一致,首先加入jar包,然后配置web.xml文件,然后编写struts.xml(可以从Struts2的Example中将公共部分复制到自己的项目中,将不必要的部分删除,这样既省事儿省力又可以保证正确性)
上传页面代码:
<form action="uploadfile" method="post" enctype="multipart/form-data">
    	用户名:<input type="text" name="username" id="username"/><br/>
    	文  名:<input type="file" id="filename" name="upload"/><br/>
    	<input type="submit" value="提交"/>
    	<div>${message}</div>
    </form><br/>
    <form action="uploadfile2" method="post" enctype="multipart/form-data">
    	用户名:<input type="text" name="username" id="username"/><br/>
    	文  名:<input type="file" id="filename" name="upload"/><br/>
    	<input type="submit" value="提交"/>
    	<div>${message}</div>
    </form>

Action的上传文件处理代码:
使用FileInputStream和FileOutputStream的最基本的方法:
private File upload;  //上传的文件,与页面的<input type="file" name="upload"/>中的name属性一致
	private String uploadFileName;//文件名,Struts规定个格式 [name]FileName
	private String uploadContentType;//文件类型,Struts规定的格式[name]ContentType
	private String username;
	//private String parentDir;

	@SuppressWarnings("deprecation")
	public String execute() {
		try {
			InputStream is = new FileInputStream(upload);//创建输入流,读取上传文件
			//String parentDir = ServletActionContext.getServletContext().getRealPath(parentDir);
			String parentDir = ServletActionContext.getRequest().getRealPath(
					"/upload");//指定文件上传目录
			File destFile = new File(parentDir, this.getUploadFileName());
			if (!destFile.getParentFile().exists()) {//判断存放文件的目录是否存在
				destFile.getParentFile().mkdir();//不存在则创建
			}
			OutputStream os = new FileOutputStream(destFile);//创建输出流,将内容写入文件
			byte[] buffer = new byte[1024];
			int length = 0;
			while ((length = is.read(buffer)) > 0) {// 读文件
				os.write(buffer, 0, length);// 写文件
			}
			is.close();//关闭inputStream
			os.close();//关闭outputStream

		} catch (Exception e) {
			e.printStackTrace();
		}
		return "success";
	}
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUsername() {
		return username;
	}
上传文件的路径也可以在Struts.xml文件中Action的param属性进行指定,然后通过
ServletActionContext.getServletContext().getRealPath(paramName)
获取到相应的参数值即可;
使用Commons-io这个jar包提供的方法:
/**
  ...与之前的方法一致的部分(各个字段的setters和getters)

*/
public String execute(){
		String parentDir = ServletActionContext.getRequest().getRealPath("/upload");
		File destFile = new File(parentDir,this.getUploadFileName());
		if(!destFile.getParentFile().exists()){
			destFile.getParentFile().mkdir();
		}
		try {
			FileUtils.copyFile(upload, destFile);//将文件从临时文件目录复制到目标目录
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "success";
	}
配置文件Struts.xml
<!-- 配置文件上传临时目录 -->
	<!-- <constant name="struts.multipart.saveDir " value="e:/tmpupload" /> -->
	<package name="uploadfile" extends="struts-default">
		<action name="uploadfile" class="changluo.file.UploadFileAction">
			<!-- 配置上传路径 -->
			<!-- <param name="parentDir">/upload</param> -->
			<result name="success">/uploadResult.jsp</result>
			<result name="input">/index.jsp</result>
			<!-- 配置拦截器,可以惊醒一些特殊的需求 -->
			<!-- 
			<interceptor-ref name="fileupload">
				<param name="maximumsize">409600</param>
				<param name="allowedTypes">
					application/vnd.ms-powerpoint
				</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref> -->
		</action>
		<action name="uploadfile2" class="changluo.file.UploadFileAction2">
			<result name="success">/uploadResult.jsp</result>
			<result name="input">/index.jsp</result>
		</action>
	</package>
如果需要满足特殊的上传需求,可以配置拦截器,在拦截器里配置允许的上传文件类型以及上传文件的大小
<param name="maximumsize">409600</param>
<param name="allowedTypes">
					application/vnd.ms-powerpoint
</param>
翻看Struts2的org.apache.struts2.interceptor.FileUploadInterceptor类的源代码就可以看到这俩属性的定义:
Protected long maximumSize;
Protected String allowedTypes
***具体的文件上传类型可以参考tomcat目录下的conf\web.xml文件中的一系列文件类型。
关于Struts2上传文件的临时目录,翻看Struts2中的Struts.properties文件就可以看到这么两句
#uses java.servlet.context.tempdir by default
struts.multipart.saveDir=
如果Struts2上传文件的临时目录在Struts.xml中没有设置设置
<constant name="struts.multipart.saveDir " value="e:/tmpupload" />
则可以在控制台看到如下提示信息:
信息: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
另外,还可以通过设置struts.i18n.encoding的属性进行修改编码设置!
其实这两种方式的实现机理都是一致的,都是通过第一种这种最基础的方式实现的,翻看Commons-io这个jar包中的FileUtils类的源代码就可以轻易的发现!
得找机会看看关于Commons-fileupload实现文件上传的相关资料!!个人感觉apache的很多开源项目都很不错~~~~可惜自己还没有怎么熟悉啊~~~
4
0
分享到:
评论

相关推荐

    struts2自学笔记

    Struts2自学笔记 Struts2是Java Web开发中的一款广泛应用的MVC框架,它基于Model-View-Controller设计模式,旨在简化企业级应用的开发流程。本自学笔记将深入探讨Struts2的核心概念、主要功能及其实现原理。 1. **...

    Struts2超详细学习笔记分享(献给自学新人)

    本篇超详细学习笔记将带你逐步深入理解Struts2的核心概念和运作机制。 首先,让我们了解Struts2的基本特性。Struts2是一个基于Servlet的框架,它通过将JSP作为视图(View),Servlet作为控制器(Controller),并将...

    自学传智博客struts2-黎活明-源码-第01讲_01介绍struts2及struts2开发环境的搭建_DemoStruts2.rar

    自学传智博客struts2-黎活明-源码-第01讲_01介绍struts2及struts2开发环境的搭建_DemoStruts2.rar; 笔记地址:http://www.guloulou.com/?p=1253

    Struts1新手入门笔记(全)

    在本入门笔记中,我们将逐步了解如何开始使用Struts1。 首先,Struts1的核心组件包括前端控制器ActionServlet,它作为整个应用的入口点,负责处理所有的HTTP请求。ActionServlet会解析请求,根据配置文件(通常位于...

    struts自学笔记

    6. **配置Struts2配置文件**:在`struts.xml`中定义Action和结果映射,让Struts2知道如何根据用户的请求找到对应的Action并返回结果页面。 ```xml &lt;struts&gt; &lt;package name="default" namespace="/" extends="...

    自学传智博客struts2-黎活明-源码-第02讲_02第一个struts2应用开发_DemoStruts2.rar

    本资源“自学传智博客struts2-黎活明-源码-第02讲_02第一个struts2应用开发_DemoStruts2.rar”提供了黎活明老师在传智博客上讲解的第一个Struts2应用的开发示例,帮助初学者理解并实践Struts2的核心概念和使用方法。...

    传智播客2016版hibernate+struts2+Spring框架资料课件+笔记

    《传智播客2016版hibernate+struts2+Spring框架学习资源详解》 在IT行业中,框架的使用是开发高效、稳定应用的关键。本资源包聚焦于三大主流Java Web框架:Hibernate、Struts2和Spring,它们在2016年时仍然是开发者...

    j2ee自学笔记--- 一些心得

    这个自学笔记主要围绕着J2EE的核心技术展开,涵盖了开发过程中的心得和经验,旨在帮助初学者和有经验的开发者进一步理解和掌握J2EE的魅力。 首先,我们来看“Struts编程”。Struts是一个基于MVC(Model-View-...

    ssh自学笔记

    SSH自学笔记主要涵盖的是Secure Shell(SSH)协议的使用、配置和相关的重要知识点。SSH是一种网络协议,用于安全地远程登录到服务器,进行文件传输,以及其他命令行操作。以下是一些核心的学习点: 1. **SSH基础...

    java自学笔记

    Java自学笔记概述 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。这份“java自学笔记”涵盖了从基础到进阶的多个Java知识点,旨在帮助初学者系统地学习并掌握...

    struts经典笔记

    经典的struts自学宝典,都是我的潜心专研,精心总结出来的

    达内学习笔记,java笔记

    总的来说,这份“达内学习笔记,java笔记”是Java初学者和进阶者宝贵的自学资料,它将帮助学习者巩固Java基础知识,理解Struts框架的使用,并且提升JavaScript的实战技能,为成为一名合格的Java开发者打下坚实的基础...

    JavaWeb自学的心得和笔记

    下面,我将根据标题“JavaWeb自学的心得和笔记”以及提供的文件名称,详细阐述一些关键的知识点。 首先,JavaWeb是基于Java语言进行Web应用开发的框架和技术集合。它包括了Servlet、JSP、JSTL、EL表达式、过滤器、...

    SSH的笔记整理和重点讲解

    马士兵Struts2学习笔记2011.doc可能涵盖了Struts2的基本概念、配置、动作调度、拦截器、结果类型等内容,以及如何结合其他技术如JSP、Servlet来实现一个完整的Web应用。 2. **Hibernate**: Hibernate是一个对象...

    北京圣思园javaweb课件和笔记

    "北京圣思园javaweb课件和笔记"很可能是某次培训课程或自学资源,包含了关于这个主题的详细讲解和学习记录。 在JavaWeb开发中,基础知识点主要包括: 1. **Servlet与JSP**:Servlet是Java编写服务器端应用程序的...

    jfinal自学笔记

    `controllerKey` 可包含正斜杠,如 `/admin/article`,这类似 Struts2 中的命名空间功能,帮助组织和管理控制器层次结构。 2. **表单提交与Web配置** 当用户在页面上填写表单并提交时,如 `...

    狂神说 JavaWeb 笔记

    6. **MVC框架**:在实际开发中,如Spring MVC和Struts2等MVC框架常被用来提高开发效率。狂神说可能会讲解这些框架的基本概念、配置以及如何整合到项目中。 7. **AJAX(Asynchronous JavaScript and XML)**:AJAX使...

    我的学习笔记集合(包括有corejava,jdbc,hibernate,ejb,c++,servlet,spring,struts,jsp)

    虽然现在Struts2已经较过时,但了解其工作原理对理解现代框架如Spring MVC仍然有帮助。 9. **JSP (JavaServer Pages)**: JSP是一种动态网页技术,它允许在HTML页面中嵌入Java代码,以实现动态内容的生成。JSP与...

Global site tag (gtag.js) - Google Analytics