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

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

package com.rhui.util; 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder; 

import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.lang3.StringUtils; 

/**
 * 文件下载类
 */
public class DownloadUtils {
  /**
   * 文件下载编码
   * 该编码告诉浏览器文件名的编码方式,以防下载中文文件名时有乱码
   */
  private static String encoding = "utf-8"; 

  /**
   * 文件下载
   * @param response
   * @param filePath 文件在服务器上的路径,包含文件名
   */
  public static void download(HttpServletResponse response, String filePath){
    File file = new File(filePath.toString());
    download(response, file, null, encoding);
  } 

  /**
   * 文件下载
   * @param response
   * @param filePath 文件在服务器上的路径,包括文件名称
   * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
   */
  public static void download(HttpServletResponse response, String filePath, String fileName){
    File file = new File(filePath.toString());
    download(response, file, fileName, encoding);
  } 

  /**
   * 文件下载
   * @param response
   * @param filePath 文件在服务器上的路径,包括文件名称
   * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
   * @param encoding 文件名称编码
   */
  public static void download(HttpServletResponse response, String filePath, String fileName, String encoding){
    File file = new File(filePath.toString());
    download(response, file, fileName, encoding);
  } 

  /**
   * 文件下载
   * @param response
   * @param file 文件
   * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
   */
  public static void download(HttpServletResponse response, File file) {
    download(response, file, null, encoding);
  } 

  /**
   * 文件下载
   * @param response
   * @param file 文件
   * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
   */
  public static void download(HttpServletResponse response, File file, String fileName) {
    download(response, file, fileName, encoding);
  } 

  /**
   * 文件下载
   * @param response
   * @param file 文件
   * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
   * @param encoding 文件名称编码
   */
  public static void download(HttpServletResponse response, File file, String fileName, String encoding) {
    if(file == null || !file.exists() || file.isDirectory()){
      return;
    } 

    // 如果不指定文件下载到浏览器的名称,则使用文件的默认名称
    if (StringUtils.isBlank(fileName)) {
      fileName = file.getName();
    } 

    try {
      InputStream is = new FileInputStream(file);
      download(response, is, fileName, encoding);
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

  /**
   * 文件下载
   * @param response
   * @param is 文件输入流
   * @param fileName 下载的文件名称
   * @throws IOException
   */
  public static void download(HttpServletResponse response, InputStream is, String fileName){
    download(response, is, fileName, encoding);
  } 

  /**
   * 文件下载
   * @param response
   * @param is 文件输入流
   * @param fileName 下载的文件名称
   * @param encoding 编码格式
   */
  public static void download(HttpServletResponse response, InputStream is, String fileName, String encoding){
    if(is == null || StringUtils.isBlank(fileName)){
      return;
    } 

    BufferedInputStream bis = null;
    OutputStream os = null;
    BufferedOutputStream bos = null; 

    try{
      bis = new BufferedInputStream(is);
      os = response.getOutputStream();
      bos = new BufferedOutputStream(os);
      response.setContentType("application/octet-stream;charset=" + encoding);
      response.setCharacterEncoding(encoding);
      response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, encoding));
      byte[] buffer = new byte[1024];
      int len = bis.read(buffer);
      while(len != -1){
        bos.write(buffer, 0, len);
        len = bis.read(buffer);
      } 

      bos.flush();
    }catch(IOException e){
      e.printStackTrace();
    }finally{
      if(bis != null){
        try{
          bis.close();
        }catch(IOException e){}
      } 

      if(is != null){
        try{
          is.close();
        }catch(IOException e){}
      }
    }
  } 

  public static String getEncoding() {
    return encoding;
  } 

  public static void setEncoding(String encoding) {
    DownloadUtils.encoding = encoding;
  }
}

如果文件保存在服务器的非网站目录下

String filePath = "c:\\file.zip";
DownloadUtils.download(response, filePath);

如果文件是输入流

// is为文件输入流
// fileName为浏览器下载的文件名称
// encoding为文件名称编码,预防文件中有中文的时候产生乱码
String fileName = "file.zip";
String encoding = "utf-8";
DownloadUtils.download(response, is, fileName, encoding);

Servlet中文件下载

package com.rhui.web.servlet; 

import java.io.IOException; 

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

import com.rhui.util.DownloadUtils; 

@WebServlet("/download/servlet")
public class DownloadServlet extends HttpServlet {
  private static final long serialVersionUID = 1L; 

  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filePath = "c:\\file.zip";
    DownloadUtils.download(response, filePath);
  } 

}

