通过Response下载。
之前一直在找js下载的插件,后来发现下载必须通过java后台处理,什么write(),open(),close()之类的方法。如果直接是通过<a>标签倒是简单的,直接将路径摆放在上面就可以。但是我不能这样,我需要双击下载,本质上就不是打开一个路径了,而是通过Response传入路径到后台处理数据了。
1、datagrid事件:
/*~~~~~~↓↓↓↓↓图片处理↓↓↓↓~~~~*/
$(function () {
$("#tp").datagrid({
//单击事件 查看图片
onClickRow: function (index, row) {
var imgType = row.picUrl.substr(row.picUrl.lastIndexOf(".")+1);
var imgshow = row.picUrl;
if(imgType == 'dwg' || imgType == 'dxf' || imgType == 'dwt' || imgType == 'dws' || imgType == 'doc' || imgType == 'docx' || imgType == 'pdf'){
imgshow = "http://192.168.91.162/xian/demo/components/imgupload/images/icon_file.jpg";
}
document.getElementById("myImage").src=imgshow;
},
//双击事件 下载
onDblClickRow: function (index, row) {
window.location.href = "download.htm?filePath=" + row.picUrl + "&filename="+row.picUrl;
}
});
})
2、
download.jsp
import="java.io.InputStream,java.io.OutputStream,java.net.URLEncoder,java.net.URL,java.net.URLConnection"%>
<%
String filename = request.getParameter("filename");//获取文件的相对路径
String filePath = request.getParameter("filePath");
//response.setHeader告诉浏览器以什么方式打开 //假如文件名称是中文则要使用 URLEncoder.encode()编码 //否则直接使用response.setHeader("content-disposition", "attachment;filename=" + filename);即可
response.reset();
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8"));
response.setHeader("Content-Encoding", "binary");
response.setContentType("application/x-download");
URL url = new URL(filePath);
URLConnection urlconn = url.openConnection();
urlconn.setConnectTimeout(3000);
InputStream stream =urlconn.getInputStream();//获取文件的流 ,也可以这样:InputStream stream = new FileInputStream(url);
OutputStream os=response.getOutputStream();//输出流
out.clear();
out=pageContext.pushBody();
byte[] b=new byte[1024];//缓存作用
int len=0;
while((len=stream.read(b))!=-1){ //整体上就是通过路径先获取流,放置在buffer中,然后遍历输出流。
os.write(b,0,len);//向客户端输出,实际是把数据存放在response中,然后web服务器再去response中读取
}
stream.close();
%>
当路径中出现中文会有FileNotFoundException,将其中的中文部分(一般是fileName)单独拿出来处理,不能将其他英文什么的一起处理,会有问题。
int separ=filePath.lastIndexOf("/");
String url_en=URLEncoder.encode(filePath.substring(separ+1),"utf-8");
System.out.println(filePath.substring(0,separ+1)+url_en);
URL url = new URL(filePath.substring(0,separ+1)+url_en);
火狐浏览器下载文件名中文乱码问题:
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? filename.getBytes() : filename.getBytes("UTF-8"); // name.getBytes("UTF-8")处理safari的乱码问题
filename = new String(bytes, "ISO-8859-1"); // 各浏览器基本都支持ISO编码
response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", filename));
通过Response下载。的更多相关文章
- Struts2学习笔记--使用Response下载文件和Struts2的StreamResult文件下载
使用Response下载文件,servlet中的文件下载是通过流来实现的 我在webRoot文件夹下新建了一个文件夹from,里边放了一张图片,这里就以下载这张图片为例:download.jsp很 ...
- 使用Response下载(支持任何格式)
使用Response下载 下面代码: protected void Button2_Click(object sender, EventArgs e) { Response.ContentType = ...
- response下载csv文件内容乱码问题
response下载csv文件内容乱码问题 解决办法:在输出流语句第一行输出 out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); Se ...
- response下载文件 (转载)
核心代码: ? DataSet ds = dBll.GetList("ID=" + ID); ? string docName = "a.doc";//文件名, ...
- android默认浏览器response下载PDF文件
下载出来的文件不是PDF,而是xxx.htm文件,原因是response的header配置有问题. android默认浏览器的情况下,header的配置应该写成.(java 为例) response. ...
- servlet 中通过response下载文件
public class ResponseDemo3 extends HttpServlet { private static final long serialVersionUID = -52329 ...
- C# Response 下载
//TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新 ...
- C#中使用Response下载
正常流程 正常的从服务器端下载文件的流程 System.IO.FileInfo file = new System.IO.FileInfo(s_path); HttpContext.Current.R ...
- response 下载文件
String basePath = "D://test.json"; String filename = basePath.substring(basePath.lastIndex ...
随机推荐
- [No0000171]wpf 类层次结构Class Hierarchy
1.DispatcherObject类表示具有相关联的对象分派器.调度程序处理要在特定线程上执行工作的请求队列.它能够在其关联的线程上调用方法. DispatcherObject是对象的基类,用于跟踪 ...
- 网络层block,delegate之优劣分析
正常情况下, block 缺点: 1.block很难追踪,难以维护 2.block会延长先关对象的生命周期 block会给内部所有的对象引用计数+1, 一方面会带来潜在的循环引用(retain cyc ...
- OCR技术(光学字符识别)
什么是OCR? OCR英文全称是optical character recognition,中文叫光学字符识别.它是利用光学技术和计算机技术把印在或者写在纸上的 文字读取出来,并转换成一种计算机能够接 ...
- Java之旅_面向对象_接口
参考摘自:http://www.runoob.com/java/java-interfaces.html 接口(interface)在Java中是一个抽象类型,是抽象方法的集合. 一个类通过imple ...
- mybatis传入某一列的值,然后设置这一列的值是这个
select '${action}' as action from table name parameterType="map"可以指定为map,然后这边就可以用${xxx}来取值 ...
- bat实现获取文件每行内容,for循环中运行多条命令
关键词:bat,bat获取文件内容 1.获取每行内容 @echo offfor /f "delims=" %%i in (config.txt) do (echo "%% ...
- 前端 HTML body标签相关内容 常用标签 分割线 <hr>
分割线 <hr> <hr>标签用来在HTML页面中创建水平分隔线,通常用来分隔内容 <!DOCTYPE html> <html lang="en&q ...
- SSAS下玩转PowerShell
操作SSAS数据库的方法有非常多,是否有一种能够方法能够通过脚本自己主动去做这些事呢,比方处理分区,创建备份以及监视SSAS的执行状况. 原文地址: http://www.mssqltips ...
- docker+redis安装与配置,主从+哨兵模式
docker+redis安装与配置 docker安装redis并且使用redis挂载的配置启动 1.拉取镜像 docker pull redis:3.2 2.准备准备挂载的目录和配置文件 首先在/do ...
- 6种innodb数据字典恢复方法
6种innodb数据字典恢复方法 https://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html frm文件重 ...