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

 更新时间:2017年07月11日 14:50:39   作者:ChoviWu  
今天通过本文给大家分享的是关于javaweb的响应(response)下载功能,需要的朋友参考下吧

今天通过本文给大家分享是关于javaweb的响应(response)下载

以下是我的Demo:

页面我就粘主要部分的代码

<a href = "${pageContext.request.contextPath }/user/courseTab">模板下载</a>

当然,现在的项目大家都使用框架,这里我使用的是(SSM),好了,粘代码

@Controller
@RequestMapping("/user")
public class UploadController {
@RequestMapping(value="/courseTab",method=RequestMethod.GET)
  public void courseTab(HttpServletResponse response,HttpServletRequest request) throws IOException{
    String path = request.getSession().getServletContext().getRealPath("/courseTab/课表上传模板.xls");
    DownUtil.downMb(response, path, "课表模板"+DateFormat.formatSimple(new Date()));
}
}

 这里我使用的DownUtil工具类是我自己写的,下来我粘到文章中

package org.cxxy.base.cxsc.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletResponse;
/**
 * @Title: DownUtil.java
 * @Package org.cxxy.base.cxsc.util
 * @Description:文件下载工具类
 * @author ChoviWu
 * @date 2017年6月18日 下午2:44:17
 * @version V1.0
 */
public class DownUtil {
  /**
   *
   * @Description:
   * @param @param response
   * @param @param url 文件在数据库的路径
   * @param @param base 文件存放的基础路径
   * @param @param folderPath 上传所在的文件夹
   * @param @return
   * @param @throws IOException
   * @return int
   * @throws
   */
  @SuppressWarnings("unused")
  public static int downFile(HttpServletResponse response, String url,
      Integer down, String base, String folderPath) throws IOException {
    // 文件的名称
    String fileName = url.split("/")[1];
    System.out.println(fileName);
    // 文件的后缀
    String last = url.substring(url.lastIndexOf(".") + 1);
    System.out.println(last);
    // 文件路径
    String downFilePath = base + folderPath + fileName;
    Long fileLength = new File(downFilePath).length();// 文件的长度
    if (fileLength != 0) {
      response.reset();
      response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
      try {
        response.setHeader(
            "Content-disposition",
            "attachment; filename="
                + new String(fileName.getBytes("utf-8"),
                    "ISO8859-1"));
        response.setHeader("Content-Length", String.valueOf(fileLength));
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      BufferedInputStream bis = null;
      BufferedOutputStream bos = null;
      FileInputStream fis = null;
      try {
        fis = new FileInputStream(downFilePath);
        bis = new BufferedInputStream(fis);
        // 输出流
        bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buff = new byte[2048];
        int bytesread;
        // 写文件
        while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
          bos.write(buff, 0, bytesread);
        }
        // 跳转的路径
        fis.close();
        bis.close();
        bos.close();
      } catch (FileNotFoundException e) {
        System.out.println("File is Not Exsist!");
      }
    } else {
      // 抛异常
      response.getWriter()
          .write("<script charset='utf-8' type='text/javascript'>alert('该资源不存在!');history.go(-1);</script>");
      return down;
    }
    down++;
    return down;
  }
  /**
   *
   * @Description: 下载的模板
   * @param @param response
   * @param @param path 路径名
   * @param @param name 模板名称
   * @param @throws IOException
   * @return void
   * @throws
   */
  @SuppressWarnings("unused")
  public static void downMb(HttpServletResponse response, String path,
      String name) throws IOException {
    Long fileLength = new File(path).length();// 文件的长度
    System.out.println("文件的长度:" + fileLength);
    if (fileLength != 0) {
      response.reset();
      response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
      try {
        response.setHeader(
            "Content-disposition",
            "attachment; filename="
                + new String(name.getBytes("utf-8"),
                    "ISO8859-1"));
        response.setHeader("Content-Length", String.valueOf(fileLength));
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      BufferedInputStream bis = null;
      BufferedOutputStream bos = null;
      FileInputStream fis = null;
      try {
        fis = new FileInputStream(path);
        bis = new BufferedInputStream(fis);
        // 输出流
        bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buff = new byte[2048];
        int bytesread;
        // 写文件
        while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
          bos.write(buff, 0, bytesread);
        }
        fis.close();
        bis.close();
        bos.close();
      } catch (FileNotFoundException e) {
        System.out.println("File is Not Exsist!");
      }
    }
  }
}

 下来,我说一下,调用的downMb,我们都知道,在服务器上下载一个文件,

