1.  前言

这个章节是Struts2框架应用最广泛的三个版块(上传下载、国际化、校验输入)之一,所以这一版块的学习还蛮重要的。

2.  具体内容

2.1Struts2文件上传

2.1.1单文件上传

本小节通过一个示例讲解Struts2如何实现单文件的上传。

(1) 先写一个选择上传单文件页面(select.jsp)

User: mairr

Date: 17-12-7

Time: 下午9:04

To change this template use File | Settings | File Templates.

--%>

upload_test

输入帐号:
选择头像:

如下所示的一个上传选择界面框:

(2) 当文件上传页面提交请求时,请求发送到upload.action,这是一个Struts2的Action,该Action处理上传请求,具体的UploadAction类代码如下:

packageaction;importcom.opensymphony.xwork2.ActionSupport;importorg.apache.commons.io.FileUtils;importorg.apache.struts2.ServletActionContext;importjava.io.File;importjava.io.IOException;public class UploadAction extendsActionSupport {

private String uid;          //封装帐号(uid)请求参数属性

private File headImage;         //封装上传文件域属性

private String headImageContentType; //封装上传文件类型的属性

privateString headImageFileName;     //封装上传文件属性publicString getUid() {returnuid;

}public voidsetUid(String uid) {this.uid =uid;

}publicFile getHeadImage() {returnheadImage;

}public voidsetHeadImage(File headImage) {this.headImage =headImage;

}publicString getHeadImageContentType() {returnheadImageContentType;

}public voidsetHeadImageContentType(String headImageContentType) {this.headImageContentType =headImageContentType;

}publicString getHeadImageFileName() {returnheadImageFileName;

}public voidsetHeadImageFileName(String headImageFileName) {this.headImageFileName =headImageFileName;

}public String execute() throwsIOException {//上传文件的保存位置在“/image”,该位置在tomcat服务器的“webapps”之中

String realpath= ServletActionContext.getServletContext().getRealPath("/image");//声明文件目录image,如果文件名不存在就建一个呗~

File file = newFile(realpath);if(!file.exists()){

file.mkdirs();

}//实现文件上传,也就是做了一个方法调用~

FileUtils.copyFile(headImage,newFile(file,headImageFileName));returnSUCCESS;

}

}

需要注意的是,上面的Action除了包含两个表单域的name属性外,还包含headImageContentType和headImageFileName两个属性,这两个属性分别能用于封装上传文件的文件类型、上传文件的文件名。可以这样认为:如果表单中包含一个name属性为xxx的文件域,则对应的Action需要使用3个属性来封装文件域信息:

类型为java.io.File的xxx属性来封装文件域的信息;

类型为String的xxxFileName属性封装了该文件域对应的文本内容;

类型为String的xxxContentType属性封装了该文件域对应的文件类型。

所以,在Action的execute方法中,可以直接通过这3个属性获取上传文件的文件名、文件类型和文件内容。

(3) 接下来进行UploadAction的配置(struts.xml文件配置),具体代码如下:

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

"http://struts.apache.org/dtds/struts-2.5.dtd">

/uploadSuccess.jsp

(4) 最后写一个上传成功页面(uploadSuccess.jsp)

上传初始页

用户帐号:

您的头像:" alt="图像无法显示"/>

上传过程图:

(a)选择图片

(b)确认选择

(c)提交之后,显示上传成功

2.1.2 拦截器实现文件的过滤

Struts2提供了一个名为fileUpload拦截器,通过配置该拦截器可以轻松地实现文件过滤。为了让fileUpload拦截器起作用,只需要在处理文件上传的Action中配置该拦截器引用即可。

配置fileUpload拦截器时可以指定如下两个参数:

allowTypes:该参数指定允许上传文件的类型,多个文件类型之间以英文逗号隔开;

maximumSize:该参数指定允许上传文件的大小,单位是字节。

当文件过滤失败后,系统自动转入input逻辑视图,因此必须为Action配置名为input的逻辑视图。

(1) 通过拦截器来实现文件过滤的struts.xml配置文件如下:

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

"http://struts.apache.org/dtds/struts-2.5.dtd">

image/x-png,image/bmp,image/gif,image/jpeg,image/jpg

65536

/uploadSuccess.jsp

/select.jsp

格式不对和容量大于64kb会上传失败,直接返回重新选择的界面。如果上传失败,系统需要回应上传失败信息。因此,需要在文件上传页selectFile.jsp页面中加上“”------->(我直接加到了selectFile.jsp代码中,你可以回看上面)

(a) 文件格式不对

------(提交之后)------->

(b) 文件大小超过了限额

-------(提交之后)----->

2.1.3  文件上传的常量配置

