java浏览器文件下载实例(附源码下载地址)

Android浏览器下载APK变BIN文件?3步修复+安装教程(附源码分析) 本文深入解析Android浏览器下载APK文件时后缀自动变为BIN的问题,提供从源码分析到实际修复的完整方案。涵盖MIME类型识别错误、URL解析算法缺陷等核心问题,并给出系统级修改、浏览器补丁及非Root用户解决方案,帮助开发者彻底解决这一常见问题。 阅读详情
   最近开始学习java,尝试实现浏览器文件下载,使用IDEA15构建了Springboot maven工程。根据网上的资料做了比较多的尝试,也遇到了
许多问题,在此记录总结一下。由于是本地局域网的测试,所以代码中的文件的源目录都是直接写死的本地目录。

方式一:

 @RequestMapping("mydownload")
    public ResponseEntity<Object> download(HttpServletResponse response) throws IOException {
        String path = "D:\\111.ts";
        File file = new File(path);
        long size = file.length();
        //为了解决中文名称乱码问题 这里是设置文件下载后的名称
        String fileName = new String("000.ts".getBytes("UTF-8"), "iso-8859-1");
        response.reset();
        response.setHeader("Accept-Ranges", "bytes");
        //设置文件下载是以附件的形式下载
        response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
        response.addHeader("Content-Length", String.valueOf(size));

        ServletOutputStream sos = response.getOutputStream();
        FileInputStream in = new FileInputStream(file);
        BufferedOutputStream outputStream = new BufferedOutputStream(sos);
        byte[] b = new byte[1024];
        int i = 0;
        while ((i = in.read(b)) > 0) {
            outputStream.write(b, 0, i);
        }
        outputStream.flush();
        sos.close();
        outputStream.close();
        in.close();
        return new ResponseEntity<Object>(HttpStatus.OK);
    }

