<%--
直接在JSP页面中进行文件下载的代码(改 Servlet 或者
JavaBean 的话自己改吧), 支持中文附件名(做了转内码处理). 事实上只要向
out 输出字节就被认为是附件内容, 不一定非要从文件读取原始数据, 从数据
库中读取也可以的.
需传三个参数 newname,name,path
--%>
<%@ page contentType=" text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.io.*,java.util.*,java.text.*"%>

<%!//If returns true, then should return a 304 (HTTP_NOT_MODIFIED)
public static boolean checkFor304(HttpServletRequest req, File file) {
// We'll do some handling for CONDITIONAL GET (and return a 304)
// If the client has set the following headers, do not try for a 304.
// pragma: no-cache
// cache-control: no-cache
if ("no-cache".equalsIgnoreCase(req.getHeader("Pragma"))
|| "no-cache".equalsIgnoreCase(req.getHeader("cache-control"))) {
// Wants specifically a fresh copy
} else {
// HTTP 1.1 ETags go first
String thisTag = Long.toString(file.lastModified());
String eTag = req.getHeader("If-None-Match");
if (eTag != null) {
if (eTag.equals(thisTag)) {
return true;
}
}
// Next, try if-modified-since
DateFormat rfcDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
Date lastModified = new Date(file.lastModified());
try {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
// log.info("ifModifiedSince:"+ifModifiedSince);
if (ifModifiedSince != -1) {
long lastModifiedTime = lastModified.getTime();
// log.info("lastModifiedTime:" + lastModifiedTime);
if (lastModifiedTime <= ifModifiedSince) {
return true;
}
} else {
try {
String s = req.getHeader(" If-Modified-Since ");
if (s != null) {
Date ifModifiedSinceDate = rfcDateFormat.parse(s);
// log.info("ifModifiedSinceDate:" + ifModifiedSinceDate);
if (lastModified.before(ifModifiedSinceDate)) {
return true;
}
}
} catch (ParseException e) {
// log.warn(e.getLocalizedMessage(), e);
}
}
} catch (IllegalArgumentException e) {
// Illegal date/time header format.
// We fail quietly, and return false.
// FIXME: Should really move to ETags.
}
}
return false;
}%>
<%
String fileName="AppMappingTemplate.xlsx";
// String filePath=(String)request.getAttribute("filepath");
//获取模板文件所在路径
String filePath = request.getSession().getServletContext().getRealPath("/");
filePath += "pages//xflow//AppMappingTemplate.xlsx";

