纸上得来终觉浅,绝知此事要躬行!今天博主分享是关于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响应下载(包含工具类)的更多相关文章

  1. HTTP 下载文件工具类

    ResponseUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.File; im ...

  2. java下载文件工具类

    java下载文件工具类 package com.skjd.util; import java.io.BufferedInputStream; import java.io.BufferedOutput ...

  3. android下载简单工具类

    功能是实现下载文件,图片或MP3等,为了简单起见使用单线程,此代码为MarsAndroid教程的复制品,放在此处,留着参考. 首先是一个得到字节流随后保存到内存卡上的工具类: package com. ...

  4. Android开发之使用Handler封装下载图片工具类(源码分享)

    假设每下载一张图片,就得重写一次Http协议,多线程的启动和handler的信息传递就显得太麻烦了,我们直接来封装一个工具类,便于我们以后在开发时随时能够调用. (1)在清单文件加入权限 <us ...

  5. ftp上传或下载文件工具类

    FtpTransferUtil.java工具类,向ftp上传或下载文件: package utils; import java.io.File; import java.io.FileOutputSt ...

  6. JavaWeb基础之JdbcUtils工具类final

    JdbcUtils工具类3.0最终版,添加了事务相关功能和释放链接.最终版本可以直接打成jar包,在后面的基本项目都会使用该工具类 1. JdbcUtils代码 /** * 最终版 * @author ...

  7. JavaWeb基础之JdbcUtils工具类1.0

    2016年12月20日,第一次学习JDBC.看的是传智播客崔希凡老师的视频,东北口音很是风趣幽默,技术之牛让人膜拜.2017年9月21日,再次重温web知识,分享JdbcUtils工具类,用以接下来的 ...

  8. JavaWeb基础之JdbcUtils工具类2.0

    使用c3p0连接池来改版JdbcUtils工具 1. 使用c3p0连接池获取连接,使代码更加简单 /** * 使用c3p0连接池做小工具 * JdbcUtils v2.0 * @author hui. ...

  9. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

    前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...

随机推荐

  1. Hadoop常用高级特性

    HDFS HA HDFS HA(High Availability)高可用性 相同版本拷贝工具,分布式集群拷贝工具,使用MapReduce实现 DistCp Version2 Guide HFTP协议 ...

  2. 15,Flask-Script

    Flask-Script 从字面意思上来看就是 Flask 的脚本 是的,熟悉Django的同学是否还记得Django的启动命令呢? python manager.py runserver 大概是这样 ...

  3. 7 Vue.js实现loading1

    1 2 3 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter ...

  4. 接口&抽象类&继承&父类和子类

    1.接口是什么? 接口可以理解为一个特殊的抽象类,是由全局常量和公共抽象方法组成的. 所以,如果,一个抽象类的方法都是抽象的,那么就可以通过接口的形式来表示. class 用于定义类 interfac ...

  5. Google Chrome 自定义协议(PROTOCOL)问题的处理

    最近在使用谷歌浏览器的时候遇到了自定义协议(PROTOCOL)的问题,比较折腾,特此记录,希望我浪费生命换来的结果能够帮助读到此文的朋友少浪费一点宝贵的时间! 由于某些原因,电脑里一直没有安装阿里旺旺 ...

  6. 最近做group assignment需要些加密的知識

    需求:A給B單向發的數據需要被加密,A和B都可以看到原文.加密后,就算傳輸的過程被竊取,也無法得知數據原文.A可以是任何客戶端. 解決:常用的MD5,sha1等常用的加密算法為單向不可逆,顯然不符合需 ...

  7. Numpy 与 DataFrame对比与应用

    (一)对比Numpty 与 DataFrame默认索引取值不同点 Numpy索引取值 #Numpy索引取值 data=np.empty((2,4),dtype=int) print(data) ''' ...

  8. vmware设置静态ip(复制)

    一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子网掩码和网关,后面修改静态IP会用到. ...

  9. fisheye在centos上的安装

    目录 描述 部署过程 安装及配置 破解 添加存贮库 在jira上配置 描述 Fisheye 一个源代码库深度查看软件,它可以挖掘源代码库中的有用信息,呈现在Web浏览器界面上. Crucible是一个 ...

  10. 设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)

    原文:设置EntityFramework中decimal类型数据精度 EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度. e.g. .19990将会 ...