方式二:

    //文件下载相关代码  与上面的方法类似
    @RequestMapping("/download")
    public String downloadFile(HttpServletRequest request, HttpServletResponse response) {
        String fileName = "111.mov";
        if (fileName != null) {
            //当前是从该工程的WEB-INF//File//下获取文件(该目录可以在下面一行代码配置)
            String realPath = request.getServletContext().getRealPath(
                    "WEB-INF/File/");
            File file = new File(realPath, fileName);
            if (file.exists()) {
                // 设置强制下载不打开
                response.setContentType("application/force-download");
                // 设置文件名
                response.addHeader("Content-Disposition",
                        "attachment;fileName=" + fileName);
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                    System.out.println("success");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        return null;
    }

方式三(在方式一的基础上加了下载进度和下载速度的简单实现):

@Component
    @Scope("prototype")
    @RequestMapping("/downloadFile")
    public class DownloadActionc {
        @RequestMapping("downloadFiletest")
        public ResponseEntity<Object> download(HttpServletResponse response) throws IOException {
            String path = "D:\\abc.ts";
            File file = new File(path);
            String fileName = new String("test.ts".getBytes("UTF-8"), "iso-8859-1");
            long fileTotalsize = file.length();
            System.out.println("fileTotalsize = " + fileTotalsize);
            response.reset();
            response.setHeader("Accept-Ranges", "bytes");
            response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
            response.addHeader("Content-Length", String.valueOf(fileTotalsize));
            ServletOutputStream sos = response.getOutputStream();
            FileInputStream in = new FileInputStream(file);
            BufferedOutputStream outputStream = new BufferedOutputStream(sos);
            byte[] b = new byte[1024 * 2];//每次传输2K
            long filecomplateSize = 0L;
            double rateSpeed = 0;//速度
            long rateProcess = 0L;//进度
            int readSize = 0;
            int i = 0;
            int nbytes = 0;
            long startTime = System.nanoTime();
            //这里是下载进度和速度的简单实现 没有使用单独的线程进行速度计算
            while ((readSize = in.read(b)) > 0) {
                if (i % 20 == 0) {
                    startTime = System.nanoTime();
                }
                filecomplateSize = filecomplateSize + readSize;
                outputStream.write(b, 0, readSize);
                nbytes = readSize + nbytes;
                if (i % 20 == 19) {
                    rateProcess = filecomplateSize / fileTotalsize;
                    //时间差  System.nanoTime()的返回值精确度是毫微秒
                    double currentTime = (System.nanoTime() - startTime);
                    //将速度转化成比较通用的MB/S
                    rateSpeed = ((nbytes / currentTime) * 1000 * 1000 * 1000) / 1024 / 1024;
                    String strrateSpeed = String.format("%.2f", rateSpeed);
                    rateSpeed = Double.valueOf(strrateSpeed);
                    System.out.println(rateSpeed);
                    System.out.println(rateSpeed);
                    nbytes = 0;
                }
                i++;
            }
            outputStream.flush();
            outputStream.close();
            sos.close();
            in.close();
            return new ResponseEntity<Object>(HttpStatus.OK);
        }
     在做下载的测试学习中了解到,浏览器的下载的目标路径程序中是不能修改的,这是浏览器自己的安全机制,所以浏览器的文件下载
是下载到浏览器中设置的默认的下载路径中。

本人是Java开发的小白,若有问题请各位大神及时指正指教。

项目下载地址(仅作为参考或者测试):http://download.youkuaiyun.com/detail/coding13/9801171

Java Minio预签名URL实战:解决下载文件中文名乱码问题(附源码修改指南) 本文深入探讨了Java Minio预签名URL在文件下载时遇到的中文名乱码问题,并提供了从问题根源分析到源码改造的完整实战指南。通过修改Minio服务端源码,使其支持通过`filename`查询参数自定义下载文件名,完美解决乱码问题,同时兼顾了预签名URL的安全性与高性能优势。 阅读详情

相关推荐

JAVA实现2048小游戏(附源码)

JAVA实现2048小游戏(附源码),2048小游戏源码,窗体应用程序2048小游戏源码,界面风格干净整洁,内容条理清晰,小游戏分为三个等级,4*4格子到6*6格子,格子越多越简单,格子越小越容易到最后无路可走,凑成2048即为成功,无路可走即为失败。这个源码让你快速搭建自己的应用程序,注释完整,代码规范,各种风格都有,代码上手简单,代码独立,可以直接用程序打开,运行Main使用。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 1937

如何用Java实现浏览器文件下载功能

通过了解ServletContext来简单实现浏览器对服务器资源的访问。

雷东宸的博客 1万+

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记-----GCN在交通领域的应用(二) 一、论文翻译: 1、摘要: 及时准确地交通预测对于城市交通控制和指导具有至关重要的意义。由于交通流量的非线性和复杂性,传统的方法不能满足中长期预测任务的需求,并且往往会忽略时空数据的时间和空间依赖特性。在这篇论文中,为了处理在交通领域的时间序列预测问题...

cy_believ的博客 1916

Java实现以浏览器的方式下载文件

Java实现以浏览器的方式下载文件

道小生的博客 3944

Nest的限流方案

多维度限流(如 IP、用户 ID、接口级别、请求类型)可配置化(支持不同环境和接口动态配置)可观测性(接入日志、监控系统)高性能和分布式支持(Redis 限流器)与鉴权鉴权链路集成(结合 JWT、API Token)以下是一个“标准// 优先按用户ID限流,否则按IP在main.ts维度建议限流存储推荐 Redis 支持多实例限流 Key 设计支持 IP + 用户ID + 路由等多种维度限流策略精细化配置,接口粒度调整异常处理自定义响应体、日志告警观测性。

Bruce__taotao的博客 1196

保姆级教程:用再生龙Clonezilla Live给Ubuntu系统做全盘备份与恢复(含BIOS设置避坑)

本文提供了一份详细的Clonezilla Live教程,指导Ubuntu用户如何轻松完成全盘备份与恢复。从启动盘制作、BIOS设置避坑到备份参数解析和恢复操作,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效保护系统数据。

weixin_42116058的博客 642

java实现文件下载功能

文件下载功能已经成为现代Web应用程序不可或缺的一部分

Java小菜鸟 1万+

[语义分割]SPP、空洞卷积与ASPP总结

ASPP全称:Atrous Spatial Pyramid Pooling,中文可以理解为空洞空间卷积池化金字塔或者多孔空间金字塔池化。在这其中,要理解两个概念:一个是SPP,池化金字塔结构或者叫空间金字塔池化层,都是一个东西;另一个是Atrous,空洞卷积,两个加在一起就是ASPP。 首先说一下SPP:Spatial Pyramid Pooling。这个结构出自于论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Re

lipengfei0427的博客 2万+

Java使用流实现浏览器自动下载文件(附前端请求代码)

因为js的ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以不能够使用相应的ajax函数进行文件下载。但可以用form提交参数,并返回“流”类型的数据。

m0_67391120的博客 934

NeuralKG的安装及简单demo使用(浙江大学开源知识图谱表示学习工具)

记录NeuralKG的安装和使用,以及解决windows系统下的运行demo.py出现的问题。

m0_46621271的博客 1399

详解AUTOSAR:DaVinci Configurator配置CAN和UART数据协议解析器(RH850)(实战篇—1)

通过学习本篇博文项目,将会把所学的DaVinci Configurator知识系统串联起来。

不脱发的程序猿 2811

Java Web实现文件下载的几种方式

而第二种在Struts中用Servlet实现文件下载也是最原始的方式,只不过我们是在Struts的Action中进行操作,不用去创建Servlet。但这种方式的缺陷也是很明显的,目录信息被获取,不利于信息安全。通过Struts封装的方式实现文件下载,我们需要在Struts配置文件中进行Response HTTP头等信息的设置,以及建立对应的Action。文件下载可以说是网站的基础功能,要实现最下载功能,有一种最基本的方法,那就是将超链接的href属性指向对应的资源文件。因此就有了下面的几种下载方式。

weixin_45525177的博客 2727

SAP特殊库存全解析:供应商寄售、客户寄售、分包与项目库存说明

客户寄售库存(Customer Consignment)是企业将物料存放于客户处,客户实际领用后才确认销售收入。这种模式能缩短交货周期、提高客户满意度,但需严格跟踪寄售库存的数量与状态。

我小时候很黑的博客 822

java ssh 源码下载_java ssh入门小实例源码下载

java ssh入门小实例源码下载java2020-7-17下载地址https://www.codedown123.com/30354.htmljava ssh入门小实例源码下载资源下载此资源下载价格为3D币,请先登录资源文件列表ssh/.classpath,529ssh/.mymetadata,282ssh/.project,1746ssh/.settings/.jsdtscope...

weixin_35196909的博客 1243

微信公众号 - 最新详细实现H5网页接入微信支付功能,开发移动端、PC端网站集成使用微信支付流程及示例代码,公众号网页利用JS-SDK/JSAPI/H5支付授权唤起微信支付,可脱离微信环境支付或内置浏

微信公众号,微信支付,网页,移动端,h5,扫码支付,二维码付款,手机网页,电脑pc网页生成支付二维码,js-sdk,jsapi,外部浏览器调起微信支付,脱离微信环境,在微信内置浏览器如何进行微信支付,前端H5微信支付,web网站,vue2,vue3,nuxt2,nuxt3,jquery,微信公众号h5支付流程,如何实现,怎么做,回调报错,redirect_uri参数错误,必须部署才能调试吗,怎么不打包发布就能在本机测试,微信H5支付能力,uniapp微信支付,h5页面调起支付,支付没反应,无效,失败,H5页

🏆 前端领域优质创作者 6103

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Java 实现文件下载】vue前端+java后端实现文件下载详解(附源码)

java文件下载,文件下载中文名乱码,前后端实现文件下载,excel文件下载,vue下载文件,vue+java实现文件下载

赏樱看雪撸代码 5645

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA实现浏览器端大文件分片上传实例

需求:大文件上传,批量上传,断点续传,文件夹上传,大文件下载,批量下载,断点下载,文件夹下载文件夹:上传下载需要支持层级结构,采用非压缩方式文件大小:100G前端:vue2,vue3,vue-cli,jquery,html,webuploader后端:JSP,springbootweb服务:tomcat数据库:mysql,oracle,达梦,国产化数据库服务器:linux,信创国产化浏览器:ie8+,firefox,chrome,360,2345,QQ,搜狗,猎豹。

weixin_52041354的博客 675

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

编程实例源码文件下载,零基础轻松学编程中文编程开发工具教程

​ 编程实例源码文件下载,零基础轻松学编程中文编程开发工具教程 一、编程实例源码文件 源码文件下载方法,可以点击最下方官网卡片进入后,路径为 :软件下载——常用工具下载——编程工具免费版下载及实例源码下载 1、密码验证登录配置文件实例编程源码 2、知识库管理软件编程实例源码 3、字符串截取编程源码

编程实战 1106

Java实现文件管理系统(附源码)

文件管理越来越受到企业的重视,最近自己也做了个简单的文件管理系统,现与大家分析交流。 一.系统演示

踮脚敲代码 2万+

java调用海康人脸识别比对demo(附demo源码下载)

之前已经写了个简单的,但是觉得可能有些人第一次使用会遇到大麻烦,所以写完整一点。 首先要明白 我们用JAVA代码去操控硬件是有两条路线走的, 第一条:联网方式,根据硬件厂家提供的SDK进行初始化、输入账号、密码进行连接。 第二条:用设备直接连接,如USB,这个就需要用到串口COMM编程了。 刚好两个我都在公司的项目上遇到过,所以就稍微懂了一点,但是仅仅是入门使用而已。 好了,接下来我们就开始回到题...

qiaodaima0的博客 1万+

编程实例源代码,知识库管理软件源码文件下载及代码说明

知识库管理软件是一款图片集查询软件,软件可以使用中文编程工具免费自由版开发完成。编程工具下载及源码文件下载路径编程入门视频教程链接编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。如上图1、点击第1列菜单,第1列相应文字标题变色,同时第2列菜单显示相应的名称,相应的标题变色最右侧页数跟着变化如上图1、当点击第1列按钮,编程代码如图如上图1、当点击下一页按钮的时候,编程代码如图如上图1、该软件所使用的构件如图。

编程实战 1278

Java随机生成Mac地址(GitHub源码下载)

生成随机 Mac 地址 这段时间做项目,涉及到虚拟机 Mac 地址生成,网上找了一些 Java 随机生成 Mac 地址的代码,大多都是从 {‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘e’, ‘d’, ‘f’} 随机取一位拼成 Mac 地址字符串,实际上这种方式不符合 Mac 地址定义,下面将给出我随机生成 ...

zhangmiaoping23的专栏 1014

Windows下IE浏览器文件下载

Windows下IE浏览器文件下载 微软系浏览器的内核特立独行,下载文件的文件名编码格式不同于其他浏览器,经常会造成乱码的问题。通过HttpServletRequest获取到对应的User-Agent来判断浏览器的类型。如下为chrome浏览器在MacOS下的User-Agent。 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.414

leekari 2373

Java爬虫-爬取页面源码并下载页面的指定格式文件

一、客户需求 获取页面音频资料和字幕文件,格式分别为MP3和lrc. 页面地址为: https://www.51voa.com/VOA_Special_English/researchers-call-for-a-use-tax-to-clean-up-space-84650.html 二、分析页面源码 页面的部分源码如下: 分析结果: href=”xxx.mp3”和href=”xxx.lrc”这两个是我们可以用到的数据,是对应格式文件的下载...

小花生编程 1550

谷歌浏览器下载文件提示无法安全地下载怎么解决?

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。干货主要有:①1000+CTF历届题库(主流和经典的应该都有了)②CTF技术文档(最全中文版)③项目源码(四五十个有趣且经典的练手项目及源码)

m0_61869253的博客 992

如何用JAVA代码实现上传文件和下载文件

需求:大文件上传,批量上传,断点续传,文件夹上传,大文件下载,批量下载,断点下载,文件夹下载文件夹:上传下载需要支持层级结构,采用非压缩方式文件大小:100G前端:vue2,vue3,vue-cli,jquery,html,webuploader后端:JSP,springbootweb服务:tomcat数据库:mysql,oracle,达梦,国产化数据库服务器:linux,信创国产化浏览器:ie8+,firefox,chrome,360,2345,QQ,搜狗,猎豹。

weixin_52050572的博客 2540
上一篇: HttpServletRequest获取各种路径的总结
下一篇: GetLastError 返回值大全
Coding13
博客等级 码龄10年 53粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值