struts2实现文件查看、下载

CreateTime--2017年9月7日10:25:33

Author:Marydon

struts2实现文件查看、下载

1.界面展示

<a style="color: #199ED8;" target="_blank" href="<c:url value="/telemedicine/reseCons/viewFile.do?fileName=201516529IO.jpg"/>">查看</a>
<a style="color: #199ED8;" target="_blank" href="<c:url value="/telemedicine/reseCons/downloadFile.do?fileName=201516529IO.jpg"/>">下载</a>

2.struts2配置

<!-- 文件预览 -->
<action name="viewFile" class="telemedicine.web.actions.reseCons.FileOperationAction"method="viewFile"><result name="success" type="stream"><!-- 设置返回的文件类型 --><param name="contentType">${contentType}</param> <!-- 设置获取流的方法 --><param name="inputName">inputStream</param> <!-- bufferSize 设置缓冲区字节大小默认是1024 --></result>
</action>
<!-- 文件下载 -->
<action name="downloadFile" class="telemedicine.web.actions.reseCons.FileOperationAction"method="downloadFile"><result name="success" type="stream"><!-- 设置返回的文件类型 --><param name="contentType">${contentType}</param> <!-- 设置获取文件流的方法 --><param name="inputName">inputStream</param> <!--添加参数,即就是下载的名称-->  <param name="contentDisposition">${contentDisposition}</param><!-- bufferSize 设置缓冲区字节大小默认是1024 --></result>
</action>

说明:struts2使用${}方式动态从action类中取值  

3.action(控制器)

  3.1 供struts2取值

// 文件输入流
private ByteArrayInputStream inputStream;
// 返回内容类型
private String contentType;
// 文件下载时,指定的名称
private String contentDisposition;public ByteArrayInputStream getInputStream() {return inputStream;
}public String getContentType() {return contentType;
}public String getContentDisposition() {return contentDisposition;
}

  3.2 详细代码

需要导入:

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;
import org.apache.struts2.ServletActionContext;

 

