回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法。映射机制及其在深入分析。最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上传下载的实例。

一、文件上传

Struts2并没有提供文件上传的组件。所以想要实现上传的功能就必须通过第三方组件来实现。在Struts2引用的jar中包括了文件上传的组件。它是通过commons-fileupload.jar和commons-io.jar来实现的。

这当中的处理细节不须要太懂。在使用中慢慢思考就能够做到灵活运用。

1、首先编写Action类

该类名称为downloadAction.java,必须在该类中引入java.io。文件上传的核心实现使用的还是java的数据流io操作。

package com.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class uploadAction extends ActionSupport { private File file; public File getFile() {
return file;
} public void setFile(File file) {
this.file = file;
} public String getFileFileName() {
return fileFileName;
} public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
} public String getFileContentType() {
return fileContentType;
} public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
} //文件名
private String fileFileName; //文件类型
private String fileContentType;
//注意:文件名和文件类型的名称前缀必须同样, @Override
public String execute() throws Exception{ //获取须要上传文件的文件路径
File uploadFile=new File(ServletActionContext.getServletContext().getRealPath("uploadFile"));
//推断文件是否上传,假设上传的话将会创建该文件夹
if(!uploadFile.exists()){
uploadFile.mkdir(); //创建该文件夹
} //第一种文件上传的方法
//声明文件输入流,为输入流指定文件路径
FileInputStream input=new FileInputStream(file);
//获取输出流,获取文件的文件地址及名称
FileOutputStream out=new FileOutputStream(uploadFile + "\\" +fileFileName); try{
byte[] b=new byte[1024];//每次写入的大小
int i=0;
while((i=input.read(b))>0){
out.write(b,0,i);
}
}catch(Exception e){
e.printStackTrace();
}finally{
input.close();
out.close();
} //另外一种文件上传的方法
//FileUtils.copyFile(upload,new File(uploadFile+"\\"+uploadFileName));
//FileUtils.copyFile(upload,new File(uploadFile,uploadFileName)); //第三种方法
// BufferedReader bReader=new BufferedReader(new InputStreamReader(new FileInputStream(upload)));
// BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile+"\\"+uploadFileName))); // try{
// char[] str=new char[1024];
// int i=0;
// while((i=bReader.read(str))>0){
// bWriter.write(str,0,i);
// }
// }catch(Exception e){
// e.printStackTrace();
// }finally{
// bReader.close();
// bWriter.close();
// uploadFile.delete();
// } return "success";
} }

Action类中须要注意的是文件名称和文件类型的命名都是有要求的。文件名称和文件类型的前缀必须是文件变量,而且要和jsp页面中加入的文件名称称一致,如上例中的jsp标签为:<input type='File' name='file'>,在Action类中的文件名称称和文件类型必须对应为fileXXX和fileXXX。另外也能够在该Action类中配置其他上传属性,如:能够通过maximumSize指定上传文件的大小,allowedTypes运行上传文件的类型。

上面的Action类指定了三种上传方法,它们操作的核心还是java.io。通过数据流的读入和写出来实现文件的上传。当中第一种和第三种採用的是java.io流操作,而另外一种採用的是common.io流操作。

2、struts2.xml对应的action配置

action类编写完毕后。接下来要把它配置到对应的action标签中。这样在运行action时会依据注冊类运行内部的方法。详细配置方法例如以下实例。

<package name="upload" namespace="/file" extends="struts-default">
<action name="upload" class="uploadAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/index.jsp</result>
<param name="savePath">/upload</param>
</action>
</package>

3、最后配置对应的jsp页面

在配置时须要注意的是文件的编码格式,须要改成multipart/form-data类型。是指把文件及文件的内容都提交,另外enctype还有两个属性值各自是text/plain。指定了表单是以文本的方式进行提交。application/x-www-form-urlencoded这是默认的编码方式,提交时,仅仅提交表单域的value属性值。

<body>
<form action="file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="submit" name="btnUpload" value="上传">
</form>
</body>

最后提交。查看提交结果,提交后的文件默认存放在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\项目名称\uploadFile下。所以在编写action类时须要获取文件上传的路径使用的是getRealPath("uploadFile")。

