Java Web项目中实现文件下载功能的实例教程

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片
两种实现方法:

一:通过超链接实现下载
在HTML网页中,通过超链接链接到要下载的文件的地址

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>通过链接下载文件</h1>
<a href="/day06/download/cors.zip">压缩包</a>
<a href="/day06/download/1.png">图片</a>
</body>
</html>

其中day06/download是文档路径,本实例的程序结构如下:

程序运行后,可以通过单击需要下载文档实现下载

但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。因此利用第二种方法实现下载功能。

二:通过Servlet程序实现下载
通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>通过链接下载文件</h1>
<a href="/day06/download/cors.zip">压缩包</a>
<a href="/day06/download/1.png">图片</a>
<h1>通过servlet程序下载文件</h1>
<a href="/day06/ServletDownload?filename=cors.zip">压缩包</a>
<a href="/day06/ServletDownload?filename=1.png">图片</a>
</body>
</html>

其中,/day06/ServletDownload 是servlet程序的映射路径
然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload

添加代码如下:

package com.lsgjzhuwei.servlet.response; 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

/**
 * Servlet implementation class ServletDownload
 */
@WebServlet(asyncSupported = true, urlPatterns = { "/ServletDownload" })
public class ServletDownload extends HttpServlet {
  private static final long serialVersionUID = 1L; 

  /**
   * @see HttpServlet#HttpServlet()
   */
  public ServletDownload() {
    super();
    // TODO Auto-generated constructor stub
  } 

