问题

想要实现一个点击下载文件的功能,但当文件是txt,png之类的能被浏览器直接打开的文件,浏览器就会自动打开而不会执行下载

原因

首先要知道的是 媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )的概念,它表示传递的数据类型(图像/文本/音频等等)

浏览器通过请求头Content-Type中的MIME类型(如 image/jpeg application/pdf)识别数据类型,对相应的数据做出相应处理,而对于图像文本等浏览器可以直接打开的文件,默认处理方式就是打开

两种解决办法

方法一 后台设置响应头

Content-Disposition: attachment; filename="filename.jpg"

Content-Disposition 该响应头表示请求返回的内容该以何种形式展现

第一个参数默认值为 inline 表示回复中的消息体会以页面的一部分或者整个页面的形式展示;attachment 意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框

第二个参数filename 为可选参数,为保存框中预填的文件名

后端设置好后前端直接通过 a标签访问即可

方法二 通过字节流的形式在前端生成文件

// 这里写成一个点击事件的处理函数

const handleDownload = (e, url) => {

e.preventDefault();

e.stopPropagation();

fetch(url).then((res) => {

res.blob().then((blob) => {

const blobUrl = window.URL.createObjectURL(blob);

// 这里的文件名根据实际情况从响应头或者url里获取

const index = url.lastIndexOf('/');

const filename = url.slice(index + 1);

const a = document.createElement('a');

a.style.display = 'none';

a.href = blobUrl;

a.download = filename;

document.body.appendChild(a);

a.click();

document.body.removeChild(a);

window.URL.revokeObjectURL(blobUrl);

});

}).catch((error) => {

console.log('文件下载失败', error);

});

};

上面通过原生fetch请求,动态生成一个a标签实现文件下载

res.blob() 该方法将后端返回的字节流转换为返回blob的Promise;blob(Binary Large Object)是一个二进制类型的对象,记录了原始数据信息

URL.createObjectURL(blob) 该方法的返回值可以理解为一个指向 传入参数对象的url 可以通过该url访问 参数传入的对象

该方法需要注意的是,即便传入同一个对象作为参数,每次返回的url对象都是不同的

该url对象保存在内存中,只有在当前文档(document)被卸载时才会被清除,因此为了更好的性能,需要通过URL.revokeObjectURL(blobUrl) 主动释放

在实际项目中还要注意的是请求时的 跨域 和 鉴权 问题

踩坑记录

给a标签添加download属性,此属性指示浏览器下载URL而不是导航到它,download的值会作为预填充的文件名,问题是 此属性仅适用于同源 URL ,跨域无效

window.open()

Window 接口的 open() 方法,是用指定的名称将指定的资源加载到浏览器上下文(窗口 window ,内嵌框架 iframe 或者标签 tab )。如果没有指定名称,则一个新的窗口会被打开并且指定的资源会被加载进这个窗口的浏览器上下文中

说白了就是新开个窗口打开资源链接,浏览器能打开的还是会自动打开不会下载

以上哪里不对望大佬们指正

