jsp页面上的txt附件,点击后浏览器默认直接打开,结果是乱码。

因为用户上传的txt文件可能是ANSI、Unicode、UTF-8编码的任意一种,上传时后台获取文件内容重写一遍保证浏览器打开正常太过麻烦,

同时也觉得下载到本地更为合适,所以希望实现点击下载。

最初的实现方式是在Web.xml中配置mime-type,如下:

<mime-mapping> 
<extension>txt</extension> 
<mime-type>application/txt</mime-type>
</mime-mapping>

但是最后发现在IE6上无效,仍然是直接打开,只好寻求新的方法。最后使用如题的方式解决,参考了

http://www.cnblogs.com/sydeveloper/archive/2013/05/14/3078295.html这里的文章。

代码如下:

页面js:

function downFile(filePath){
var form=$("<form>");//定义一个form表单
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action","down");
var input1=$("<input>");
input1.attr("type","hidden");
input1.attr("name","filePath");
input1.attr("value",filePath);
$("body").append(form);//将表单放置在web中
form.append(input1);
form.submit();//表单提交 
form.remove();
}

js方法的调用自然不用我说了。

servlet代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String filePath = request.getParameter("filePath");
String fileName = ""; // 文件名,输出到用户的下载对话框
int index = 0;
if(filePath!=null && !"".equals(filePath)){
index = filePath.lastIndexOf("/");
if(index>=0){
fileName = filePath.substring(index+1, filePath.length());
}
}
// 打开指定文件的流信息
java.io.FileInputStream fs = null;
try {
String path = new FileUtil().getRootPath() + "/";
path = path + filePath;
fs = new FileInputStream(new File(path));

// 设置响应头和保存文件名
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\"");
// 写出流信息
int b = 0;

PrintWriter out = response.getWriter();
while ((b = fs.read()) != -1) {
out.write(b);
}
fs.close();
out.close();
System.out.println("文件下载完毕.");
} catch (Exception e) {
e.printStackTrace();
System.out.println("下载文件失败!");
}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request, response);
}

其中FileUtil().getRootPath()是获取WebRoot路径的函数。如下:

public String getRootPath() {
String strClassName = getClass().getName();
String strPackageName = "";
if (getClass().getPackage() != null) {
strPackageName = getClass().getPackage().getName();
}

String strClassFileName = "";
if (!strPackageName.equals("")) {
strClassFileName = strClassName.substring(
strPackageName.length() + 1, strClassName.length());
} else {
strClassFileName = strClassName;
}

URL url = null;
url = getClass().getResource(strClassFileName + ".class");
String strURL = url.toString();
strURL = strURL.replaceAll("file:", "");
strURL = strURL.substring(0, strURL.indexOf("/WEB-INF/"));
return strURL;
}

最后一步,别忘了在web.xml中配置servelt

<servlet>
<servlet-name>DownFile</servlet-name>
<servlet-class>com.XX.DownFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownFile</servlet-name>
<url-pattern>/down</url-pattern>
</servlet-mapping>

至此,大功告成。

JQuery调用Servlet实现文件下载的更多相关文章

  1. JSP在页面加载时调用servlet的方法

    方法:先在JS里面写一个调用servlet的事件(可以利用ajax),然后利用<body>标签的onload调用这个事件. 代码如下: jsp文件代码如下: <%@ page lan ...

  2. Jsp +Js + Jquery + EasyUI + Servlet + Lucene,完成分页

    package loaderman.fy.action; import java.io.IOException; import java.io.PrintWriter; import java.uti ...

  3. jQuery调用WebService实现增删改查的实现

    第一篇博客,发下我自己写的jQuery调用WebService实现增删改查的实现. 1 <!DOCTYPE html> 2 3 <html xmlns="http://ww ...

  4. jQuery调用后台方法

    前台: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.as ...

  5. jQuery 调用jsonp实现与原理

    jQuery 调用jsonp实现与原理 您的评价:        收藏该经验     阅读目录 1.客户端代码 2.服务器端 通过jQuery实现JSONP 一般的ajax是不能跨域请求的,因此需要使 ...

  6. Jquery调用Webservice传递Json数组

    Jquery由于提供的$.ajax强大方法,使得其调用webservice实现异步变得简单起来,可以在页面上传递Json字符串到Webservice中,Webservice方法进行业务处理后,返回Js ...

  7. servlet实现文件下载

     之前没怎么用过这个,这次项目中用到了,于是总结一下: 应该说主要注意三方面: 1.写一个servlet 2.在web.xml中配置这个servlet 3.页面上调用这个servlet   第一: 写 ...

  8. 前台JS(Jquery)调用后台方法 无刷新级联菜单示例

    前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 下面是做的一个前台用JQUERY,AJAX调用后台方法做的无刷新级联菜单 http://www.dtan.so CasMenu.aspx页 ...

  9. Jquery调用从ashx文件返回的jsonp格式的数据处理实例

    开发环境:vs2010+jquery-1.4.min.js 解决问题:网上代码比较少,好多调试不通,返回数据不用json而用jsonp主要考虑解决跨域问题 开发步骤:打开VS2010,新建一web站点 ...

随机推荐

  1. chroot directory

    给 /A/B/C的C目录做chroot,要对C能读写,所以C目录不能做ROOT目录,对B做chroot. 设置C目录所有者为sftp 账户a,组也改为sftp组(这里a和sftp组都是之前建立好的sf ...

  2. CentOS6.5上安装MySQL5.6

    1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/data,而后需要创建/data/mysqldata目录做为mysql数据的存放 ...

  3. SystemC简介

    SystemC是一种基于C++语言的用于系统设计的计算机语言,是用C++编写的一组库和宏.它是为了提高电子系统设计效率而逐渐发展起来的产物.IEEE于2005年12月批准了IEEE1666-2005标 ...

  4. lua创建文件和文件夹

    创建文件夹: os.execute('mkdir xx') 创建文件: f = assert(io.open('a.tmp','w')) f:write('test') f:close()

  5. windows下用navicat远程链接虚拟机Linux下MySQL数据库

    今天想用navicat远程连接虚拟机中的MySQL数据库,一直连不上,在网上搜索了一下,发现原因是MySQL对远程用户登陆的授权问题.这里说一下我的解决方法.(本人小白) 首先,我用navicat去远 ...

  6. 阿里云SLB后Nginx、Tomcat获取真实IP

    一.SLB后Nginx如何获取真实IP 前提:nginx作为slb获取真实ip是使用 http_realip_module,默认一键安装包安装的nginx没有安装这个模块需要重新重新编译nginx并加 ...

  7. 转载:jQuery实现返回顶部功能

    转自:http://blog.csdn.net/itmyhome1990/article/details/25340705 整理两个实现功能,一个是右下角的返回顶部,一个是右侧的返回顶部,分别如图   ...

  8. centos 安装 nginx

    采用版本 nginx-1.9.8.tar.gz yum -y install pcre-devel yum -y install openssl openssl-devel tar –zxvf ngi ...

  9. Myeclipse2016部署tomcat服务(别的服务类似)配置环境

    1.在工具MyEclipse的项目管理菜单中,右单机找Properties或者快捷键alt+enter,(或者直接搜索Runtimes)myEclipse/Targeted Runtimes 2.ne ...

  10. sizeof(结构体) = ?

    关于结构体大小怎样计算的文章,我想网上一搜到处都有人总结,本人之所以在此基础上还要发表这样的文章是想用最简单的计算方法来总结前人给出的结论,以致我们在以后在对结构体相关编程中不会陷入字节对齐的陷阱中. ...