System.out.println("filepath:" + filePath);
boolean isInline = false; // 是否允许直接在浏览器内打开(如果浏览器能够预览此文件内容,
// 那么文件将被打开, 否则会提示下载)
// 清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去
// 如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错
// java.lang.IllegalStateException: getOutputStream() has already been called for
// this response,
out.clear();
// {{{ BEA Weblogic 必读
// 修正 Bea Weblogic 出现 "getOutputStream() has already been called for this response"错误的问题
// 关于文件下载时采用文件流输出的方式处理:
// 加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
// 因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
// 而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
// 就会发生:getOutputStream() has already been called for this response的错误
// 详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
// 而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
// 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。
// 同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去
response.reset();
// }}}
try {
java.io.File f = new java.io.File(filePath);
if (!f.exists()) {
System.out.println("The file is not exist!");
return;
}
if (f.exists() && f.canRead()) {
// 我们要检查客户端的缓存中是否已经有了此文件的最新版本, 这时候就告诉
// 客户端无需重新下载了, 当然如果不想检查也没有关系
if (checkFor304(request, f)) {
// 客户端已经有了最新版本, 返回 304
response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
// 从服务器的配置来读取文件的 contentType 并设置此contentType, 不推荐设置为
// application/x-download, 因为有时候我们的客户可能会希望在浏览器里直接打开,
// 如 Excel 报表, 而且 application/x-download 也不是一个标准的 mime type,
// 似乎 FireFox 就不认识这种格式的 mime type
String mimetype = null;
mimetype = application.getMimeType(filePath);
if (mimetype == null) {
mimetype = "application/octet-stream;charset=UTF-8";
}
response.setContentType(mimetype);
// IE 的话就只能用 IE 才认识的头才能下载 HTML 文件, 否则 IE 必定要打开此文件!
String ua = request.getHeader("User-Agent"); // 获取终端类型
if (ua == null)
ua = "User-Agent:Mozilla/4.0(compatible; MSIE 6.0;)";
boolean isIE = ua.toLowerCase().indexOf("msie") != -1; // 是否为 IE
if (isIE && !isInline) {
mimetype = "application/x-msdownload";
}
// 下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名
// 转换为 ISO8859-1 编码
String downFileName = new String(f.getName().getBytes(),"UTF-8");
String inlineType = isInline ? "inline" : "attachment"; // 是否内联附件
response.setHeader("Content-Disposition", inlineType+";filename=\""+fileName+"\"");
response.setContentLength((int) f.length()); // 设置下载内容大小
byte[] buffer = new byte[4096]; // 缓冲区
BufferedOutputStream output = null;
BufferedInputStream input = null;
try {
output = new BufferedOutputStream(response.getOutputStream());
input = new BufferedInputStream(new FileInputStream(f));
int n = (-1);
while ((n = input.read(buffer, 0, 4096)) > -1) {
output.write(buffer, 0, n);
}
response.flushBuffer();
} catch (Exception e) {
} // 用户可能取消了下载
finally {
if (input != null)
input.close();
if (output != null)
output.close();
}
}
return;
} catch (Exception ex) {
ex.printStackTrace();
}
// 如果下载失败了就告诉用户此文件不存在
response.sendError(404);
%>

download下载excel模板的代码的更多相关文章

  1. 下载excel模板,导入数据时需要用到

    页面代码: <form id="form1" enctype="multipart/form-data"> <div style=" ...

  2. java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)

    使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...

  3. vue Excel导入,下载Excel模板,导出Excel

    vue  Excel导入,下载Excel模板,导出Excel vue  Excel导入,下载Excel模板 <template> <div style="display: ...

  4. java 下载Excel模板

    前端: JSP: <div id="insertBtn" class="MyCssBtn leftBtn" onclick="download( ...

  5. java下载Excel模板(工具类)

    一次文件下载记录 一次不成熟的文件下载操作记录,希望能对需要的人有所帮助. 1.前端代码 $("#downloadModel").click(function(){ var mod ...

  6. poi下载excel模板

    /** * 下载模板 * @param tplName * @param returnName * @param response * @param request * @throws Excepti ...

  7. C# 中从程序中下载Excel模板

    方法一: #region 下载模板 /// <summary> /// 下载模板 /// </summary> /// <param name="sender& ...

  8. html下载excel模板

    只需要href等于模板存放的路径即可 <a href="../../TempLate/Attitude.xlsx" class="easyui-linkbutton ...

  9. 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)

    一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...

随机推荐

  1. OpenCV常用函数分析

    1. 聚类:将拥有最相似属性的数据归为一类. K-means聚类: python调用格式:compacness, labels, centers = cv2.kmeans(data, K, crite ...

  2. 游戏Demo(持续更新中...)

    格斗游戏 主要用于联系Unity的动画系统,并加入了通过检测按键触发不同的技能. WASD控制方向,AD为技能1,SW为技能2,右键跳跃,连续单机普通连招. 本来是要用遮罩实现跑动过程中的攻击动作,但 ...

  3. Python之线程&进程

    线程: 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. thr ...

  4. Apache Zeppelin

    介绍 用于做数据分析和可视化 一.二进制安装 1)下载二进制包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/incubator/zeppelin/0 ...

  5. 广播与P2P通道(下) -- 方案实现

    在广播与P2P通道(上) -- 问题与方案 一文中,我们已经找到了最优的模型,即将广播与P2P通道相结合的方案,这样能使服务器的带宽消耗降到最低,最大节省服务器的宽带支出.当然,如果从零开始实现这种方 ...

  6. Ubuntu环境变量——系统变量和用户变量

    系统变量: 对所有用户有效果 /etc/profile /etc/environment 两个命令只用一个就可以,原则上是重启后修改生效,但是经过验证可以通过执行以下命令实现: source /etc ...

  7. TouchSlide滚动插件BUG

    TouchSlide滚动切换效果时 nextCell设定自己的class名后无效,需要用".next"或不设置

  8. tableview选择的时候不要cell的高亮显示样式

    1.若用方法: //-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)ind ...

  9. 基于KNN的相关内容推荐

    如果做网站的内容运营,相关内容推荐可以帮助用户更快地寻找和发现感兴趣的信息,从而提升网站内容浏览的流畅性,进而提升网站的价值转化.相关内容 推荐最常见的两块就是“关联推荐”和“相关内容推荐”,关联推荐 ...

  10. ios实现文字的自适应

    如果你是用xib搭的cell界面   那么cell上面的UIlabel就不能设置宽高   要选择上下左右自适应   并且label的行数设置为0  然后在tableView的代理方法 (UITable ...