文件下载(Java实现)

  1. 页面显示超链接
  2. 点击超链接后,弹出下载框
  3. 完成图片文件下载

一、分析:

  1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,若不能,则默认下载。不满足需求
  2. 任何资源都必须弹出下载提示框
  3. 使用响应头设置资源的打开方式
content-disposition:attachment;filname=xxx

二、步骤:

1. 定义页面,编辑超链接的href属性,指向servlet

downloads.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Downloads</title>
</head>
<body>
<a href="/ResponseDemo/image/a.jpg">图片</a>
<hr>
<!--?后面跟的是参数, 将在Servlet中获取-->
<a href="/ResponseDemo/downloadServlet?filename=a.jpg">下载图片</a>
</body>
</html>
2. 编写Servlet
分析:
1. 获取页面传过来的参数
String filename = req.getParameter("filename");
2. 使用字节输入流将文件加载进内存
(1). 找到该文件的服务器路径
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/image/"+filename);
(2). 用字节流关联
FileInputStream fis = new FileInputStream(realPath);
(3). 设置response 的响应头
  1. 获取文件的mime类型
String mimeType = context.getMimeType(filename);
resp.setHeader("content-type",mimeType);
  1. 设置响应头类型 content-Type
 resp.setHeader("content-type",mimeType);
  1. 设置响应头打开方式 content-disposition
resp.setHeader("content-disposition","attachment;filename="+filename);
(4). 将输入流的文件写出到输出流
 ServletOutputStream sos = resp.getOutputStream();byte[] buff= new byte[1024*8];int len = 0;while ((len = fis.read(buff))!=-1){sos.write(buff,0,len);}
(5). 关闭输入流
 fis.close();
  • 注:输出流是req对象提供的,因此不用关闭

(二)、完整的Servlet代码:

DownloadServlet.java

package glut.zongmin.download;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取请求参数,文件名称String filename = req.getParameter("filename");//2. 使用字节输入流将文件加载进内存//2.1 找到文件的服务器路径ServletContext context = this.getServletContext();String realPath = context.getRealPath("/image/"+filename);//2.2 用字节流关联FileInputStream fis = new FileInputStream(realPath);//3. 设置response 的响应头//3.1 设置响应头类型  content-Type//获取文件的mime类型String mimeType = context.getMimeType(filename);resp.setHeader("content-type",mimeType);//3.2 设置响应头打开方式 content-dispositionresp.setHeader("content-disposition","attachment;filename="+filename);//4. 将输入流的文件写出到输出流中,字节流不用刷新ServletOutputStream sos = resp.getOutputStream();byte[] buff= new byte[1024*8];int len = 0;while ((len = fis.read(buff))!=-1){sos.write(buff,0,len);}fis.close();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}
}

三、运行结果


点击图片(普通超链接):

点击下载图片

  • 注:谷歌浏览器会跳过确认直接下载

文件下载(JavaWeb)相关推荐

  1. java webapp下文件下载,JavaWeb文件下载

    java 文件下载 在此之前需要先简绍一下常见的MIME类型,以供之后使使用: 内容类型 文件扩展名 描述 application/msword doc Microsoft Word applicat ...

  2. Response文件下载

    Response文件下载 javaweb 里的知识 觉得这个是学到啦 所以记录下来 方便下一次查看 简易代码 package com.hui.servlet;import javax.servlet. ...

  3. 继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

    通过动态分配地址来提升javaweb文件下载接口的其兼容性和可扩展性: (上篇博文地址:https://blog.csdn.net/weixin_37766296/article/details/80 ...

  4. JavaWeb实现文件下载

    一.前言 我们这里要说的文件下载是包括word文档.Excel表格.PPT.image图片的下载,因为我们是基于JavaWeb实现的,所以web前端的界面是在JSP中实现的,而后台的响应是通过Serv ...

  5. javaweb开发之处理表单上传文件和文件下载

    2019独角兽企业重金招聘Python工程师标准>>> 一.基于表单的上传文件 1. enctype属性 当表单需要上传文件时,需指定表单 enctype 的值为 multipart ...

  6. javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

      程序员在做web等项目的时候,往往都需要添加文件上传.下载.删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会 ...

  7. IT兄弟连 JavaWeb教程 文件下载技术

    ●  列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...

  8. javaweb实现文件下载用ajax请求,浏览器无响应的问题

    最近做公司项目要实现用户通过浏览器从服务端下载文件的功能.于是,我写好了后台,然后前端用JQuery的ajax()方法发送请求到后台,按道理说是没有问题的,包括相应头的设置都没问题,但是点击下载按钮过 ...

  9. JavaWeb - Servlet实现文件下载漂亮小姐姐视频(文末有小姐姐视频Gif图哦)

    文件下载案例: * 文件下载需求:1. 页面显示超链接2. 点击超链接后弹出下载提示框3. 完成图片文件下载* 分析:1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出 ...

最新文章

  1. 瑞文标准推理测试软件,瑞文标准推理测验标准答案表
  2. [gic]-ARM gicv3/gicv4的详细介绍-2020/12
  3. angularjs html 缓存,如何删除使用AngularJS的HTML中的浏览器缓存?
  4. html 正则表达式验证金额,js金额校验,js正则表达式,包含正负,小数点后两位...
  5. 冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱
  6. mysql sphfiks_使用sphinx索引mysql数据
  7. java8 bigdecimal_在java 8中并行使用BigDecimal进行分组和求和
  8. 图灵机器人和ichat
  9. 计算机coreldraw课程PPT,[计算机]CorelDRAW_12基础教程.ppt
  10. JSON转对象、List
  11. trados 有道api_塔多思翻译附插件下载-外语准确机翻工具插件(TRADOS)下载2019版-西西软件下载...
  12. 由火车上的查票事件所引起的思考
  13. 带遮挡效果的轮廓线(描边)在3D实时渲染中的一种实现
  14. 一步步认识jdk 我们的朋友 之Arrays
  15. r720服务器怎么查看硬盘性能,r720服务器如何看配置
  16. RocketMQ-Retry
  17. 【控制】自适应控制,模型参考自适应控制,公式推导,有程序有结果图
  18. 8-16位密码,英文大小写,数字,特殊字符_~@#$^至少包含3种,且不能4位连续重复或者串联(aaaa,1234,abcd,fedc···)
  19. 解决实际维护网络过程故障的五个盲点
  20. 解决Unity3D中多层级结构子物体旋转受父物体尺寸影响的问题

热门文章

  1. jquery grid设置行背景色
  2. Neo4j 使用场景
  3. java区块链_JAVA区块链项目实战
  4. php判断是否safari,js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本_javascript技巧...
  5. 黑客窃取 4 亿 Twitter 用户记录,勒索马斯克破财消灾
  6. Vue中计算属性和axios基本使用回顾
  7. Python 编写shell脚本
  8. 监控用户鼠标点击、停留行为,美国棒约翰披萨被顾客起诉赔偿
  9. 海外华人代购系统、代购源码PHP前端源码参数说明
  10. 【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」