JavaWeb响应下载(包含工具类)
纸上得来终觉浅,绝知此事要躬行!今天博主分享是关于javaweb的响应(response)下载
以下是我的Demo:
页面我就粘主要部分的代码
<a href = "${pageContext.request.contextPath }/user/courseTab">模板下载</a>
当然,现在的项目大家都使用框架,这里我使用的是(SSM),好了,粘代码
@Controller
@RequestMapping("/user")
public class UploadController {
@RequestMapping(value="/courseTab",method=RequestMethod.GET)
public void courseTab(HttpServletResponse response,HttpServletRequest request) throws IOException{
String path = request.getSession().getServletContext().getRealPath("/courseTab/课表上传模板.xls");
DownUtil.downMb(response, path, "课表模板"+DateFormat.formatSimple(new Date()));
}
}
这里我使用的DownUtil工具类是我自己写的,下来我粘到文章中
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; /**
* @Title: DownUtil.java
* @Description:文件下载工具类
* @author ChoviWu
*/
public class DownUtil { /**
*
* @Description:
* @param @param response
* @param @param url 文件在数据库的路径
* @param @param base 文件存放的基础路径
* @param @param folderPath 上传所在的文件夹
* @param @return
* @param @throws IOException
* @return int
* @throws
*/
public static void downFile(HttpServletResponse response, String url,
String base, String folderPath) throws IOException {
// 文件的名称
String fileName = url.split("/")[1];
System.out.println(fileName);
// 文件的后缀
String last = url.substring(url.lastIndexOf(".") + 1);
System.out.println(last);
// 文件路径
String downFilePath = base + folderPath + fileName; Long fileLength = new File(downFilePath).length();// 文件的长度
if (fileLength != 0) {
response.reset();
response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
try {
response.setHeader(
"Content-disposition",
"attachment; filename="
+ new String(fileName.getBytes("utf-8"),
"ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(downFilePath);
bis = new BufferedInputStream(fis);
// 输出流
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesread;
// 写文件
while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesread);
}
// 跳转的路径
fis.close();
bis.close();
bos.close(); } catch (FileNotFoundException e) {
System.out.println("File is Not Exsist!");
} } else {
// 抛异常 }
} /**
*
* @Description: 下载的模板
* @param @param response
* @param @param path 路径名
* @param @param name 模板名称
* @param @throws IOException
* @return void
* @throws
*/
@SuppressWarnings("unused")
public static void downMb(HttpServletResponse response, String path,
String name) throws IOException { Long fileLength = new File(path).length();// 文件的长度
System.out.println("文件的长度:" + fileLength);
if (fileLength != 0) {
response.reset();
response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
try {
response.setHeader(
"Content-disposition",
"attachment; filename="
+ new String(name.getBytes("utf-8"),
"ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(path);
bis = new BufferedInputStream(fis);
// 输出流
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesread;
// 写文件
while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesread);
}
fis.close(); } catch (FileNotFoundException e) {
System.out.println("File is Not Exsist!"); }
}
}
}
下来,我说一下,调用的downMb,我们都知道,在服务器上下载一个文件,
//设置响应头,控制浏览器下载该文件,形参调的是文件的长度
response.setHeader("Content-Length", String.valueOf(fileLength));
//设置响应类型,设置输出流类型
response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
这里我使用的是输出的Excel文件
接下来就是读文件,写文件了,相信学了java基础的都会接触IO吧,这里我就略过
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
这里使用的是缓冲流,因其使用的是浏览器打开文件的下载
下来就是写文件了,写文件也是一贯的套路,先把文件存到buff数据缓冲区,然后将buff的数据输出到浏览器供用户查看
byte[] buff = new byte[2048];
int bytesread;
// 写文件
while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesread);
}
当读写完文件之后,千万别忘了要关闭文件流(当然,关闭流的顺序也不能变)
fis.close();
bis.close();
bos.close();
JavaWeb响应下载(包含工具类)的更多相关文章
- HTTP 下载文件工具类
ResponseUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.File; im ...
- java下载文件工具类
java下载文件工具类 package com.skjd.util; import java.io.BufferedInputStream; import java.io.BufferedOutput ...
- android下载简单工具类
功能是实现下载文件,图片或MP3等,为了简单起见使用单线程,此代码为MarsAndroid教程的复制品,放在此处,留着参考. 首先是一个得到字节流随后保存到内存卡上的工具类: package com. ...
- Android开发之使用Handler封装下载图片工具类(源码分享)
假设每下载一张图片,就得重写一次Http协议,多线程的启动和handler的信息传递就显得太麻烦了,我们直接来封装一个工具类,便于我们以后在开发时随时能够调用. (1)在清单文件加入权限 <us ...
- ftp上传或下载文件工具类
FtpTransferUtil.java工具类,向ftp上传或下载文件: package utils; import java.io.File; import java.io.FileOutputSt ...
- JavaWeb基础之JdbcUtils工具类final
JdbcUtils工具类3.0最终版,添加了事务相关功能和释放链接.最终版本可以直接打成jar包,在后面的基本项目都会使用该工具类 1. JdbcUtils代码 /** * 最终版 * @author ...
- JavaWeb基础之JdbcUtils工具类1.0
2016年12月20日,第一次学习JDBC.看的是传智播客崔希凡老师的视频,东北口音很是风趣幽默,技术之牛让人膜拜.2017年9月21日,再次重温web知识,分享JdbcUtils工具类,用以接下来的 ...
- JavaWeb基础之JdbcUtils工具类2.0
使用c3p0连接池来改版JdbcUtils工具 1. 使用c3p0连接池获取连接,使代码更加简单 /** * 使用c3p0连接池做小工具 * JdbcUtils v2.0 * @author hui. ...
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...
随机推荐
- Storm: 集群安装和配置
前期准备:3台服务器: 192.168.8.94 192.168.8.95 192.168.8.96 去storm官网下载响应版本的软件包:http://storm.apache.org/downl ...
- Android 布局错乱 Android花屏
最近做项目,妈的,有个一个很难受的bug. 这个bug ,自己这里没有手机,没有办法复现,找到了手机之后.解决了. 我先给大家看下什么叫布局错乱,花屏: 来张正常的图片: 正常情况下是这样的.然后, ...
- Kafka写入流程和副本策略
Kafka写入流程: 1.producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader 2. prod ...
- 基于mysqldump备份集来恢复某个误操作的表(drop,truncate)
Preface How to rescue a dropped or truncated table online?Dropping or truncating is ddl oper ...
- 自动化测试学习之路--json、dom编程
1.json: json是JavaScript Object Notation,是一种数据传输格式. 以下程序都是在浏览器的Console下执行的. 创建一个javaScript的对象: var st ...
- selenium fluentwait java实例
本文转自:http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.support.ui.Flue ...
- (笔记) RealTimeRender[实时渲染] C2
@author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...
- CodeForces-1061D TV Shows
题目链接 https://vjudge.net/problem/CodeForces-1061D 题面 Description There are nn TV shows you want to wa ...
- HashMap 的深入学习
Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap.Hashtable.LinkedHashMap和TreeMap,类继承关系如下图 ...
- 201621123034 《Java程序设计》第11周学习总结
作业11-多线程 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread ...