Struts2文件上传下载

一、Struts2文件上传

提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容

fileUpload拦截器 默认在 defaultStack 栈中, 默认会执行的

在Action需要对上传文件内容进行接收

页面

<input type="file" name="upload" />

Action

 public class UploadAction extends ActionSupport {// 接收上传内容// <input type="file" name="upload" />private File upload; // 这里变量名 和 页面表单元素 name 属性一致private String uploadContentType;private String uploadFileName;} 

注意:

格式 : 上传表单项name属性 + ContentType 、 上传表单项name属性 + FileName

为三个对象 提供 setter 方法

通过FileUtils 提供 copyFile 进行文件复制,将上传文件 保存到服务器端

二、Struts2文件上传问题解决

1、配置 input 视图 ,作为上传出错后 跳转页面

在文件上传时,如果发生错误 ,fileUpload拦截器 会设置错误信息,workflow拦截器 跳转到 input 视图

2、struts.multipart.parser=jakarta 定义文件上传,采用 commons-fileupload 技术

同时支持 cos 、pell 上传技术 (如果使用其它上传技术,单独下载jar包 )

3、通过 struts.multipart.maxSize 常量设置文件上传总大小限制

struts.multipart.maxSize=2097152 默认上传文件总大小 2MB

超过文件总大小,跳转input 视图, 通过 <s:actionError /> 回显错误信息

4、在struts.xml 设置上传总大小

<constant name="struts.multipart.maxSize" value="20000000"></constant>

5、设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性

FileUpload 拦截器有 3 个属性可以设置.

* maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB

* allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔

* allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔

如果针对fileUpload 进行参数设置,当出错时,在页面通过 <s:fieldError /> 回显错误信息

struts-messages.properties 文件里预定义 上传错误信息,通过覆盖对应key 显示中文信息

struts.messages.error.uploading=Error uploading: {0}

struts.messages.error.file.too.large=The file is to large to be uploaded: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

修改为

struts.messages.error.uploading=上传错误: {0}

struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}

上传案例:

jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'index.jsp' starting page</title></head><body><s:fielderror/><s:actionerror/><form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data"><input type="file" name="upload"><br><input type="file" name="upload"><br><input type="file" name="upload"><br><input type="submit" value="上传"></form></body>
</html>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.custom.i18n.resources" value="message"></constant><constant name="struts.multipart.maxSize" value="20971520"></constant><package name="default" namespace="/" extends="struts-default"><action name="upload" class="com.sihai.action.UploadAction"><result name="input">/upload.jsp</result><interceptor-ref name="defaultStack"><param name="maximumSize">2097152</param><param name="fileUpload.allowedExtensions">txt,mp3,doc</param></interceptor-ref></action></package>
</struts>

action:

package com.sihai.action;import java.io.File;
import java.util.List;import org.apache.commons.io.FileUtils;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport {// 在action类中需要声明三个属性private List<File> upload;private List<String> uploadContentType;private List<String> uploadFileName;public List<File> getUpload() {return upload;}public void setUpload(List<File> upload) {this.upload = upload;}public List<String> getUploadContentType() {return uploadContentType;}public void setUploadContentType(List<String> uploadContentType) {this.uploadContentType = uploadContentType;}public List<String> getUploadFileName() {return uploadFileName;}public void setUploadFileName(List<String> uploadFileName) {this.uploadFileName = uploadFileName;}@Overridepublic String execute() throws Exception {for (int i = 0; i < upload.size(); i++) {System.out.println("上传文件的类型:" + uploadContentType.get(i));System.out.println("上传文件的名称:" + uploadFileName.get(i));// 完成文件上传.FileUtils.copyFile(upload.get(i), new File("d:/upload", uploadFileName.get(i)));}return null;}}

三、多文件上传

第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。

第二步:把form表的enctype设置为:“multipart/form-data“,如下:

<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post"><input  type="file" name="uploadImages"><input  type="file" name="uploadImages"></form>

第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:

public class uploadAction{private File[] uploadImages;//得到上传的文件private String[] uploadImagesContentType;//得到文件的类型private String[] uploadImagesFileName;//得到文件的名称//这里略省了属性的getter/setter方法public String saveFiles() throws Exception{ServletContext sc = ServletActionContext.getServletContext();String realpath = sc.getRealPath("/uploadfile");try {if(uploadImages!=null&&uploadImages.length>0){for(int i=0;i<uploadImages.length;i++){File destFile = new File(realpath,uploadImageFileNames[i]);FileUtils.copyFile(uploadImages[i], destFile);}}} catch (IOException e) {e.printStackTrace();}return "success";}}

四、Struts2文件下载

1) struts2 完成文件下载,通过 结果集类型 (Result Type) stream 来完成的

struts-default.xml 定义 <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>


2) 使用Stream结果集 完成文件下载

