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 文件在server上的路径,包含文件名称*/public static void download(HttpServletResponse response, String filePath){File file = new File(filePath.toString());download(response, file, null, encoding);}/*** 文件下载* @param response* @param filePath 文件在server上的路径。包含文件名称称* @param fileName 文件下载到浏览器的名称。假设不想让浏览器下载的文件名称称和server上的文件名称称一样,请设置该參数*/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 文件在server上的路径,包含文件名称称* @param fileName 文件下载到浏览器的名称,假设不想让浏览器下载的文件名称称和server上的文件名称称一样,请设置该參数* @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 文件下载到浏览器的名称,假设不想让浏览器下载的文件名称称和server上的文件名称称一样,请设置该參数*/public static void download(HttpServletResponse response, File file) {download(response, file, null, encoding);}/*** 文件下载* @param response* @param file 文件* @param fileName 文件下载到浏览器的名称,假设不想让浏览器下载的文件名称称和server上的文件名称称一样,请设置该參数*/public static void download(HttpServletResponse response, File file, String fileName) {download(response, file, fileName, encoding);}/*** 文件下载* @param response* @param file 文件* @param fileName 文件下载到浏览器的名称,假设不想让浏览器下载的文件名称称和server上的文件名称称一样,请设置该參数* @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;}
}

假设文件保存在server的非站点文件夹下

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

Java Web文件下载相关推荐

  1. java web 文件下载

    java通用文件下载 前端:简单的一个标签 <a href="../emp/OriDownload.do?fileName=421785d6-d76c-46a5-86b4-2cfcb9 ...

  2. Java Web——文件下载getResourceAsStream()返回NULL解决方案

    问题描述 严重: Servlet.service() for servlet [club.zstuca.demo.DownloadDemo] in context with path [/DEMOWe ...

  3. Java Web——文件下载时中文文件名乱码问题解决方案

    问题描述 问题分析 浏览器匹配与编码问题. 解决方案 request.setCharacterEncoding("UTF-8");//response.setContentType ...

  4. Java web文件下载断点续传

    一.下载文件请求 @RequestMapping(value = "/file/download")@ResponseBodypublic Res download(HttpSer ...

  5. centos 安装java web_Centos上安装java web的环境

    Centos上安装java web的环境 ,本次例子尽量不用yum形式安装(因为我不知道yum安装怎么指定目录,想把java,tomcat,mysql安装到指定的文件夹下,好管理). (java和to ...

  6. 初学Java Web(2)——搭建Java Web开发环境

    虽然说 html 和 css 等前端技术,是对于 Web 来说不可或缺的技术,但是毕竟更为简单一些,所以就不详细介绍了,没有基础的同学可以去菜鸟教程或者W3school进行自主学习,最好的方式还是做一 ...

  7. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

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

    Java Web开发的人都知道经常会为缺少各种jar包而烦恼,经常要去各种地方下载.用maven来管理项目的jar包,就非常方便了,maven会自动帮你下载所需要的各种jar包. 下面就来介绍一下在M ...

  9. 使用Hibernate和Spring构建Java Web应用程序

    这篇文章将展示如何在Spring环境中使用带有Hibernate ORM的MYSQL DB创建学生注册应用程序. 这是一个简单的应用程序,旨在在注册过程中从用户收集输入详细信息,将这些详细信息保存在M ...

最新文章

  1. golang mysql多表查询_MySQL多表查询
  2. 定义zabbix_action报警通知模板
  3. 内核分析PE获取DLL导出函数地址
  4. 通用机器学习流程与问题解决架构模板
  5. kubernetes 中 label的作用_Kubernetes生产环境的16条建议
  6. 蓝叠 正在检查服务器最新,Windows update一直停留在正在检查更新
  7. python 网格_Python | 网格到情节
  8. 罗小黑用flash做的_中影星美好看罗小黑战记正式定档!
  9. Android Studio(5)---引用jar及so文件
  10. flask 模板 php,Flask 模板系统
  11. [leetcode]1185. 一周中的第几天
  12. 一些Select检索高级用法(适用于mssql)
  13. 微服务学习之消费模块【Hoxton.SR1版】
  14. java 权重_java实现权重的简单算法
  15. 表白神器——Python画丘比特之箭穿心
  16. 解密微信小程序加密的微信运动数据(java)
  17. css3 搜索栏 圆角,CSS3 圆角
  18. python中库是什么意思,python中的库、包、模块和脚本是什么意思
  19. Eigen: C++开源矩阵计算库
  20. Win10系统电脑鼠标左键不灵敏、有延迟怎么办

热门文章

  1. python itertools_itertools
  2. Android中发现蓝牙设备的广播是,Android 蓝牙设备的查找和连接
  3. 将csv文件导入python_如何将csv文件导入数据数组?
  4. java 通用类型_Java获取通用类型的集合
  5. node mysql 模块 封装_node.js基于工厂方法的mysql模块封装
  6. mysql 安装导航_ubuntu下安装Mysql
  7. project facets中没有dynamic_C++强制类型转换操作符 dynamic_cast
  8. 学习vue3系列watch
  9. Understand源代码分析工具
  10. Proxmark3 Easy Gui 4.0 5.0 5.1加强版免费获取啦