笔记:Struts2 文件上传和下载
为了上传文件必须将表单的method设置为POST,将 enctype 设置为 muiltipart/form-data,只有设置为这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。
- 上传解析器配置
- Struts2 没有提供自己的请求解析器,struts2 需要调用其他上传框架来解析二进制数据,struts2 默认使用 jakarta 的 Common-FileUpload 的文件上传框架,需要在 Web 应用的 lib 中增加 commons-io-2.2.jar 和 commons-fileupload-1.3.2.jar。
- 通过 struts2 的
常量配置 struts.multipart.parser 来设置文件上传解析器,默认值 jakarta - Struts.multipart.saveDir:上传文件的临时文件保存路径,默认值 javax.servlet.context.tempdir 配置的路径,该路径是Tomcat的安装路径下的 work\Catalina\localhost
- Struts.multipart.maxSize:整个表单请求内容的最大字节数,默认值 2097152
- 上传Action 解析
- 创建 java.io.File 类型的字段来接收上传的文件流;创建 xxxFileName 和 xxxContentType 来读取原始上传的文件名称和文件类型,其中 xxx 表示的是 java.io.File 类型的字段名称,比如示例是名为 upload 字段接收上传的文件流,因此需要有 uploadFileName 和 uploadContentType 来接收该文件流的原始文件名称和文件类型,示例代码如下:
public class UploadAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 283051583917637792L;
private File upload;
private String uploadFileName;
private String uploadContentType;
private String uploadPath;
public UploadAction() {
uploadPath = "upload";
}
@Override
public String execute() throws Exception {
if (upload == null) {
addActionError("没有选择上传文件");
return INPUT;
}
String filePath = ServletActionContext.getServletContext().getRealPath(uploadPath);
java.io.File dir = new java.io.File(filePath);
if (dir.exists() == false) {
if (dir.mkdirs() == false) {
addActionError("创建目录失败,目录路径=" + filePath);
return INPUT;
}
}
System.out.println("Upload FileName =" + uploadFileName);
System.out.println("Upload ContentType =" + uploadContentType);
FileOutputStream fileOutputStream = new FileOutputStream(filePath + File.pathSeparator + uploadFileName);
FileInputStream fileInputStream = new FileInputStream(upload);
byte[] buffer = new byte[4096];
int len = 0;
do {
len = fileInputStream.read(buffer, 0, buffer.length);
if (len > 0) {
fileOutputStream.write(buffer, 0, len);
}
} while (len > 0);
addActionMessage("上传完成,保存路径=" + filePath + File.pathSeparator + uploadFileName);
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;
}
}
- fileUpload 拦截器
- fileUpload 拦截器是struts2 提供的一个文件上传拦截器,用于拦截不允许的上传文件类型和文件大小,需要配置二个参数来处理:
- 参数 allowedTypes:该参数指定允许上传的文件类型(contentType),多个文件类型以英文逗号隔开
- 参数 maximumSize:该参数指定允许上传的文件大小,单位字节
- 如果上传文件类型或者文件大小错误,fileUpload 拦截器将会读取全局国际化资源文件来进行提示,读取的Key如下:
- struts.messages.error.file.too.large:该key表示上传的文件太大的提示
- {0} 表示 ActionName
- {1} 表示上传原始文件名称
- {2} 表示服务器临时文件名称
- {3} 上传文件的 ContentType
- struts.messages.error.content.type.not.allowed:该key表示上传文件类型错误的提示
- {0} 表示 ActionName
- {1} 表示上传原始文件名称
- {2} 表示服务器临时文件名称
- {3} 上传文件的字节大小
- {4} 允许的上传文件字节大小
- struts.messages.error.uploading:该key表示上传文件出现一个未知错误的提示
- 配置示例代码
<action name="upload" class="org.drsoft.actions.file.UploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/png</param>
<param name="maximumSize">102400</param>
</interceptor-ref>
<!--必须增加该项,如果不增加其他的拦截器会默认增加该拦截器-->
<interceptor-ref name="defaultStack"/>
<result name="success">/WEB-INF/content/file/upload.jsp</result>
<result name="input">/WEB-INF/content/file/upload.jsp</result>
</action>
- 下载文件 Action
- 下载文件的Action需要使用 stream 的结果类型,stream结果类型需要指定一个 inputName 参数,该参数指定了一个输入流,这个输入流是被下载文件的入口,详细参数如下:
- 参数 inputName:表示其Action类的返回 InputStream 的下载方法名称,示例,设置为 downloadFile 则会调用 Action类的 getDownloadFile 方法
- 参数 contentType:设置 httpResponse 的 mime-type ,设置 response 的 contentType 头,默认值 text/plain,通用值 application/octet-stream
- 参数 contentDisposition:设置响应报文头的 content disposition 值,用于指定浏览器的处理方式和下载文件名称,默认类型为 inline(内联),浏览器将会打开文件,可以设置 attachment(附件),浏览器将提示保存文件,参数示例:Inline;filename="downloadfile.zip",如果文件名称为中文,则需要使用 java.net.URLEncoder.encode(fileName, "UTF-8")
- 参数 contentLength:设置流的字节长度,用于浏览器的下载进度显示
- 参数 bufferSize:输入流和输出流的缓冲区字节大小
- 参数 allowCaching:如果设置为 false,会将 response 报文头的 Cache-Control设置为no-cache,默认值 true
- 参数 contentCharSet:设置内容编码,如果设置了值将会增加到x响应报文的 contentType 后面附加 ";charset=value"
笔记:Struts2 文件上传和下载的更多相关文章
- Struts2文件上传和下载(原理)
转自:http://zhou568xiao.iteye.com/blog/220732 1. 文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1) ...
- 十六、Struts2文件上传与下载
文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...
- 【SSH2(实用文章)】--Struts2文件上传和下载的例子
回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...
- 学习Struts--Chap07:Struts2文件上传和下载
1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...
- struts2 文件上传和下载,以及部分源代码解析
struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- Java精选笔记_文件上传与下载
文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...
- struts2学习(13)struts2文件上传和下载(1)
一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现 ...
- Struts2文件上传与下载
一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...
随机推荐
- linux pxe网络装机无人值守
项目分析远程装机的实现:配置DHCP+HTTP+TFTP提供通过vesamenu.c32模块实现图形PXE菜单为不同系统分别提供ks应答文件将第三方rpm包以yum源的方式提供:集中提供ntfs-3g ...
- 网络基础Cisco路由交换二
三层交换技术 作用: 使用三层交换技术实现VLAN间通信. 三层交换=二层交换+三层转发 基于CEF的快速转发 主要包含两个转发用的信息表: 转发信息库(FIB):FIB类似于路由表,包含路由表中转发 ...
- windows下常用工具
下面是平时自用的一些软件,感觉挺好用的,推荐给大家咯. everything 搜索神器 faststone capture 红绿小工具,工具小功能强 clcl 复制粘贴神器 f.lux linux和w ...
- 判断二叉树是否二叉排序树(BST)
算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: #include <stack> using namespace std; ty ...
- FFmpeg-音频和视频应用程序的瑞士军刀
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...
- 硬盘分区表格式GUID和MBR知识普及
我们的电脑硬盘分区格式一共有两种,一种是GUID(GPT),一种是MBR 如果你的电脑原装系统是win8或者以上的,那么他的硬盘分区表格式为GUID(GPT)格式的:如果是win7以下的,那么一般就是 ...
- NCBI下载sra数据(新)
今天要上NCBI下载sra数据发现没有下载的链接,网上查发现都是老的方法,NCBI页面已经变更,于是看了NCBI的help,并且记录下来新版的sra数据下载方法,要用NCBI的工具SRA Tool ...
- python 实现多层目录文件查找
本文针对多层目录下文件的查找. 利用 os模块的基本操作,并利用递归的思想实现了目录多层查找. 代码如下: import os #dir_name: 处理文件的起始目录 def count_file( ...
- 从零一起学Spring Boot之LayIM项目长成记(四) Spring Boot JPA 深入了解
前言 本篇内容主要是一些关于JPA的常用的一些用法等.内容也是很多是看其他博客学来的,顺道在本系列博客里抽出一篇作为总结.下面让我们来看看吧. 不过我更推荐大家读本篇:https://lufficc. ...
- docker进阶-搭建私有企业级镜像仓库Harbor
为什么要搭建私有镜像仓库 对于一个刚刚接触Docker的人来说,官方的Docker hub是用于管理公共镜像.既然官方提供了镜像仓库我们为什么还要去自己搭建私有仓库呢?虽然也可以托管私有镜像.我们 ...