一位朋友最近在学习JavaWeb开发,开始学习文件下载操作,他自己尝试着去网上看一些教程,总的来说也不是太了解,就让我和他说说,如何实现文件下载功能。我和他说了一下大致的思路,主要分为前端和后端两部分来实现文件下载操作。

后台Java代码实现思路:

.1.读取文件信息;

.2.设置返回数据的响应类型为(二进制)流类型;

常见的类型有application/json返回JSON格式的数据;text/html返回html文档数据;application/octet-stream表示返回二进制流数据,文件下载就使用该种方式。

.3.设置响应头信息;注意:文件名有中文需要单独编码;Content-Disposition表示客户端以何种方式来处理返回后台返回的数据,值为"attachment"表示作为附件下载;

.4.获取文件输入流和响应对象输出流 使用try()的语法不用手动关闭输入输出流;

.5.将输入流写入到响应输出流中;

.6.刷新缓冲区数据;

前端html实现思路:

.1.方式一:使用window.location.href=请求地址;

.2.方式二:使用 window.open(请求地址);

.3.方式三:动态创建一个a标签,然后设置a标签的href属性为请求地址,手动触发单击click()事件;

.4.方式四:直接写一个a标签,href属性设置为请求地址,点击即可。

前端页面实现起来比较简单,主要是发送一个请求到后台即可。

后端示例代码实现如下:

@WebServlet("/fileDownLoad")
public class FileDownLoadTest extends HttpServlet {
   @Override
   public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
       // 1.读取文件信息
       File file = new File("D:\\JavaWorkSpace\\course2024\\maven-demo\\src\\main\\webapp\\bg.png");
       String fileName = file.getName();
       // 2.设置返回数据的响应类型为(二进制)流类型
       response.setContentType("application/octet-stream");
       // 3.设置响应头信息 告诉浏览器以何种方式处理后台返回的数据;attachment 表示浏览器以下载的形式打开文件
       // 文件名有中文需要单独编码
       String encodedFilename = URLEncoder.encode(fileName, "UTF-8");
       response.setHeader("Content-Disposition", "inline;filename=" + encodedFilename);
       // 4.获取文件输入流和响应对象输出流 使用try()的语法不用手动关闭输入输出流
       // 使用添加了 Bufferd 的文件处理类 效率会更高一些
       try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
           BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); ){
           // 5.将输入流写入到响应输出流中
           int len;
           byte[] bytes = new byte[1024];
           while ((len = bis.read(bytes)) != -1) {
               bos.write(bytes, 0, len);
           }
           // 6.刷新缓冲区数据
           bos.flush();
       } catch (Exception e){
           e.printStackTrace();
       }

       System.out.println("文件下载完成!");
   }
}

前端示例代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<button onclick="downloadTest()">location-方式下载</button><br>

<button onclick="downloadTest2()">open-签方式下载</button><br>

<button onclick="downloadTest3()">a-签方式下载</button><br>

<a href="http://localhost:8080/maven-demo/fileDownLoad">a签方点击下载</a><br>

</body>

</html>

<script>

function downloadTest() {

window.location.href = "http://localhost:8080/maven-demo/fileDownLoad";

}

function downloadTest2() {

window.open("http://localhost:8080/maven-demo/fileDownLoad");

}

function downloadTest3() {

var a = document.createElement("a");

a.href = "http://localhost:8080/maven-demo/fileDownLoad";

a.click();

}

</script>

最终测试效果如下,

测试方式一:可以直接在浏览器中放入请求地址,然后点击回车键即可。

测试方式二:使用调试工具,比如apiFox;发送请求后,会将文件暂存在工具中,需要手动下载。

测试三:打开下载页面,点击任意一个下载链接,即可完成文件的下载。

至此:文件下载的功能全部完成。说明:Java代码中,在进行I/O流操作时,能使用带buffer缓冲区的类尽量使用,因为它的效率会高很多。性能相关可参考博客:

https://blog.csdn.net/qq_32099833/article/details/109002715

