之前一直在找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下载。的更多相关文章

  1. Struts2学习笔记--使用Response下载文件和Struts2的StreamResult文件下载

    使用Response下载文件,servlet中的文件下载是通过流来实现的   我在webRoot文件夹下新建了一个文件夹from,里边放了一张图片,这里就以下载这张图片为例:download.jsp很 ...

  2. 使用Response下载(支持任何格式)

    使用Response下载 下面代码: protected void Button2_Click(object sender, EventArgs e) { Response.ContentType = ...

  3. response下载csv文件内容乱码问题

    response下载csv文件内容乱码问题 解决办法:在输出流语句第一行输出 out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); Se ...

  4. response下载文件 (转载)

    核心代码: ? DataSet ds = dBll.GetList("ID=" + ID); ? string docName = "a.doc";//文件名, ...

  5. android默认浏览器response下载PDF文件

    下载出来的文件不是PDF,而是xxx.htm文件,原因是response的header配置有问题. android默认浏览器的情况下,header的配置应该写成.(java 为例) response. ...

  6. servlet 中通过response下载文件

    public class ResponseDemo3 extends HttpServlet { private static final long serialVersionUID = -52329 ...

  7. C# Response 下载

    //TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新 ...

  8. C#中使用Response下载

    正常流程 正常的从服务器端下载文件的流程 System.IO.FileInfo file = new System.IO.FileInfo(s_path); HttpContext.Current.R ...

  9. response 下载文件

    String basePath = "D://test.json"; String filename = basePath.substring(basePath.lastIndex ...

随机推荐

  1. postgre

    切换用户:su postgres 启动:psql 查看有哪些数据库: \l 切换到数据库air: \c air 列出数据库中所有表: \d 列出指定表的所有字段信息: \d+ dag 或者 \d da ...

  2. Java之旅_面向对象_抽象类

    参考并摘自:http://www.runoob.com/java/java-abstraction.html Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有 ...

  3. 如何在安装node\npm\cnpm

    1.安装node.js node.js的官方地址为:https://nodejs.org/en/download/. 根据windows版本后,选择要下载的安装包,下载完毕,按照windows一般应用 ...

  4. Python一个文件调用另外一个文件的方法

    from common.Log import MyLog as Log 写法不完善修改为 import common.Log.MyLog as Log 即可

  5. struct和[]byte的转换,注意结构体内变量首字母一定大写

    type temp struct {     Afd int     Bee string }func main(){ text:=temp{3123,"4234"} b._:=j ...

  6. 【PyQt5-Qt Designer】QSpinBox-微调框

    QSpinBox-微调框 QSpinBox类提供了一个微调框小部件. QSpinBox被设计为处理整数和离散值集合(例如,月份名称):使用QDoubleSpinBox 可以作为浮点数的调整. QSpi ...

  7. 敏捷开发之Scrum扫盲篇(转)

    现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP... 为了不落后于他人,我也开始学习Scrum.今天主要是对我最近阅读的相关资料,根据自己的理解,用自己的语言来描述Scrum中 ...

  8. ios多播委托

    在现实中回调的需求也分两种 一对一的回调. 一对多的回调. 对于一对一的回调,在IOS中使用delegate.block都能实现.而一对多的回调基本就是通知中心了. 假如现在有一个需求,我们以图片下载 ...

  9. (1.7)mysql profiles分析

    mysql profiles分析 作用:记录会话查询SQL所用时间 1.开启 2.使用 [2.1]先使用一个查询 [2.2]然后再运行 show profiles; [2.3]查看执行过程中每个状态和 ...

  10. left join 太神奇了

    概念: 把left join左边的表的记录全部找出来.系统会先用表A和表B做个笛卡儿积,然后以表A为基表,去掉笛卡儿积中表A部分为NULL的记录.最后形成你的结果. 进行左连接时,就有涉及到主表.辅表 ...