上传文件时,系统默认使用web服务器的工作路径作为临时路径。为了避免文件上传时候使用Web服务器的工作路径作为临时路径,则应该设置struts.multipart.saveDir常量。该常量指定上传文件的临时保存路径。该常量配置示例如下:

此外,还有一个文件上传的常量struts.multipart.maxSize。该常量指定struts.mutipart.maxSize。该常量指定在struts2文件上传中整个请求内容所允许的最大字节数,默认为2097152(即2MB)。该常量配置示例如下:

2.1.4  Struts2多文件上传

在Struts2应用中,如果一个页面有多个文件域需要实现上传,则可以为每个文件域提供三个属性,分别封装该文件域对应的文件名、文件类型和文件内容。多文件上传与单文件上传没有什么区别,仅仅是利用数组同时上传多个文件的方式。

在处理多文件上传时,要注意改变的是,在Action类中,需要使用三个数组分别封装文件名、文件类型和文件内容。

//实现单文件上传代码如下:

FileUtils.copyFile(headImage,newFile(file,headImageFileName));//实现多文件下载代码如下:

for(int i = 0; i < headImage.length(); i++){

File uploadImage=headImage[i];

FileUtils.copyFile(uploadImage,newFile(file,headImageFileName[i]));

}

2.2  Struts2文件下载

利用Struts2来处理文件的下载的问题时,能够解决下载文件的文件名为中英文等等都不出现乱码。此外,还能够在用户下载之前进行检查,判断用户是否有足够的权限来下载该文件等。下面用一个示例来讲解文件的下载:

(1) 先写一个下载页面:(index.jsp)

User: mairr

Date: 17-12-9

Time: 下午2:20

To change this template use File | Settings | File Templates.

--%>

test_download中
请下载英文课件:英

(2) 在Struts2框架文件下载Action类中,需要提供一个返回InputStream流方法,该输入流代表了被下载文件的入口。该Action类代码如下所示:(DownLoadAction.java)

packageaction;importcom.opensymphony.xwork2.ActionSupport;importorg.apache.struts2.ServletActionContext;importutil.MyUtil;importjava.io.InputStream;importjava.io.UnsupportedEncodingException;public class DownLoadAction extendsActionSupport{private String downPath; //下载时的文件名

private String contentType; //保存文件类型

private String filename; //保存时的文件名

publicString getContentType() {returncontentType;

}public voidsetContentType(String contentType) {this.contentType =contentType;

}publicString getFilename() {returnfilename;

}public voidsetFilename(String filename) {this.filename =filename;

}publicString getDownPath() {returndownPath;

}public voidsetDownPath(String downPath) {try{//解决下载时候的中文文件乱码问题

downPath = new String(downPath.getBytes("ISO-8859-1"),"UTF-8");

}catch(UnsupportedEncodingException e){

e.printStackTrace();

}this.downPath =downPath;

}/**下载用的Action返回一个InputString实例,该方法对应Action配置

*里面的result的inputName参数,值为inputString

**/

publicInputStream getInputString(){returnServletActionContext.getServletContext().getResourceAsStream(downPath);

}publicString execute(){//下载保存时的文件名和被下载的文件名一样

filename =downPath;//下载的文件路径,请在webapps目录下创建images

downPath = "images/" +downPath;//保存文件的类型

contentType= "application/x-msdownload";/**对下载的文件名按照UTF-8进行编码,解决下载窗口中的中文乱码问题

* 其中,MyUtil是自己定义的一个类*/filename=MyUtil.toUTF8String(filename);returnSUCCESS;

}

}

(3) 在上述的Action类中定义了一个工具类MyUtil,该类中有一个静态方法toUTF8String实现对下载的文件名按照UTF-8进行编码,解决下载窗口中中文乱码的问题:(MyUtil.java)

packageutil;importjava.io.UnsupportedEncodingException;public classMyUtil {//对下载文件按照 UTF-8 进行编码

public staticString toUTF8String(String str){

StringBuffer sb= newStringBuffer();int len =str.length();for (int i = 0; i < len; i++)

{//取出字符中的每个字符

char c =str.charAt(i);//Unicode码值在0~255之间,不做处理

if(c>=0 && c <= 255){

sb.append(c);

}else{//转换 UTF-8 编码

byteb[];try{

b= Character.toString(c).getBytes("UTF-8");

}catch(UnsupportedEncodingException e){

e.printStackTrace();

b= null;

}//转换为%HH的字符串形式

for(int j = 0;j < b.length ; j++){int k =b[j];if(k < 0){

k&= 255;

}

sb.append("%" +Integer.toHexString(k).toUpperCase());

}

}

}returnsb.toString();

}

}

(4) 最后,完成Action的配置,关键是要配置一个类型为stream的结果,配置时需要指定如下四个属性:

contentType:  指定被下载文件的文件类型;

inputName:  指定被下载文件的入口输入流;