  /**
   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub 

    //获得请求文件名
    String filename = request.getParameter("filename");
    System.out.println(filename); 

    //设置文件MIME类型
    response.setContentType(getServletContext().getMimeType(filename));
    //设置Content-Disposition
    response.setHeader("Content-Disposition", "attachment;filename="+filename);
    //读取目标文件,通过response将目标文件写到客户端
    //获取目标文件的绝对路径
    String fullFileName = getServletContext().getRealPath("/download/" + filename);
    //System.out.println(fullFileName);
    //读取文件
    InputStream in = new FileInputStream(fullFileName);
    OutputStream out = response.getOutputStream(); 

    //写文件
    int b;
    while((b=in.read())!= -1)
    {
      out.write(b);
    } 

    in.close();
    out.close();
  } 

  /**
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
  } 

}

重启tomcat服务器,即可实现对压缩包和对图片的下载。

三、小技巧:
点击链接来下载文件的方式很简便,后台把文件流输出来,通过浏览器实现下载功能,包括询问位置与文件存放,大多数浏览器会配置一个固定位置,不一定每次都问。

前端就非常简单了,一个<a>标签,href=“后台方法地址”,如果你的需求不能直接用超链接方式,可以在js里写 window.location.href =“后台方法地址”。

这样跳转到后台方法后

String filePath = this.getClass().getClassLoader().getResource("").toURI().getPath()
          + "/exportPdf.pdf"; //文件在项目中的路径
    File outfile = new File(filePath);
    String filename = outfile.getName();// 获取文件名称
    InputStream fis = new BufferedInputStream(new FileInputStream(
          filePath));
    byte[] buffer = new byte[fis.available()];
    fis.read(buffer); //读取文件流
    fis.close();
    response.reset(); //重置结果集
    response.addHeader("Content-Disposition", "attachment;filename="
        + new String(filename.replaceAll(" ", "").getBytes("utf-8"),
        "iso8859-1")); //返回头 文件名
    response.addHeader("Content-Length", "" + outfile.length()); //返回头 文件大小
    response.setContentType("application/octet-stream");  //设置数据种类
    //获取返回体输出权
    OutputStream os = new BufferedOutputStream(response.getOutputStream());
    os.write(buffer); // 输出文件
    os.flush();
    os.close();

浏览器会直接识别这种形式的文件输出,弹出对话框。
注意此方法一定要用链接方式调后台,使用ajax和XMLHttpRequest方式都是不行的,这样返回的文件流会返回到方法的回调函数中,当然如果你想在js中获取文件,这样也行。

时间: 2016-05-24

Java Web端程序实现文件下载的方法分享

Web文件下载有两种,一种是文件在网站目录下,在浏览器中直接输入文件路径即可下载,如http://www.xxx.com/file.zip.另外一种是文件不在网站目录下或者文件是动态生成的(导出报表或者导出excel等),这种情况需要通过response的OutputStream实现文件的下载.DownloadUtils是一个Java Web文件下载工具类,提供多种静态方法实现文件下载. package com.rhui.util; import java.io.BufferedInputStr

javaweb文件打包批量下载代码

本文实例为大家分享了javaweb文件打包批量下载,供大家参考,具体内容如下 // 批量下载未批改作业 @RequestMapping(value = "/downloadAllHomework", method = RequestMethod.GET) public void downloadAllHomework(HttpSession httpSession, HttpServletRequest request, HttpServletResponse response, St

JavaWeb响应下载功能实例代码(包含工具类)

今天通过本文给大家分享是关于javaweb的响应(response)下载 以下是我的Demo: 页面我就粘主要部分的代码 <a href = "${pageContext.request.contextPath }/user/courseTab">模板下载</a> 当然,现在的项目大家都使用框架,这里我使用的是(SSM),好了,粘代码 @Controller @RequestMapping("/user") public class Uplo

java图形验证码生成工具类 web页面校验验证码

最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善. 验证码生成器: import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Date; import ja

java web项目实现文件下载实例代码

复制代码 代码如下: File file = new File(path);// path是根据日志路径和文件名拼接出来的    String filename = file.getName();// 获取日志文件名称    InputStream fis = new BufferedInputStream(new FileInputStream(path));    byte[] buffer = new byte[fis.available()];    fis.read(buffer); 

JavaWeb动态导出Excel可弹出下载

由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载.项目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI导出Excel.POI具体使用请自行百度.话不多说,上代码. ExportExcelUtil代码 package com.rixin.common.util; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder;

easyui导出excel无法弹出下载框的快速解决方法

之前用ajax做的,代码如下(ActionUrl为一般处理程序ashx的路径): $.ajax({ url: ActionUrl + '?action=export&ID=' + $('#fm_ID').val(), dataType: 'json', success: function (jsonstr) { //top.art.dialog.tips('导出成功!'); } }); 没办法弹出下载框. 直接浏览器地址栏输入相关页面地址并打开可以弹出下载框下载,考虑可能是iframe的缘故.

java动态导出excel压缩成zip下载的方法

本文实例为大家分享了java动态导出excel压缩成zip下载的具体代码,供大家参考,具体内容如下 package pack.java.io.demo; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.Simpl

JavaWeb导出Excel文件并弹出下载框

一.引言 在Java Web开发中经常涉及到报表,最近做的项目中需要实现将数据库中的数据显示为表格,并且实现导出为Excel文件的功能. 二.相关jar包 使用POI可以很好的解决Excel的导入和导出的问题,POI下载地址: poi-3.6-20091214.jar 三.关键代码 首先导入上述jar包. 在生成excel时一般数据源形式为一个List,下面把生成Excel格式的代码贴出来: /** * 以下为生成Excel操作 */ // 1.创建一个workbook,对应一个Excel文件

JS实现弹出下载对话框及常见文件类型的下载

1.写在前面 JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能. 这里所说的下载,有时候也可以理解为保存.出于安全考虑,JS肯定无法直接调用FileAPI写文件到磁盘,但是却可以通过下载来变相实现保存功能. 2.几个备用知识点 2.1. JS触发单击事件 既然是用A标签模拟,那么肯定要知道JS如何主动触发单击事件. 最简单的触发单击事件肯定是elem.clic

JavaWeb中导出excel文件的简单方法

在平时做系统项目时,经常会需要做导出功能,不论是导出excel,还是导出cvs文件.我下面的demo是在springmvc的框架下实现的. 1.JS中只需要用GET模式请求导出就可以了: $('#word-export-btn').parent().on('click',function(){ var promotionWord = JSON.stringify($('#mainForm').serializeObject()); location.href="${ctx}/promotionW

扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框

js代码 function initView(_box){ var $p = $(_box || document); $('a[target="dialog"]', $p).each(function(event){ $(this, $p).unbind('click').click(function(event){ openModal(event); }); }); } $(function(){ initView(); }); /**关闭modal*/ function hide

Python 解决火狐浏览器不弹出下载框直接下载的问题

用火狐浏览器下载文件,总是遇到这个弹窗问题,如下图: 原因: 使用火狐浏览器,点击下载,弹出下载弹框,使用AutoITLibrary库,能够判断是否弹出了下载弹框,但因为不能定位到下载弹框,导致没有下载,所以需要在下载过程中,不弹出下载框,直接下载,然后再判断文件是否下载成功. 解决办法: 1.自己启动Firefox浏览器,操作一次下载的过程.然后查看浏览器的"更多"->"选项"->"应用程序"->查看刚新增的文件类型,并修改为

PHP将数据导出Excel表中的实例(投机型)

1.简介 如何利用最简单粗糙暴力的方法将数据写入Excel文件中呢? 因为ms word和excel的文档都支持html文本格式,因此我们可以基于这个原理采用html文本格式进行数据的输出. 在html中,我们只需要将数据照着所想要的顺序放进相应的html表格中即可. 我们采用PHP进行数据获取整理以及构造相应的html文本,最后通过字节流输出下载到用户本地. 2.代码 直接上代码,这是一个很简单的程序,里面都带有注释了. ExportExcel.class.php文件 <?php class

Java Web使用POI导出Excel的方法详解

本文实例讲述了Java Web使用POI导出Excel的方法.分享给大家供大家参考,具体如下: 采用Spring mvc架构: Controller层代码如下 @Controller public class StudentExportController{ @Autowired private StudentExportService studentExportService; @RequestMapping(value = "/excel/export") public void