文件下载原理: 服务器读取下载文件内容,通过Response响应流写回, 设置 ContentType、 ContentDisposition 头信息

public class StreamResult extends StrutsResultSupport {protected String contentType = "text/plain"; // contentType头信息  (下载文件对应 MIME协议规定类型 )protected String contentDisposition = "inline"; // ContentDisposition头信息 (下载文件打开方式 inline浏览器内部打开, attachment 以附件形式打开)protected String inputName = "inputStream";  // 需要Action中 提供 getInputStream 方法 返回 InputStream 提供下载文件 内容} 

3)Action 提供 InputStream 返回值 getInputStream 方法 ------- 指定下载文件流

配置 stream 结果集 参数 <param name="contentType">${contentType}</param> ---- 在Action 中提供 getContentType

ServletActionContext.getServletContext().getMimeType(filename);

配置 stream 结果集 参数 <param name="contentDisposition">attachment;filename=${filename}</param> ---- 在Action 提供 getFilename

下载附件名乱码问题

 public String encodeDownloadFilename(String filename, String agent)throws IOException {if (agent.contains("Firefox")) { // 火狐浏览器filename = "=?UTF-8?B?"+ new BASE64Encoder().encode(filename.getBytes("utf-8"))+ "?=";} else { // IE及其他浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}

文件下载案例

jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>My JSP 'index.jsp' starting page</title></head><body><a href="${pageContext.request.contextPath}/download?filename=a.txt">a.txt</a><br><a href="${pageContext.request.contextPath}/download?filename=捕获.png">捕获.png</a><br>
</body>
</html>

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.custom.i18n.resources" value="message"></constant><constant name="struts.multipart.maxSize" value="20971520"></constant><package name="default" namespace="/" extends="struts-default"><action name="download" class="com.sihai.action.DownloadAction"><result type="stream"><param name="contentType">${contentType}</param> <!-- 调用当前action中的getContentType()方法 --><param name="contentDisposition">attachment;filename=${downloadFileName}</param><param name="inputStream">${inputStream}</param><!-- 调用当前action中的getInputStream()方法 --></result></action></package>
</struts>
package com.sihai.action;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;import org.apache.struts2.ServletActionContext;import com.sihai.utils.DownloadUtils;import com.opensymphony.xwork2.ActionSupport;public class DownloadAction extends ActionSupport {private String filename; // 要下载文件的名称public String getFilename() {return filename;}public void setFilename(String filename) {this.filename = filename;}// 设置下载文件mimeType类型public String getContentType() {String mimeType = ServletActionContext.getServletContext().getMimeType(filename);return mimeType;}// 获取下载文件名称public String getDownloadFileName() throws UnsupportedEncodingException {return DownloadUtils.getDownloadFileName(ServletActionContext.getRequest().getHeader("user-agent"), filename);}public InputStream getInputStream() throws FileNotFoundException,UnsupportedEncodingException {filename = new String(filename.getBytes("iso8859-1"), "utf-8"); // 解决中文名称乱码.FileInputStream fis = new FileInputStream("d:/upload/" + filename);return fis;}@Overridepublic String execute() throws Exception {System.out.println("进行下载....");return SUCCESS;}}

struts2教程(8)--文件上传下载相关推荐

  1. struts2教程--实现文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

  2. spring boot基础教程之文件上传下载

    一文件上传 文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个文件上传表单页面; (4)编写controller; ( ...

  3. Flask 的完全使用教程(文件上传下载,cookie,session,template使用)

    Flash是python下的一个轻量级web服务框架,通过Flash可以快速的搭建api服务器和各位网站,在深度学习中Flash用的最多的就是模型的部署.配合上一些c++ dll库的调用,比如这个库( ...

  4. struts上传word和excel文件到oracle,Struts文件上传,下载,重传,预览

    [Struts2]☆★之文件上传,下载,重传,预览 今日群里一兄弟问我能否给一份struts文件上传下载的例子,因为自己项目比较紧所以想在网上找 些源码给他,但是纵观全网,写的都不是太全,这让新手使用 ...

  5. struts2完美实现文件上传和下载

    ## struts2完美实现文件上传和下载 ## 第一步:在webx项目lib目录下加入struts.jar包 asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3 ...

  6. 文件上传/下载接口(超简单的教程来了)

    前言 文件上传/下载接口与普通接口类似,但是有细微的区别. 如果需要发送文件到服务器,例如:上传文档.图片.视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: multi ...

  7. centos nfs java_CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  8. 文件上传下载之文件上传

    13.1  文件上传 13.1.1  概述 在开发基于Web的应用的时候,经常会碰到需要实现文件上传.下载的功能,比如编辑某个商品,需要给它上传一个图片等等. 不使用Struts2的话,可以有很多种方 ...

  9. SpringBoot文件上传下载以及优化过程 -- 个人笔记

    Java IO/NIO/AIO的知识体系图 博主最开始是用IO实现文件上传下载功能,但发现效率慢,于是使用了NIO 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的,弥补了原来的 I/O ...

最新文章

  1. C#对Excel的样式操作
  2. 鲍尔默说:你的东西再大 微软也装得下
  3. CentOS 8 成为绝版!到底发生了什么?
  4. 深入浅出根据函数调用过程谈栈回溯原理
  5. oracle opaque_transform,oracle databse link
  6. 【重磅】App内可直接打开微信小程序,新增内容安全接口等
  7. java查找目录文件函数_java 实现 文件操作工具集。包括文件、目录树的拷贝、删除、移动、查找等工具函数...
  8. 坚持开源、能力内化,中移苏研荣获“中国开源领军企业”大奖!
  9. 贴片电容封装及尺寸示意图
  10. TCP/UDP Socket调试工具(SocketTool) v4
  11. 为什么要玩FLTK(Fast Light Tool Kit)
  12. odoo13 订单模板设置_Odoo 13开发者文档:视图
  13. echarts实现颜色渐变
  14. TestCenter测试管理工具功能详解二(G)
  15. tomcat 报错 Too many open files
  16. wetool个人版_淘客干货:用了3年的wetool也没能幸免
  17. 唐山盐碱滩成渤海明珠 国稻种芯·中国水稻节:河北曹妃甸大米
  18. 解决win10下WIFI无法连接到网络
  19. 在linux中关闭防火墙
  20. 从基础特质初判一个产品经理潜质

热门文章

  1. MQTT数据处理之从tcp连接获取数据过程
  2. ST17H26使用tea注意事项
  3. 十九、二叉树的最近的公共祖先
  4. 画直线_在鸡的面前画直线,鸡为什么会晕呢,西瓜视频带你揭秘
  5. 波卡链Substrate (6)Babe协议三“slot leader”
  6. 出块过程 (1)close发送消息
  7. 跨链(2)跨链技术“侧链(Sidechains)”
  8. Bitcoin 中的挖矿算法(3) 挖矿算法代码说明
  9. C++ Primer 5th笔记(8)chapter8 类:IO库-文件流
  10. java大乘期(33)----java进阶(springboot基础(1)----springboot基本概念)