PS:图片下载(含防盗链功能)

package cn.itcast.day06.web.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {

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

 // 实现防盗链功能
 // 获得 referer 头 用于说明来访者来自哪里
 String referer = request.getHeader("referer");
 if(referer==null || !referer.startsWith("http://localhost")) {
  // 是盗链者
  response.sendRedirect("/day06/index.jsp");
  return ;
 }

 // 解决response中文乱码问题
 response.setContentType("text/html;charset=utf-8"); // 设置消息体的编码

 // 通过 http 协议 发送的http响应消息头 不能出现中文 中文必须要经过url编码
 String filename = URLEncoder.encode("美女.jpg", "utf-8");

 // 通知浏览器以下载的方式读取资源
 response.setHeader("content-disposition", "attachment;filename="+filename);

 // 读取图片数据 发给ie浏览器
 String webPath = "/download/美女.jpg"; // 相当于当前web应用的path

 ServletContext servletContext = super.getServletContext();

 InputStream in = servletContext.getResourceAsStream(webPath);

 OutputStream out = response.getOutputStream();

 int len;
 byte[] buffer = new byte[1024];
 while((len=in.read(buffer))!=-1)
  out.write(buffer, 0, len);

 }

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

}
(0)

相关推荐

  • 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

  • javaweb文件打包批量下载代码

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

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

    需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>通过链接下载文件&

  • 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;

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

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

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

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

  • 基于JAVA文件中获取路径及WEB应用程序获取路径的方法

    1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了test.txt文件的绝对路径: http://www.sun.com/index.htm也代表了一个URL绝对路径: `相对路径`:相对与某个基准目录的路径,包含Web的相对路径(HTML中的相对目录). 例如: 在Servlet中,"/"代表Web应用的根目录,和物理路径的相对表示. 例如: "./"代表当前目录,&quo

  • Java Web项目中解决中文乱码方法总结(三种最新方法)

    目录 前言 问题背景 下面我说三种方法供大家参考 方法一: 方法二: 第三种方法: Tomcat结构与介绍 bin conf lib logs temp webapps work 前言 JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发平台.最早由Sun公司定制并发布,后由Oracle负责维护.JavaEE平台规范了在开发企业级web应用中的技术标准.在JavaEE平台共包含了13个技术规范(随着JavaEE版本的变化所包含的技术点的数量会

  • Java Web基于Session的登录实现方法

    本文实例讲述了Java Web基于Session的登录实现方法.分享给大家供大家参考,具体如下: package cn.com.login; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpSer

  • 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

  • Java文件上传与文件下载实现方法详解

    本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传的一种特例,指客户端向服务器上传文件.即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中. 1.上传表单要求 文件上传要求客户端提交特殊的请求--multipart请求,即包含多部分数据的请求.必须将<form/>标签的enctype属性值设为"multipart/form-d

  • Java中ArrayList同步的2种方法分享

    目录 方法一:使用Collections.synchronizedList()方法 方法2:使用CopyOnWriteArrayList 向量同步时为什么要使用arrayList? 前言: arrayList 的实现是默认不同步的.这意味着如果一个线程在结构上修改它并且多个线程同时访问它,它必须在外部同步.结构修改意味着从列表中添加或删除元素或显式调整后备数组的大小.改变现有元素的值不是结构修改. 有两种方法可以创建同步Arraylist: 1. Collections.synchronized

  • 在Java Web项目中添加定时任务的方法

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class TimerDataTaskListener implements ServletContextListener

  • Python部署web开发程序的几种方法

    1.fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass 2.http,nginx使用proxy_pass转发,这个要求后端appplication必须内置一个能处理高并发的http server,在python的web框架当中,只能选择tornado. 3.uwsgi,包括4部分组成: uwsgi协议 web server内置支持协议模块 application服务器协议支持模块 进程控制程序 nginx从0.8.4开始内置支持uwsgi协议,uw

  • Java Web应用程序实现基础的文件下载功能的实例讲解

    基础思路: 之前的思路一直是弹出一个框问用户想要存放文件的位置,然后我再生成个文件放到那.然而我这个想法并没有成功. 点击链接来下载文件的方式很简便,后台把文件流输出来,通过浏览器实现下载功能,包括询问位置与文件存放,大多数浏览器会配置一个固定位置,不一定每次都问. 前端就非常简单了,一个<a>标签,href="后台方法地址",如果你的需求不能直接用超链接方式,可以在js里写 window.location.href ="后台方法地址". 这样跳转到后台

随机推荐