//设置响应头,控制浏览器下载该文件,形参调的是文件的长度
response.setHeader("Content-Length", String.valueOf(fileLength));
 //设置响应类型,设置输出流类型
response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件

 这里我使用的是输出的Excel文件

接下来就是读文件,写文件了,相信学了java基础的都会接触IO吧,这里我就略过

BufferedInputStream bis = null;
BufferedOutputStream bos = null;

这里使用的是缓冲流,因其使用的是浏览器打开文件的下载

下来就是写文件了,写文件也是一贯的套路,先把文件存到buff数据缓冲区,然后将buff的数据输出到浏览器供用户查看

byte[] buff = new byte[2048];
  int bytesread;
  // 写文件
  while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
    bos.write(buff, 0, bytesread);
  }

当读写完文件之后,千万别忘了要关闭文件流(当然,关闭流的顺序也不能变)

fis.close();
bis.close();
bos.close();

以上所述是小编给大家介绍的JavaWeb响应下载实例代码(包含工具类),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java 获取上一个月的月份的正确写法

    Java 获取上一个月的月份的正确写法

    这篇文章主要介绍了java获取上一个月月份,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java工作环境的配置与Eclipse的安装过程

    Java工作环境的配置与Eclipse的安装过程

    这篇文章主要介绍了Java工作环境的配置与Eclipse的安装过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 在java中调用python脚本的三种方法

    在java中调用python脚本的三种方法

    实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python脚本呢,这篇文章主要给大家介绍了关于在java中调用python脚本的三种方法,需要的朋友可以参考下
    2023-09-09
  • Spring Boot全局统一异常处理器

    Spring Boot全局统一异常处理器

    软件开发springboot项目过程中,不仅有大量的冗余代码,而且还影响代码的可读性.这样就需要定义个全局统一异常处理器,以便业务层再也不必处理异常.文中有非常详细的代码示例,需要的朋友可以参考下
    2021-05-05
  • Java线程安全问题的解决方案

    Java线程安全问题的解决方案

    这篇文章主要介绍了Java线程安全问题的解决方案,文章关于安全的问题的解决方案本文主要分享了三种方法,使用线程安全类,比如 AtomicInteger,使用线程本地变量 ThreadLocal,加锁排队执行,三种方法的使用场景及区别需要的小伙伴可以参考一下
    2022-05-05
  • java定时任务框架elasticjob详解

    java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。,需要的朋友可以参考下
    2019-06-06
  • Activiti开发环境的搭建过程详解

    Activiti开发环境的搭建过程详解

    这篇文章主要介绍了Activiti开发环境的搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java数组队列及环形数组队列超详细讲解

    Java数组队列及环形数组队列超详细讲解

    队列是一个有序列表,可以用数组和链表来实现,队列有一个原则。即:先存入队列的数据要先取出,后存入的要后取出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • idea如何debug看springsecurity的过滤器顺序

    idea如何debug看springsecurity的过滤器顺序

    这篇文章主要介绍了idea如何debug看springsecurity的过滤器顺序,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-04-04
  • java实现希尔排序算法

    java实现希尔排序算法

    希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进,是将整个无序列分割成若干小的子序列分别进行插入排序,希尔排序并不稳定。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
    2015-04-04

最新评论