手机端下载文件时显示0B问题

news2024/11/16 15:44:30

文章目录

  • 下载文件时显示文件大小
  • 如果是OutputStream输出流,如何设置大小
  • 扩展问题
    • pdfjs预览pdf文件时遇到的问题

下载文件时显示文件大小

设置下载文件的大小


        File file=new File("D:/test.txt");
        response.setHeader("Accept-Ranges","bytes");
        response.setHeader("Content-Length",file.length()+"");

完整小例子

 /**
     * 下载文件
     *
     * @param request
     * @param response
     * @throws IOException
     */
    @GetMapping("/downloadFile")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/octet-stream");
        File file = new File("D://test3//DGSetup_Home_KZ.exe");

        /**
         * 设置header头显示下载文件的大小
         */
        response.setHeader("Accept-Ranges", "bytes");
        response.setHeader("Content-Length", file.length() + "");

        String fileName = URLEncoder.encode("DGSetup_Home_KZ.exe", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        try {
            FileInputStream in = new FileInputStream(file);
            // 创建输出流
            OutputStream out = response.getOutputStream();
            // 创建缓冲区
            byte buffer[] = new byte[1024];
            int len = 0;
            // 循环将输入流中的内容读取到缓冲区当中
            while ((len = in.read(buffer)) > 0) {
                // 输出缓冲区的内容到浏览器,实现文件下载
                out.write(buffer, 0, len);
            }
            // 关闭文件输入流
            in.close();
            // 关闭输出流
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

可以看到下载时显示了文件的大小,在手机端同样也有同样作用,手机端确认下载前,会提示文件的大小。
在这里插入图片描述

如果是OutputStream输出流,如何设置大小

直接使用response.getOutputStream输出流进行输出时,是不能获取输出流或者输出文件的大小。
解决办法也有很多

  • 方法1(略) 将输出流写入临时文件,再File对象的length方法获取文件大小;缺点,需要使用到临时文件,存在频繁的磁盘操作
  • 方法2(如下示例) 不直接输出到response.getOutputStream,先利用ByteArrayOutputStream接收,再使用ByteArrayInputStream 读取,使用InputStream的available方法获取输出流的字节大小。然后再输出到response.getOutputStream
try {
            /**
             *直接将输出流输出到response.getOutputStream时,前端无法显示下载文件的大小,可以通创建ByteArrayOutputStream接收,
             * 再利用ByteArrayInputStream读取,再输出到response.getOutputStream流,这样可以支持显示文件的大小,但是不适合较大文件,
             * 因为数据流存储在内容中,经过一次转换才转发出去
             *
             */
            //PdfUtil.output(templateFile, dataMap, picMap, checkboxMap, response.getOutputStream());
            ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
            PdfUtil.output(templateFile, dataMap, picMap, checkboxMap, outputStream);
            ByteArrayInputStream in=new ByteArrayInputStream(outputStream.toByteArray());
            response.setHeader("Accept-Ranges", "bytes");
            response.setHeader("Content-Length", in.available() + "");
//            FileInputStream in = new FileInputStream(file);
            // 创建输出流
            OutputStream out = response.getOutputStream();
            // 创建缓冲区
            byte buffer[] = new byte[1024];
            int len = 0;
            // 循环将输入流中的内容读取到缓冲区当中
            while ((len = in.read(buffer)) > 0) {
                // 输出缓冲区的内容到浏览器,实现文件下载
                out.write(buffer, 0, len);
            }
            // 关闭文件输入流
            in.close();
            // 关闭输出流
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

扩展问题

pdfjs预览pdf文件时遇到的问题

使用pdfjs预览pdf文件时,不要返回文件大小,因为pdfjs会判断文件的长度,会发生控制台错误,文件大小不一致,所以建议在预览时不返回长度给前端,只有文件下载时返回文件的大小。

在这里插入图片描述

完整示例

 /**
     * 下载文件、预览文件
     *
     * @param request
     * @param response
     * @throws IOException
     */
    @GetMapping("/downloadFile")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/octet-stream");
        File file = new File("D://test3//abc.pdf");

        /**
         * 设置header头显示下载文件的大小
         */
        String showType=request.getParameter("showType"); //download 下载,preview下载
        if(showType.equals("download")){
            response.setHeader("Accept-Ranges", "bytes");
            response.setHeader("Content-Length", file.length() + "");
            String fileName = URLEncoder.encode("abc.pdf", "UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        }else{
            String fileName = URLEncoder.encode("abc.pdf", "UTF-8");
            response.setHeader("Content-Disposition", "inline;filename=" + fileName);
        }

        try {
            FileInputStream in = new FileInputStream(file);
            // 创建输出流
            OutputStream out = response.getOutputStream();
            // 创建缓冲区
            byte buffer[] = new byte[1024];
            int len = 0;
            // 循环将输入流中的内容读取到缓冲区当中
            while ((len = in.read(buffer)) > 0) {
                // 输出缓冲区的内容到浏览器,实现文件下载
                out.write(buffer, 0, len);
            }
            // 关闭文件输入流
            in.close();
            // 关闭输出流
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axios 封装

请注意以下文件夹: utils下的setToken.js 是token封装(封装 Token-CSDN博客),service.js 是axios封装。 Axios封装: 1.安装axios 在项目终端下 输入: npm install axios --save 2.在main.js全局引入axios import axios from axiosVue.prototype.$axios =axios //挂…

python psutil库之——获取网络信息(网络接口信息、网络配置信息、以太网接口、ip信息、ip地址信息)

文章目录 使用Python psutil库获取网络信息安装psutil库获取网络连接信息查看所有网络连接过滤特定状态的连接 获取网络接口信息获取网络IO统计信息实例1实例2 总结 使用Python psutil库获取网络信息 Python的psutil库是一个跨平台库,能够方便地获取系统使用情况和…

C200/10/1/1/1/00 VPM04D300000 VDM01U30AL00

C200/10/1/1/1/00 VPM04D300000 VDM01U30AL00 受其客户对集成、远程和日益自主的运营的关注,横河于2022年6月6日推出了OpreX Asset Health Insights,以使资产数据更加可见、集成和可操作。 Asset Health Insights的原始版本支持Amazon Web Services和…

县域农牧业信息化项目建设技术解决方案(完整版本)

扫码关注下方公众号,免费获取项目建设方案!↓↓↓ 文章目录 一、项目背景二、项目建设意义及目标三、建设内容(1)XX智慧养殖管理 SaaS 云平台(2)XX智慧养殖管理平台(3)XX投入品质量…

一款基于javafx的自有IP地址查询工具

SelfIPAdressQuery 使用场景 在攻防演习中、hvv防守方人员会封禁大量IP地址,人员疏忽会导致自有地址被封禁,可以使用此工具进行批量筛选自有地址. IP地址归属批量查询. 功能介绍 通过IP地址查询数据库中符合的自有IP地址或自有IP段,不存在的IP地址通过离线模式或联网模式查…

进阶JAVA篇-深入了解枚举与抽象枚举

目录 介绍一下枚举: 1.1枚举的概念 1.2具体如何来使用呢? 1.3对枚举小结 1.4抽象枚举概念 1.5对抽象枚举小结 介绍一下枚举: 1.1枚举的概念 在JAVA中,枚举是一种特殊的类,用于定义一组常量。Java中的枚举类型是通过使用…

spring IOC AOP核心思想

我的理解:一开始各个对象之间相互合作,是多个对象对应多个对象去使用,如果有一个对象出现问题就可能影响到全局,但是使用ioc就是在两者之间加入了一个中间媒介(spring bean也就是通过xml配置文件装配对象),如果相互需要…

pytorch中nn.DataParallel多次使用

pytorch中nn.DataParallel多次使用 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader# 定义模型 class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc nn.Linear(10, 1)def forwa…

Filebeat、metricbeat、kafka

kibana机子上安装filebrat(因为有nginx) 上传filebrat包 在es概览查看 上传metricbeat 排错 tailf !$ Kibana-Vlsualize查看 kafka(卡夫卡) kafka是一个分布式的消息发布—订阅系统(kafka其实是消息队列)消息队列中间件 Kafka的…

二十、SpringCloud Alibaba Seata处理分布式事务

目录 一、分布式事务问题1、分布式之前2、分布式之后 二、Seata简介1、Seata是什么?2、Seata能干嘛?3、去拿下?4、怎么玩 三、Seata-server安装四、订单、库存、账户业务数据库准备五、订单、库存、账户业务微服务准备六、Seata原理介绍 一、…

查杀Linux服务器病毒进程并对Linux中的文件描述符FD进行简单探索

一直以来,我都十分推崇把看到的理论知识与实际相结合。 在今天查杀服务器病毒程序的过程中,顺便挖掘了一些新的知识,现在把他总结成一篇文章记录一下。 每一个进程都有一个文件描述符表(通过lsof -p 进程号),文件描述表是操作系统…

web基础以及http协议

web基础,http协议 域名:www.88886.co DNS解析 静态页面 动态页面 DNS域名: 网络上的通信都是基于IP通信模式:TCP/IP TCP建立连接和断开连接,都是要双方进行确认的 建立连接:三次握手 断开连接&#x…

.net mvc 无法创建虚拟目录和无法启动IIS Express Web服务器指定的url无效 解决方法

.net mvc 无法创建虚拟目录 修改项目配置中web中的项目url时,提示无法创建虚拟目录,则把ip地址改为localhost再进行创建即可 无法启动IIS Express Web服务器指定的url无效 解决方法 不要勾选【覆盖应用程序根URL(U)】,或让【覆盖…

js中进行数字,超大金额(千位符)格式化处理

前言 最近遇到一个需求,对于社区里讨论的帖子展示一个访问量的计数显示问题,当超过多少页面访问量时,就让其显示xxx万,xx亿 对于后台返回该字段的数据类型是number,需要进行格式化数字的输出 这个应用场景在前端开发中其实很普遍,例如:音乐app里面音乐歌曲播放数量,微博里的…

Unity中Shader的Lambert光照的实现

文章目录 前言一、分别获取Lambert光照模型的每个参数Lambert光照模型公式1、使用 Unity 封装的参数 unity_AmbientSky 获取环境光色2、在属性面板定义一个float类型参数作为光照系数3、获取主平行光的颜色4、获取世界空间下的顶点法向量5、获取反射点指向光源的向量6、使用Lam…

C++day04(类中特殊成员函数、匿名对象、友元、常成员函数和常对象、运算符重载)

1> 思维导图 2> 整理代码 代码&#xff1a; 算术运算符重载&#xff1a; #include <iostream>using namespace std; class Person {//全局函数实现运算符重载需要权限friend const Person operator(const Person L,const Person R); private:int a;int b; publi…

基于Springboot实现点餐平台网站管理系统项目【项目源码+论文说明】分享

基于Springboot实现点餐平台网站管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多商家的之中&#xff0c;随之就产生了“点餐平台网站”&#xff0c;这样就让点餐平台网站更加方便简单。 对于本…

泛函的含义,泛函分析

经常有同事和朋友讨论泛函分析是做什么的&#xff0c;所以做个小log 1. 泛函的含义 泛函的含义&#xff0c;笼统说&#xff0c;泛函是符合某种性质的任意函数&#xff1b;因为是任意的&#xff0c;所以就是泛泛的&#xff1b;但也没有不着边际的泛。 2. 泛函的例子 2.1 符合半…

uniapp+vue3+ts+uview-plus搭建项目步骤

创建项目 使用Vue3/Vite版&#xff0c;创建以 typescript 开发的工程 下载仓库 DCloud/uni-preset-vue - Gitee.com node版本&#xff1a;v16.18.0 npm版本&#xff1a; v8.19.2 依赖下载 解压之后&#xff0c;在vscode打开 通过终端运行 npm 命令下载依赖&#xff1a;npm ins…

1. Windows平台下如何编译C++版本的Redis库hiredis

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remove及取交集并…