/*** 文件预览    * @return*/
public String viewFile() {try {// 1.获取客户端提交参数String fileName = WebUtils.getParameter("fileName");// 2.获取文件路径String filePath = "WEB-INF/uploadFiles/" + fileName;// 获取真实路径filePath = WebUtils.getRealPath(filePath);// 字节输出流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 3.将文件转换成文件流// 如果文件不存在,会抛出异常FileInputStream fis = new FileInputStream(filePath);// 4.将文件流读取到缓冲区(内存中),目的:提高读取效率InputStream input = new BufferedInputStream(fis);// 5.指定内存空间大小byte[] bt = new byte[1024];int len = 0;// 6.从内存中每次读取1024个字节,放到字节数组bt中,然后将bt中的字节写入到输出流中while ((len = input.read(bt)) > 0) {bos.write(bt, 0, len);}// 7.私有属性赋值// 7.1 字节输入流this.inputStream = new ByteArrayInputStream(bos.toByteArray());// 7.2获取该文件所对应的文件类型this.contentType = WebUtils.getServletContext().getMimeType(fileName);bos.close();input.close();} catch (Exception e) {this.addMessage(-1, e.getMessage());this.msg = "" + getExceptionMessage(e);this.code = -1;log.error(e.getMessage());e.printStackTrace();}return SUCCESS;
}/*** 文件下载* @return*/
public String downloadFile() {try {// 1.获取客户端提交参数String fileName = WebUtils.getParameter("fileName");// 2.获取文件路径String filePath = "WEB-INF/uploadFiles/" + fileName;// 获取真实路径filePath = WebUtils.getRealPath(filePath);// 字节输出流ByteArrayOutputStream bos = new ByteArrayOutputStream();// 3.将文件转换成文件流// 如果文件不存在,会抛出异常FileInputStream fis = new FileInputStream(filePath);// 4.将文件流读取到缓冲区(内存中),目的:提高读取效率InputStream input = new BufferedInputStream(fis);// 5.指定内存空间大小byte[] bt = new byte[1024];int len = 0;// 6.从内存中每次读取1024个字节,放到字节数组bt中,然后将bt中的字节写入到输出流中while ((len = input.read(bt)) > 0) {bos.write(bt, 0, len);}// 7.私有属性赋值// 7.1 字节输入流this.inputStream = new ByteArrayInputStream(bos.toByteArray());// 7.2获取该文件所对应的文件类型this.contentType = WebUtils.getServletContext().getMimeType(fileName);// 7.3指定下载该文件时的文件名称this.contentDisposition = "attachment;fileName=" + fileName;bos.close();input.close();} catch (Exception e) {this.addMessage(-1, e.getMessage());this.msg = "" + getExceptionMessage(e);this.code = -1;log.error(e.getMessage());e.printStackTrace();}return SUCCESS;
}

  说明:

    其中,通过WebUtils.java类调用的方法,请依次移步至文章:struts2获取前台提交的参数,struts2获取文件真实路径和struts2获取ServletContext对象

 

转载于:https://www.cnblogs.com/Marydon20170307/p/7488681.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css文本设置

常用的应用文本的css样式&#xff1a; color 设置文字的颜色&#xff0c;如&#xff1a; color:red; font-size 设置文字的大小&#xff0c;如&#xff1a;font-size:12px; font-family 设置文字的字体&#xff0c;如&#xff1a;font-family:微软雅黑; font-style 设置字体…

关键字static

原文出处&#xff1a;http://cmsblogs.com/ 『chenssy』 一、 static代表着什么 在Java中并不存在全局变量的概念&#xff0c;但是我们可以通过static来实现一个“伪全局”的概念&#xff0c;在Java中static表示“全局”或者“静态”的意思&#xff0c;用来修饰成员变量和成员方…

[IoC容器Unity]第三回:依赖注入

上节介绍了&#xff0c;Unity的Lifetime Managers生命周期&#xff0c;Unity具体实现依赖注入包含构造函数注入、属性注入、方法注入&#xff0c;所谓注入相当赋值&#xff0c;下面一个一个来介绍。 2.构造函数注入 Unity利用Resolve方法解析一个对象&#xff0c;都是调用注册类…

Apache CarbonData 1.5.0编译及安装

2019独角兽企业重金招聘Python工程师标准>>> 一、编译环境描述 OpenStack创建五个虚拟机&#xff0c;其中1个主节点&#xff08;hostname为bigdatamaster&#xff09;&#xff0c;4个从节点&#xff08;hostname分别为&#xff0c;bigdataslave1、bigdataslave2、bi…

JS控制网页全屏

在谷歌&#xff0c;IE等浏览器中&#xff0c;点击F11按键会进入网页全屏模式&#xff0c;如同看电影的剧场模式&#xff0c;这个在代码中可以通过JS来实现&#xff0c;简单说下在实现这个需求后的个人总结&#xff1a; 底层网页是已经加载完毕的&#xff0c;这时我们需要的全屏…

HDU 3966-Aragorn's Story 树链剖分+树状数组

题目链接 题意&#xff1a;有一棵树&#xff0c;每个节点有权值 有三种操作&#xff1a; I c1 c2 k 从节点c1到节点c2的路径上每个节点权值增加kD c1 c2 k 从节点c1到节点c2的路径上每个节点权值减少kQ i 查询节点i的权值是多少思路&#xff1a; 树链剖分处理出来的链放在数组中…

Filter介绍

Filter 可认为是 Servlet的一种 “ 加强版 ”&#xff0c;它主要用于对用户请求进行预处理&#xff0c; 也可以对HttpServletResponse 进行后处理&#xff0c;是个典型的处理链。Filter 也可对用户请求生成响应&#xff0c;这一 点与Servlet 相同&#xff0c; 但实际上很少会使…

LeetCode算法题-Jewels and Stones(Java实现)

这是悦乐书的第313次更新&#xff0c;第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题&#xff08;顺位题号是771&#xff09;。字符串J代表珠宝&#xff0c;S代表你拥有的石头。S中的每个字符都是你拥有的一种石头。计算S中有多少石头也是珠宝。J中…

python --- 二分查找算法

二分查找法&#xff1a;在我的理解中这个查找方法为什么会叫二分呢&#xff0c;我认为是将要查询的一个列表分成了两份&#xff0c;然后在利用某个值来进行比较&#xff0c;在一个不断循环的过程中来找出我们要找的某一个值。 废话不多说&#xff0c;先上代码&#xff1a; 1 de…

面试题

1. block 的作用由来&#xff0c;跟delegate的区别。 2. swift 的枚举。 3. iOS保存一个对象。转载于:https://www.cnblogs.com/studyNT/p/7499779.html

ssm框架下文件上传

springmvc实现文件上传的步骤&#xff1a; 1.页面上&#xff0c;通过input来准备file组件&#xff0c;该标签&#xff0c;必须给定name属性值 同时&#xff0c;要求form表单必须给定一个属性&#xff1a;enctype"multipart/form-data" 2.在pom.xml文件中&#xff0c;…

MySQL via EF6 的试用报告

MySQL via EF6 的试用报告1、如何通过 EF6 来连接 MySQL&#xff1f;2、如何通过 EF6 来实现 CRUD&#xff1f;2.1、Create 添加2.2、Retrieve 查询2.3、Update 修改2.4、Delete 删除3、如何更好的运用 EF6 来完成工作&#xff1f;3.1、传说中 EF 的三种模式3.2、EF6 执行原生 …

Java暑假作业

一.《大护法》观影有感 ... 从预告开始就期待着这部影片&#xff0c;在看过一遍后又忍不住二刷&#xff0c;影片观看至第二遍后&#xff0c;对于全片的脉络也更清晰了一点&#xff0c;虽然打着暴力美学的旗子&#xff0c;但《大护法》偏偏更文艺一些。文艺片是没有对错的&a…

使用EasyNetQ组件操作RabbitMQ消息队列服务

RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现&#xff0c;是实现消息队列应用的一个中间件&#xff0c;消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#xff0c;…

context-param和init-param的区别

http://www.cnblogs.com/hzj-/articles/1689836.html 转载于:https://www.cnblogs.com/wangc04/p/7501054.html

TensorFlow 1.12.2 发布,修复 GIF 构造安全漏洞

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; TensorFlow 1.12.2 发布了&#xff0c;此处本修复了一个潜在的安全漏洞&#xff1a; 精心设计的 GIF 图像可以在解码过程中产生空指针解引用更新说明&#xff1a; https://github.com/tensorflo…

【教程】如何在标签打印工具TFORMer Designer中自定义布局?

TEC-IT的在线标签生成器TFORMer Designer提供标签打印服务&#xff0c;并提供即用型行业标签模板作为Web服务。使用此软件&#xff0c;您可以在几秒钟内创建您自己的标签和表格或在工业和物流业中使用即时可用的模板。TFORMer Designer的最新更新现在允许使用自定义标签布局。 …

对象变为指定格式的数组

拿到的对象的格式&#xff08;一个对象里面都好多属性&#xff09; 想要转换成的数据格式&#xff08;一个数组里面有好多个对象&#xff0c;每个对象有一个id和name的属性&#xff09; 如何处理的 selectionChange(val) { // 列表选择var dynamicTags1 [];var arr[]for(var i…

bootstrapValidator remote 验证问题

1 加载jQuery和bootstrap.min.js 后引入bootstrapValidator.min.js字段验证之remote 远程验证(类似ajax验证)&#xff0c;返回值必须是 {"valid":true}{"valid":false} true表示 验证通过 false 表示验证不通过。 当添加remote 验证后&#xff0c;验证通过…

世界顶级的程序员们告诉你:这些书都是你应该读的

在很早之前就想整理一份来自经验丰富的顶级程序员推荐阅读的书籍清单&#xff0c;全栈工程师Dmitry Shvetsov整理了Bob叔以及Jeff Atwood and DHH等世界知名程序员曾经在博客中推荐过的书单&#xff0c;下面我们就一起来看看深受大神们青睐的书籍都是哪些?世界顶级的程序员们告…