使用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
使用Servlet实现文件下载的更多相关文章
- Servlet处理文件下载的编码问题,乱码。
Servlet处理文件下载的编码问题,乱码. //处理文件名乱码问题 // 获得请求头中的User-Agent String agent = request.getHeader("User- ...
- servlet实现文件下载所需步骤及说明
servlet实现文件下载所需步骤及说明 CreateTime--2017年9月1日15:46:22 Author:Marydon 参考链接:http://blog.sina.com.cn/s/b ...
- Servlet 之文件下载
Servlet 之文件下载 import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; impor ...
- 利用Tomcat内置的servlet实现文件下载功能
起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ...
- JQuery调用Servlet实现文件下载
jsp页面上的txt附件,点击后浏览器默认直接打开,结果是乱码. 因为用户上传的txt文件可能是ANSI.Unicode.UTF-8编码的任意一种,上传时后台获取文件内容重写一遍保证浏览器打开正常太过 ...
- Jetty + Servlet 实现文件下载
Jetty非常适合做嵌入式web开发,正如Jetty的口号"Don’t deploy your application in Jetty, deploy Jetty in your appl ...
- servlet实现文件下载
之前没怎么用过这个,这次项目中用到了,于是总结一下: 应该说主要注意三方面: 1.写一个servlet 2.在web.xml中配置这个servlet 3.页面上调用这个servlet 第一: 写 ...
- jsp使用servlet实现文件下载
1.在index.jsp写入如下代码 <a href="demo2">下载</a> 2.在src中创建ServletDemo2类 public class ...
- Servlet (三) 文件下载(只支持英文文件名)
package cn.sasa.serv; import java.io.FileInputStream; import java.io.IOException; import java.io.Inp ...
- 通过Servlet设置文件下载
文件下载 1.获取要下载的文件的绝对路径 但是使用getServletContext().getRealPath()方法在不同的服务器上所获得的实现是不一样的 因为项目被打包入.war文件以后就失去了 ...
随机推荐
- 打开PDB报错ORA-30013
多租户架构,之前还在做运维的时期接触也不多.遇到多租户问题,第一反应是有些发虚的. 但实际很多问题很简单,也容易解决.本文就是一个例子. 问题:RAC节点2打开所有PDB时,报错ORA-30013. ...
- macOS 远程桌面windows方法
1.利用微软官方的软件:https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/ ...
- ASCII、Unicode、UTF8 10年后,史无前例,自己用js实现《专题3》
我自己史无前例的开发了一个网页小工具,可以利用这个工具 直接查询到 一个字符的unicode二进制的定义,和utf8格式下内存中 存储的二进制. =========================== ...
- .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(下)
34 | MediatR:轻松实现命令查询职责分离模式(CQRS) 实际上我们在定义我的查询的时候,也可以这样定义,例如我们定义一个 MyOrderQuery,把订单的所有名称都输出出去 namesp ...
- Kubernetes 漫游:Controller Manager
Controller Manager Controller Manager 是控制平面的一个重要组件,负责维护 Kubernetes 集群的整体状态. 流程: 在集群中 Controller Mana ...
- 如何做好一个基础的搜索功能?记一个因客户大数据量而导致的后发先至Bug
壹 ❀ 引 上篇文章算是开了一个新系列,因为工作缘故,我基本每天都在跟各式各样的bug打交道.其实站在一个开发的角度,我想每个人应该都更喜欢创造新代码,创造新bug,而不是每天都泡在茫茫代码海洋中定位 ...
- MySQL的随机排序(random orderby)
MySQL的随机排序(random orderby)是指在查询数据库时,将结果集以随机的方式排列.这种排序方式可以用于有趣的应用场景,例如实现随机音乐播放.广告推荐等. 要实现MySQL的随机排序,可 ...
- .NET高级调试之sos命令输出看不懂怎么办
一:背景 1. 讲故事 很多.NET开发者在学习高级调试的时候,使用sos的命令输出会发现这里也看不懂那里也看不懂,比如截图中的这位朋友. .NET高级调试属于一个偏冷门的领域,国内可观测的资料比较少 ...
- 【转载】nltk英文自定义分词
NLTK项目地址: https://github.com/nltk/nltk_data/tree/gh-pages/packages NLTK基础分词用例: https://www.cnblogs.c ...
- DataGear数据可视化分析平台介绍
DataGear 是一款开源免费的数据可视化分析平台,自由制作任何您想要的数据看板,支持接入SQL.CSV.Excel.HTTP接口.JSON等多种数据源. 系统特点: 友好的数据源接入 支持运行时接 ...