首页 > 其他分享 >使用Servlet实现文件下载

使用Servlet实现文件下载

时间:2024-03-17 12:55:05浏览次数:16  
标签:文件 http 响应 href new Servlet 下载

  一位朋友最近在学习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

标签:文件,http,响应,href,new,Servlet,下载
From: https://www.cnblogs.com/yilangcode/p/18078444

相关文章

  • 【docker】部署minio(分布式文件存储)
    确保Docker已安装:在终端检查Docker是否已安装,运行docker-v命令,如果显示Docker版本信息则说明已安装。拉取MinIO镜像:使用以下命令从DockerHub获取最新版的MinIO官方镜像:dockerpullminio/minio创建本地数据存储目录:在主机上创建一个目录用来存放MinIO的数据持......
  • IntelliJ IDEA 2023.3 最新发布啦!盘点精彩亮点(关注公众号‘精品应用分享’,输入'idea'
    IntelliJIDEA2023.3的发布标志着AIAssistant的持续发展,它现已超越技术预览阶段,并具有许多令人兴奋的改进。在其他领域,该版本包括对最新Java21功能的全面支持,引入了具有编辑操作的直观浮动工具栏,并添加了“运行到光标”嵌入选项以增强调试工作流程。IntelliJIDEAUltima......
  • FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码
    ​学习FFmpeg的时候,经常要到GitHub下载各种开源代码,比如FFmpeg的源码页面位于https://github.com/FFmpeg/FFmpeg。然而国内访问GitHub很不稳定,经常打不开该网站,比如在命令行执行下面的ping命令。pinggithub.com上面的ping结果如下所示,可见默认解析的DNS地址连接超时。正在......
  • #QT(事件--快捷键保存文件)
    1.IDE:QTCreator2.实验:QEvent,QMouseEvent,QKeyEvent。在上一个文本编辑器的基础上实现快捷键"ctrl+s"保存文件。3.记录(1)查看QEVENT的有效事件(2)所有时间均继承于QEvent,任意QObject对象都可以处理事件,而大多数类都继承于QObject。(3)事件分为两类:a.自动发生,定时器事件。......
  • 使用valgrind检查程序内存问题,并重定向到日志文件
    使用valgrind检查内存--tool=memcheck将日志输出到t13_memcheck.log2>&1是一个特殊的重定向,它会把标准错误(stderr,通常是错误消息)重定向到标准输出的当前位置,即t13_memcheck.log文件。valgrind--tool=memcheck./bin/thread_13>t13_memcheck.log2>&1使用valgri......
  • JAVA实现大文件分片上传断点续传
    直接上代码importorg.springframework.web.multipart.MultipartFile;importjava.util.concurrent.CompletableFuture;importorg.apache.commons.lang3.StringUtils;importlombok.extern.slf4j.Slf4j;importjava.text.DecimalFormat;importjava.io.*;@Slf4jpublic......
  • C++文件操作实战:创建、写入、读取、修改文件一应俱全
     概述:此C++示例详解文件操作:创建、删除、判断存在、写入、读取和修改文件内容。清晰演示了常见文件处理方法及源代码实现。以下是一个简单的C++实例,演示如何进行文件操作,包括创建文件、删除文件、判断文件是否存在、向文件写入内容、读取文件内容以及修改文件内容。#include......
  • 查看宝塔mysql二进制文件 mysqlbinlog
    mysqlbinlog执行文件位置/www/server/mysql/binmysql-bin二进制日志位置/www/server/data/#/www/server/data/mysql-bin.000060把二进制导出为.sql文件#建议/www/server/data/mysql-bin.000060文件cp到mysqlbinlog文件执行目录并设置权限为www755./mysqlbinlogmysql-......
  • 滴水逆向笔记系列-win32总结2-45.esp寻址_定位回调函数-46.子窗口_消息处理函数-47.资
    第四十五课win32esp寻址_定位回调函数自己vs编译的exe入口函数好像和课程视频哩的vc6不一样,没办法跟着视频走,可以用课件里给的作业exe勉强跟着视频学,前面的都差不多,课件下载地址:https://www.bcdaren.com/video/videoPlay/3303185150621818881.win32应用程序入口识别没加过壳......
  • Linux 运维工程师面试真题-2-Linux 命令及文件操作
    Linux运维工程师面试真题-2-Linux命令及文件操作1.在/tmp/目录下创建test.txt文件,内容为:Hello,World!,用一个命令写出来。2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。3.用vi命令编辑test.txt,如何跳转到末行,首行,行首、行末,如何在光标行下一......