contentDisposition:  指定下载的文件名;

bufferSize:  指定下载文件时的缓冲大小。

具体代码如下:(struts.xml)

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

"http://struts.apache.org/dtds/struts-2.5.dtd">

${contentType}

inputStream

attachment;filename=${filename}

4096

(5)  最后的下载窗口:

java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载相关推荐

  1. 记录vue-cli2打包项目静态文件夹static到七牛云存储上,并使用七牛云融合cdn的过程

    前言:vue-cli2打包项目静态文件夹static到七牛云存储上,并使用七牛云融合cdn 1.前期准备 npm install --save jsonfile jsonfile扩展说明文档 npm ...

  2. java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...

  3. java 拦截html请求参数值_javaweb项目,html文件放在了WebRoot下,如何拦截访问html的请求呀?...

    可以在web.xml启用Filter,如:<?xml version="1.0" encoding="UTF-8"?> xmlns:xsi=&quo ...

  4. java宿舍管理系统登录界面_JavaWeb宿舍管理系统(附 演示、源码下载地址)

    > 宿舍管理是高校管理的重要组成部分,一套优秀的管理系统不仅可以降低宿舍管理的难度,也能在一定程度上减少学校管理费用的支出,能是建设现代化高校管理体系的重要标志. 本篇文章将带你从运行环境搭建. ...

  5. Java分布式二手房项目尚好房第五课 图片上传及前端房源展示

    尚好房:图片上传 一.图片存储方案 1.介绍 在实际开发中,我们会有很多处理不同功能的服务器.例如: 应用服务器:负责部署我们的应用 数据库服务器:运行我们的数据库 文件服务器:负责存储用户上传文件的 ...

  6. java action上传文件_java实现文件上传

    在Java中,要实现文件上传,可以有两种方式: 1.通过Servlet类上传 2.通过Struts框架实现上传 这两种方式的根本还是通过Servlet进行IO流的操作. 一.通过Servlet类上传 ...

  7. java struts2上传文件_java Struts2框架下实现文件上传功能

    本文实例为大家分享了struts2框架实现文件上传的方法,供大家参考,具体内容如下 struts2的配置过程 (1)在项目中加入jar包 (2)web.xml中filter(过滤器)的配置 xmlns ...

  8. java 文件上传ssm_ssm框架下实现文件上传

    1.由于ssm框架是使用Maven进行管理的,文件上传所需要的jar包利用pom.xml进行添加,如下所示: 1.3.1 2.4 commons-io commons-io ${commons-io. ...

  9. java action 上传文件_Struts2实现单文件或多文件上传功能

    一.简述 Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置, 二.指定用户上传文件的大小,有两种方式 1)默认是在default.proper ...

最新文章

  1. Spring3.1+SpringMVC3.1+JPA2.0
  2. PostgreSQL在何处处理 sql查询之二十一
  3. mac os 录屏快捷键_Mac跨平台自动同步记事本
  4. 各种平台的表达芯片跟mRNA-seq数据比较
  5. linux下使用dd命令制作ubuntu的u盘启动,Ubuntu使用dd命令制作U盘系统启动盘
  6. 嵌入式C/C++开发过程中日志输出的一点思考
  7. Java必备——MySql 三大知识点
  8. cdr三角形转化为圆角_CDR金属质感小图标图文解析
  9. mysql 查询一张表在另一张表中不存在的数据
  10. 传统城域网架构遇瓶颈 引入NFV成有效解法
  11. python re span_Python的re模块与正则表达式小结
  12. DedeCms网站防挂马注意点
  13. C语言栈括号匹配算法
  14. YOLOv7官方开源 | Alexey Bochkovskiy站台,精度速度超越所有YOLO,还得是AB
  15. mysql 添加 删除索引(index) alter table 修改字段 修改列
  16. transformer中的位置嵌入
  17. windows 清理 cbs.log 文件
  18. CryEngine的Modular Behavior Tree简介
  19. 曲速未来:区块链用于房地产是否会起作用
  20. 定制office2007静默安装

热门文章

  1. python的scrapy爬虫模块间进行传参_Python | Scrapy 爬虫过程问题解决(持续更新...)...
  2. 标题隐藏_头条官方课程没看就想起好标题?请收藏好这篇文章,不要再犯错了...
  3. java调用sql返回list_Hibernate执行原生SQL返回ListMap类型结果集
  4. Matlab保存为unv,matlab之图像处理(2)
  5. gt,gte,lt,lte缩写的含义
  6. 空列表不等同于None
  7. 小波变换如何去噪的思想
  8. 计算机图形学的核心领域,计算机图形学基础知识重点整理.pdf
  9. Java传xml时字符串乱码_php调用java传递xml字符串乱码怎么办
  10. 软件项目管理0831:不要自我评价过高