二、文件下载

相较上传,文件的下载编写起来相交就简单多了。首先也须要加入下载的action类。然后配置struts.xml中的action,最后在jsp中加入链接标签。

1、加入下载action类

加入的action类指定要注意获取文件的输出路径,通过获取输出流来获取文件的路径。

package com.action;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class downloadAction extends ActionSupport {

	private InputStream fileInput;
private String fileName; public String getFileName() {
return fileName;
} public void setFileName(String fileName) {
this.fileName = fileName;
} public InputStream getFileInput() {
return ServletActionContext.getServletContext().getResourceAsStream("upload\\"+fileName);
} public void setFileInput(InputStream fileInput) {
this.fileInput = fileInput;
} public String execute() throws Exception{
fileInput=ServletActionContext.getServletContext().getResourceAsStream("upload\\"+fileName);
return "success";
}
}

2、配置struts.xml标签

在配置时结果类型要指定type类型,将它赋值为stream,并加入属性以下的属性,该属性相同能够配置到拦截器中,在拦截器中指定配置的文件。

<action name="download" class="com.action.downloadAction">
<result name="success" type="stream">
<param name="inputName">fileInput</param>
<param name="contentDispostion">attachment;filename="$(fileName)"</param>
</result>
</action>

3、jsp页面代码

jsp代码就非常easy了,不多说看代码。

<body>
<a href="file/download">123.txt</a>
</body>

结语

通过使用文件的上传下载功能来熟悉Struts2的用法,并了解Servlet请求的基本用法,为以后深入学习Servlet打下基础。struts的文件上传和下载使用的是io流操作完毕的,能够使用java.io流,相同能够使用第三方的common.io流实现。我们将讨论在接下来的文章中涉及到多文件上传问题。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【SSH2(实用文章)】--Struts2文件上传和下载的例子的更多相关文章

  1. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  2. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

  3. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  4. 学习Struts--Chap07:Struts2文件上传和下载

    1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...

  5. struts2学习(13)struts2文件上传和下载(1)

    一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte:   例子实现 ...

  6. struts2 文件上传和下载,以及部分源代码解析

    struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...

  7. Struts2文件上传与下载

    一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...

  8. struts2文件上传和下载

    1. struts系统中的拦截器介绍 过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截. 拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候 对方法的调用进行拦截 ...

  9. 笔记:Struts2 文件上传和下载

    为了上传文件必须将表单的method设置为POST,将 enctype 设置为 muiltipart/form-data,只有设置为这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器. 上传 ...

随机推荐

  1. sort 工具总结

    sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. -u 去除重复行 -r sort默认的排序方式是升序,如 ...

  2. WPF弹性模拟动画

    原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的. 胡克定律:F=-kd F代表弹性 ...

  3. Thread Dump 和Java应用诊断(转)

    Thread Dump 和Java应用诊断 Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力.虽然各 ...

  4. 为什么android你用的越多,速度较慢的手机

    依据第三方的调研数据显示,有 77% 的 Android 手机用户承认自己曾遭遇过手机变慢的影响,百度搜索"Android+ 卡慢",也有超过 460 万条结果. 在业内.Andr ...

  5. IOS --- 日期时间格式 更改

    1.怎样怎样将一个字符串如" 20110826134106"装化为随意的日期时间格式.以下列举两种类型:    NSString* string =@"201108261 ...

  6. Quartz CronTrigger运用

    CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明  是否必填  同意填写的值 同意的通配符  1  秒  是  0-59    , - ...

  7. hdu 5101 Select(Bestcoder Round #17)

    Select                                                    Time Limit: 4000/2000 MS (Java/Others)     ...

  8. Ubuntu通过使用PyCharm 执行调试 Odoo 8.0 可能的问题

    实现步骤,请移步http://shine-it.net/index.php?topic=16603.0 或 http://www.mindissoftware.com/2014/09/11/Run-O ...

  9. java反射机制性能优化

    import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.uti ...

  10. 每天进步一点点之SQL 获取表中某个时间字段离当前时间最近的几条

    实际中用到的SQL: select * from (select top 3 Id, case when startSignup>GETDATE() then '敬请期待' when (star ...