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);
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-20 16:11:42

Java Web文件下载的相关文章

【Servlet】java web 文件下载功能实现

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

Java Web文件下载1——文件下载实现和乱码处理

文件上传和下载是web开发中常遇到的问题,这几天在做一个项目又用到了文件下载,之前也零零散散记了些笔记,今天来做一下整理.文件上传还有待进一步测试,这里先说一下文件下载. 一.文件下载处理流程 文件下载处理流程其实很清晰,即: 1.根据文件名或者文件路径定位文件,具体的策略主要根据自己的需求,总之需要系统能找到的文件全路径. 2.获取输入流,从目标文件获取输入流. 3.获取输出流,从response中获取输出流. 4.从输入流读入文件,通过输出流输出文件.这是真正的下载执行过程. 5.关闭IO流

java web文件下载功能实现

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

Java WEB 笔记

1. 部署并启动 tomcat 服务器 1). 解压 apache-tomcat-version 到一个非中文目录下 2). 配置一个环境变量,JAVA_HOME(指向 JDK 安装目录)或 JRE_HOME 3). 通过双击 apache-tomcat-version\bin 目录下的 catalina run 或 startup.bat,启动服务器,catalina.bat 4). 可以在浏览器中输入 localhost:8080 来检验 Tomcat 安装是否正确 5). 若已经启动了一个

Java Web入门项目之“网络交友”的设计与实现

前言:这个小项目是我刚学习JSP时,参考"JSP程序设计"这本书写的.这里之所以说参考这本书而不是照着这本书写,主要是因为我自己完成的时候删掉了不少繁琐的写法(比如:文件上传):同时对书中容易产生SQL注入漏洞,XSS跨站脚本漏洞等地方的写法进行了修改过滤:登录页面加上了随机验证码.除此之外,还添加了文件管理功能 PS:整个项目没有特别的难点,可以分为一个个功能点实现,大神轻喷,个人认为对初学Java Web的童鞋还是有参考意义的 注:整个项目的完整源代码和sql文件我会在文末给出下载

【Java Web】Myeclipse下运用maven管理项目jar包

Java Web开发的人都知道经常会为缺少各种jar包而烦恼,经常要去各种地方下载.用maven来管理项目的jar包,就非常方便了,maven会自动帮你下载所需要的各种jar包. 下面就来介绍一下在Myeclipse下运用maven: 1.maven的环境变量配置 maven在官网下载后,百度一下环境变量的配置,然后在命令行检测一下配置是否正确.可以参考jdk的配置与检测. 2.Myeclipse中配置maven环境 2.1在Myeclipse中点击:Window-->Preferences,出

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

一款基于SSM框架技术的全栈Java web项目(已部署可直接体验)

概述 此项目基于SSM框架技术的Java Web项目,是全栈项目,涉及前端.后端.插件.上线部署等各个板块,项目所有的代码都是自己编码所得,每一步.部分都有清晰的注释,完全不用担心代码混乱,可以轻松.简单.放心全面学习(也不需要版本控制配置).下载后遇到任何问题,我将全力进行解答. 此项目:快编(kuaib)是一款方便快速全能的编辑系统,竭尽全力地将编写.查找.比对.修改.文件下载.上传.查重等所有功能整合于单个页面操作综合操作系统.--另外,此项目已部署:http://yws233.cn:80

java web环境搭建

1. 根据自己电脑版本下载对应的tomcat和eclipse安装包 2. 在eclipse中找到preferences 找到 runtime environments 找到add 3. 选择tomcat的版本 next 4. 选择browse  tomcat解压的地方选择对应的版本,最后finsih 5. 数据库方面 只需要下载Mysql的安装包即可. 最后完成了java web环境的搭建.