纸上得来终觉浅,绝知此事要躬行!今天博主分享是关于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();

最新文章

  1. MVC5 网站开发之七 用户功能 2 用户添加和浏览
  2. OC中的那些String
  3. 调用WCF Client客户端测试
  4. iOS----------使用 Xcode6或Xcode7配置.pch文件
  5. Linux C程序内存空间
  6. int* V.S. int[]
  7. zoj 1109 zoj 1109 Language of FatMouse(字典树)
  8. Maven项目下 java.lang.ClassNotFoundException 常规解决的方法
  9. Xcode-App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
  10. Hadoop-2.x启动HDFS和YARN的方式
  11. BZOJ 1076: [SCOI2008]奖励关(概率+dp)
  12. excel去除空格
  13. Django学习-23-ModelForm
  14. BZOJ4943 [NOI2017] 蚯蚓
  15. php类注释生成接口文档
  16. pycharm实用快捷键集锦
  17. 服务器硬件与linux系统
  18. 2019-04-26-day041-数据库的索引
  19. 简单操作django中session和cookie
  20. day02编程语言,Python语言介绍,Python解释器安装,环境变量,Python代码执行,pip,应用程序使用文件的三步骤,变量,变量的三大组成,比较,pycharm

热门文章

  1. Mysql处理海量数据时的一些优化查询速度方法【转】
  2. 6 Django的视图层
  3. Struts2---配置文件讲解及简单登录示例
  4. MySQL之查询性能优化(四)
  5. js模板引擎之 Handlebars 基本用法
  6. 【Merge Intervals】cpp
  7. 最短路径(Floyd法)
  8. 【Python】python常用模块
  9. nosetests
  10. java 计算精度处理