java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载
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_(七)-----文件的上传和下载相关推荐
- 记录vue-cli2打包项目静态文件夹static到七牛云存储上,并使用七牛云融合cdn的过程
前言:vue-cli2打包项目静态文件夹static到七牛云存储上,并使用七牛云融合cdn 1.前期准备 npm install --save jsonfile jsonfile扩展说明文档 npm ...
- java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)
相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...
- java 拦截html请求参数值_javaweb项目,html文件放在了WebRoot下,如何拦截访问html的请求呀?...
可以在web.xml启用Filter,如:<?xml version="1.0" encoding="UTF-8"?> xmlns:xsi=&quo ...
- java宿舍管理系统登录界面_JavaWeb宿舍管理系统(附 演示、源码下载地址)
> 宿舍管理是高校管理的重要组成部分,一套优秀的管理系统不仅可以降低宿舍管理的难度,也能在一定程度上减少学校管理费用的支出,能是建设现代化高校管理体系的重要标志. 本篇文章将带你从运行环境搭建. ...
- Java分布式二手房项目尚好房第五课 图片上传及前端房源展示
尚好房:图片上传 一.图片存储方案 1.介绍 在实际开发中,我们会有很多处理不同功能的服务器.例如: 应用服务器:负责部署我们的应用 数据库服务器:运行我们的数据库 文件服务器:负责存储用户上传文件的 ...
- java action上传文件_java实现文件上传
在Java中,要实现文件上传,可以有两种方式: 1.通过Servlet类上传 2.通过Struts框架实现上传 这两种方式的根本还是通过Servlet进行IO流的操作. 一.通过Servlet类上传 ...
- java struts2上传文件_java Struts2框架下实现文件上传功能
本文实例为大家分享了struts2框架实现文件上传的方法,供大家参考,具体内容如下 struts2的配置过程 (1)在项目中加入jar包 (2)web.xml中filter(过滤器)的配置 xmlns ...
- java 文件上传ssm_ssm框架下实现文件上传
1.由于ssm框架是使用Maven进行管理的,文件上传所需要的jar包利用pom.xml进行添加,如下所示: 1.3.1 2.4 commons-io commons-io ${commons-io. ...
- java action 上传文件_Struts2实现单文件或多文件上传功能
一.简述 Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置, 二.指定用户上传文件的大小,有两种方式 1)默认是在default.proper ...
最新文章
- Spring3.1+SpringMVC3.1+JPA2.0
- PostgreSQL在何处处理 sql查询之二十一
- mac os 录屏快捷键_Mac跨平台自动同步记事本
- 各种平台的表达芯片跟mRNA-seq数据比较
- linux下使用dd命令制作ubuntu的u盘启动,Ubuntu使用dd命令制作U盘系统启动盘
- 嵌入式C/C++开发过程中日志输出的一点思考
- Java必备——MySql 三大知识点
- cdr三角形转化为圆角_CDR金属质感小图标图文解析
- mysql 查询一张表在另一张表中不存在的数据
- 传统城域网架构遇瓶颈 引入NFV成有效解法
- python re span_Python的re模块与正则表达式小结
- DedeCms网站防挂马注意点
- C语言栈括号匹配算法
- YOLOv7官方开源 | Alexey Bochkovskiy站台,精度速度超越所有YOLO,还得是AB
- mysql 添加 删除索引(index) alter table 修改字段 修改列
- transformer中的位置嵌入
- windows 清理 cbs.log 文件
- CryEngine的Modular Behavior Tree简介
- 曲速未来:区块链用于房地产是否会起作用
- 定制office2007静默安装
热门文章
- python的scrapy爬虫模块间进行传参_Python | Scrapy 爬虫过程问题解决(持续更新...)...
- 标题隐藏_头条官方课程没看就想起好标题?请收藏好这篇文章,不要再犯错了...
- java调用sql返回list_Hibernate执行原生SQL返回ListMap类型结果集
- Matlab保存为unv,matlab之图像处理(2)
- gt,gte,lt,lte缩写的含义
- 空列表不等同于None
- 小波变换如何去噪的思想
- 计算机图形学的核心领域,计算机图形学基础知识重点整理.pdf
- Java传xml时字符串乱码_php调用java传递xml字符串乱码怎么办
- 软件项目管理0831:不要自我评价过高