使用Servlet实现文件下载的更多相关文章

  1. Servlet处理文件下载的编码问题,乱码。

    Servlet处理文件下载的编码问题,乱码. //处理文件名乱码问题 // 获得请求头中的User-Agent String agent = request.getHeader("User- ...

  2. servlet实现文件下载所需步骤及说明

      servlet实现文件下载所需步骤及说明 CreateTime--2017年9月1日15:46:22 Author:Marydon 参考链接:http://blog.sina.com.cn/s/b ...

  3. Servlet 之文件下载

    Servlet 之文件下载 import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; impor ...

  4. 利用Tomcat内置的servlet实现文件下载功能

    起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ...

  5. JQuery调用Servlet实现文件下载

    jsp页面上的txt附件,点击后浏览器默认直接打开,结果是乱码. 因为用户上传的txt文件可能是ANSI.Unicode.UTF-8编码的任意一种,上传时后台获取文件内容重写一遍保证浏览器打开正常太过 ...

  6. Jetty + Servlet 实现文件下载

    Jetty非常适合做嵌入式web开发,正如Jetty的口号"Don’t deploy your application in Jetty, deploy Jetty in your appl ...

  7. servlet实现文件下载

     之前没怎么用过这个,这次项目中用到了,于是总结一下: 应该说主要注意三方面: 1.写一个servlet 2.在web.xml中配置这个servlet 3.页面上调用这个servlet   第一: 写 ...

  8. jsp使用servlet实现文件下载

    1.在index.jsp写入如下代码 <a href="demo2">下载</a> 2.在src中创建ServletDemo2类 public class ...

  9. Servlet (三) 文件下载(只支持英文文件名)

    package cn.sasa.serv; import java.io.FileInputStream; import java.io.IOException; import java.io.Inp ...

  10. 通过Servlet设置文件下载

    文件下载 1.获取要下载的文件的绝对路径 但是使用getServletContext().getRealPath()方法在不同的服务器上所获得的实现是不一样的 因为项目被打包入.war文件以后就失去了 ...

随机推荐

  1. 关于 javax.validation.constraints 的测试,以后用到的 会继续补充

    参见:https://www.cnblogs.com/xiaogangfan/p/5987659.html 1.@Size注解测试:

  2. 《ASP.NET Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(下)

    第 6 章 高级查询和日志 6.3 排序 RESTful API 在实现排序时应支持对集合资源的一个或多个属性进行排序 示例对 authors 资源按照其属性 Age 升序排序,再按 BirthPla ...

  3. Excel中文本型数字转换为数值型数字的方法

    背景 工作中经常遇到需要将Excel中的内容进行求和或者其他计算,但是由于格式为文本,无法进行计算和求和. 单元格的左上角都有绿色小三角,且用自动求和公式计算无法计算结果,显示为0,说明单元格格式为文 ...

  4. 51单片机(STC89C52)的中断和定时器

    STC89C51/STC89C52 Timer 内部不带振荡源, 必须外接晶振 采用11.0592MHz,或22.1184MHz,可方便得到串口通讯的标准时钟. STC89和STC90系列为12T, ...

  5. ORA-24247问题解决

    错误信息: scott@ORCL> select utl_http.request('www.baidu.com') from dual; select utl_http.request('ww ...

  6. ORACLE SEQUENCE 详解

    1.    About Sequences(关于序列) 序列是数据库对象一种.多个用户可以通过序列生成连续的数字以此来实现主键字段的自动.唯一增长,并且一个序列可为多列.多表同时使用. 序列消除了串行 ...

  7. powerdesigner自定义实体显示的属性

    我做概要设计的时候需要画实体的逻辑模型图,默认的时候是这样的: 但是我想只保留属性名,隐藏数据类型和下面的横线怎么办?效果如下: 按以下操作即可实现:

  8. 我的小程序之旅十:微信公众号token验证失败

    为了更好的运营公众号,微信官方支持用户自定义实现公众号功能,这里第一步就是配置服务器回调域名,如下图: 如果是SpringBoot项目,我们会写一个如下的Controller类 import lomb ...

  9. Taurus.MVC WebMVC 入门开发教程1:框架下载环境配置与运行

    前言: 之前有网友说 Mvc系列的教程对新手不友好,因此补充新手入门系列教程. 在开始使用 Taurus.Mvc 进行 Web应用开发之前,建议可以观摩一下之前的文章:WebAPI 系列教程 因为两者 ...

  10. 以二进制文件安装K8S之部署Node服务

    概述 在Node上需要部署Docker.kubelet.kube-proxy,在成功加入Kubernetes集群后,还需要部署CNI网络插件.DNS插件等管理组件. 本节以将192.168.3.138 ...