java a标签实现文件下载_a标签实现文件下载 避免直接打开问题相关推荐

  1. java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符

    正则表达式:java中匹配HTML中a标签中的中文字符 今天群里一位朋友问到了一个正则表达式的问题,有如下内容: 特432 453543 a1特123你好123吗? 特2 标签中的文字现在要匹配出内容 ...

  2. Java Web - EL表达式和JSTL标签库

    在使用servlet和jsp的过程中,两者之间的数据流转是十分常见的,jsp实际上也是一种servlet,也就是两个servlet之间的数据流转,我们根据不同的使用场景选择使用,请求转发(在reque ...

  3. java自定义jsp标签_Javaweb自定义jsp标签

    自定义标签 用户定义的一种自定义的jsp标记,当一个含有自定义标签的jsp页面被jsp引擎编译成Servlet时,tag标签被转化成了对一个称为标签处理类的对象的操作.于是当jsp页面被jsp引擎转化 ...

  4. java核心标签库,16.JSTL标签库(我的JavaEE笔记)

    主要内容:(工程el_example中6.jsp) 标签 标签 标签 标签 标签 标签 标签 标签 标签 JSTL标签库中包含核心标签库.国际化标签库.数据库标签.XML标签和JSTL函数(EL函数) ...

  5. Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式

    Java去除掉HTML里面所有标签,主要就两种,要么用开源的jar处理,要么就自己写正则表达式.自己写的话,可能处理不全一些自定义的标签.企业应用基本都是能找开源就找开源,实在不行才自己写-- 1,开 ...

  6. java web 自定义标签_JavaWeb学习——自定义标签

    自定义标签 一.自定义标签概述 使用标准JSP访问.操作JavaBean,是实现展现(HTML)与业务实现(Java代码)分离的第一步.然而,标准方法功能不够强大,以至于开发者无法仅仅使用它们开发应用 ...

  7. java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...

    EL的不足,由JSTL来加强  -> 自定义标签来实现. 1:自定义标签 1:自定义标签也是类. 2:让用户在JSP页面使用,不引用Java代码的情况下,调用Java代码. 2:标签开的类的继承 ...

  8. jsp中用java写标签id_jsp中自定义标签用法实例分析

    本文实例讲述了jsp中自定义标签用法.分享给大家供大家参考.具体如下: 这里简单的写了一个自定义标签,自己定义标签的好处就是在jsp页面中可以使用自己定义的功能,完全与Java代码分离 1. tld文 ...

  9. java如何快速标记条_【JAVA】如何利用TODO任务标签高效管理代办代码

    日常协同开发中,模块分配顺序.开发效率不一致的情况下会出现某一模块开发时需要调用其他开发人员所写模块未准备或者不清晰,代码搁置的情况下为了方便下次解决搁置代码.未完成项查找,常用开发工具为我们提供了t ...

  10. Java解析XML报文内容及标签属性

    前言 JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型.字体 ...

最新文章

  1. 《从Excel到R 数据分析进阶指南》一3.4 更改数据格式
  2. java数组之binarySearch查找
  3. TCP核心概念-慢启动,ssthresh,拥塞避免,公平性的真实含义
  4. ASP.NET“.NET研究”下用URLRewriter重写二级域名
  5. qt 实现 以图片为中心 让它旋转_QT图片旋转动画
  6. Java ClassLoader findSystemClass()方法与示例
  7. tcp 发送 最大数据量_网络基础知识夯实总结(三):TCP协议
  8. C/C++如何连接MySQL服务器以及简单加密
  9. java求圆弧切线_两个圆的公切线
  10. jquery编写插件的三种方法
  11. python的设计哲学_Python的设计哲学
  12. Python 翻译文章 txt文件
  13. WPF教程:依赖属性
  14. AI 语音交互开放平台的构建与演进
  15. 小米用户画像_华为小米OPPOvivo用户画像,用户兴趣爱好各有不同!还有一大相同点!...
  16. shaderlab 中 use pass、grab pass的用法
  17. NVIDIA TK1 学习笔记(1):TK1介绍
  18. 历史气象数据网站及操作教程
  19. 拼多多商家如何虚假发货的情况出现?
  20. 英利分布式:国内最高光伏空调3大亮点引关注

热门文章

  1. 微信小程序实现图片上传
  2. STM32——新建 Keil MDK 5 工程(寄存器版本)
  3. Linux系统服务 2 ---- DNS基础及域名系统架构
  4. linux nginx rtmp 直播,linux下利用nginx搭建rtmp直播服务
  5. Android Builder模式
  6. c# 图片批量转双层PDF,OFD格式文件
  7. 微信答题小程序用时计算逻辑梳理
  8. java性能调优寻找瓶颈常用的命令_Java性能调优:利用VisualVM进行性能分析
  9. 50道SQL练习题及答案与详细分析
  10. docker视频教程 假装听听 应该还行