前端下载文件实现方式及跨域下载方法

跨域下载文件 一般我们从服务器下载使用FileStream,但是如果跨域的话怎么办啦,使用HttpWebRequest,会遇到很多问题,我自己项目中使用并测试通过。 立即下载

在开发过程中前端如何与后端配合实现文件下载至本地?特殊格式文件如何处理?

概要

需求:实现二进制下载、URL下载、跨域下载
后端:Spring
前端:Vue
要点:后端返回文件流还是URL下载地址?

一、二进制式下载

  1. 流程:后端返回二进制文件流的情况下,前端需要使用JS对象Blob构造函数来接收并储存文件流,当服务器端发送完文件流之后,前端使用a标签HTML5新属性download属性实现本地储存,以达到实现下载需求。
  2. 后端返回内容:二进制文件流
  3. 前端做处理:正常请求,后端给我们返回的是二进制流文件,由于前端需要使用Blob接受,所以在请求头中需要告知服务器需要返回的数据类型,即 responseType: “blob”,服务器返回的即是个blob对象。
  4. 思路:拿到Blob对象之后,使用URL.createObjectURL (前端API)生成一个可使用的URL地址,之后把这个URL地址赋给一个临时创建的a标签,当然我们的a标签也需要download属性才可以拥有下载属性
  5. 前端代码:
   this.$axios({
     method: "post", //请求方式
     responseType: "blob", //告诉服务器我们需要的响应格式
     url: "fileService/fileService/download", //地址
     data: {
       fileId: item.fileId,
       authorId: window.localStorage.getItem("authorId")
     }
   }).then(res => {
     let url = window.URL.createObjectURL(new Blob([res.data])); //转换为可用URl地址
     let link = document.createElement("a"); //创建a标签
     link.style.display = "none"; //使之不可见
     link.href = url; //赋URL地址
     link.setAttribute("download", item.fileName); //设置下载属性、以及文件名
     document.body.appendChild(link); //将a标签插至页面中
     link.click(); //强制触发a标签事件
   });
  1. 优点:适合1M以内的小文件下载
  2. 缺点:文件会在服务器端完全发送完毕之后、才会展示出下载提示,用户体验感极差。

二、解析:URL下载

  1. 流程:后端返回URL下载路径,前端直接放置a标签,并赋予a标签download属性,使其下载而不是直接打开。
  2. 后端返回内容:文件第三方下载地址
  3. 前端做处理:前端创建a标签,赋予href为文件下载地址即可
  4. 前端代码:
  Download() {
    let link = document.createElement("a"); //创建a标签
    link.style.display = "none"; //使其隐藏
    link.href = this.Data.filePath; //赋予文件下载地址
    link.setAttribute("download", this.Data.fileName); //设置下载属性 以及文件名
    document.body.appendChild(link); //a标签插至页面中
    link.click(); //强制触发a标签事件
  },
  1. 优点:不限制文件大小
  2. 缺点:目测 无!

三、解析:跨域下载

  1. 表现:继 ‘二’ 所述,在URL下载方式中,遇到mp4 / jpg / png等浏览器可以识别的文件格式时,下载提示框未弹出,直接在浏览器打开了该文件。
  2. 原因:经观察是a标签的download属性失效。查阅一些资料后发现download属性也受同源策略的影响,即非同一端口下不能直接下载第三方文件,所以这里download失效之后做的仅仅是跳转功能,类似于某一视频下载地址直接通过浏览器get访问跳转。
  3. 解决方式:后端 oss可以批量设置HTTP头,设置HTTP请求头为Content-Disposition 为 attachment即可,访问的时候就是直接下载而不是浏览!

版权声明:本文为优快云博主「米斯特曹、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:前端:下载文件实现方式及跨域下载(详解)

解决ajax跨域问题 解决ajax跨域的问题的小demo,供大家参考,需要的可以下载。 立即下载

相关推荐

开源处理器Rocket的分支预测机制研究与性能评估(二)

Rocket是基于RISC-V指令集架构的开源处理器,具有分支预测功能,其实现了GShare分支预测机制,在分析Rocket处理器分支预测处理过程、分支预测实现原理的基础上,利用模拟器进行了性能测试,并依据测试结果,对Rocket处理器分支预测参数配置给出建议。

leishangwen的专栏 5691

JS实现文件下载(含跨域)

【代码】JS实现文件下载(含跨域)

原野 1770

Unity镜子效果的实现(无需镜子Shader)

Unity镜子效果制作教程 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速实现一个简单的镜面反射效果为新手节省宝贵的时间,避免采坑! Chinar 教程效果: 1 Cre...

weixin_33947521的博客 9565

前端点击按钮跨域下载多个url文件(亲测有用)

需求要求点击下载附件后,下载后端返回来的多个文件url数组。

lcc0628的博客 2231

Halcon形状模板匹配实战:inspect_shape_model参数优化指南

本文深入解析Halcon形状模板匹配中inspect_shape_model参数的优化技巧,涵盖NumLevels和Contrast参数的实战应用。通过具体案例展示如何平衡匹配速度与精度,帮助开发者高效调试形状模型,提升工业视觉检测的准确性和效率。

weixin_30342209的博客 618

计算机三级考试嵌入式系统重点精简汇总

第一章 嵌入式系统概论 1.1.1嵌入式系统 (1)特点:(1)专用性;(2)隐蔽性;(3)资源受限;(4)高可靠性;(5)实时性;(6)软件固化。 (2)应用:(1)冰箱、洗衣机、电饭煲、空调、摄影机、DVD播放器等;(2)数控机床、飞机、汽车、电梯、X光机、血压计等;(3)电话机、传真机、打印机、pos机、GPS导航仪、路由器等。 1.1.2嵌入式系统组成与分类 (1)逻辑组成:硬件和软件,分为处理器、存储器、I|0设备与I|O接口,数据总线; (2)处理器:分为主处理器(CPU)和协处

chemkrik的博客 1万+

前端:下载文件实现方式及跨域下载(详解)

前言:本文详细介绍在开发过程中前端如何与后端配合实现文件下载至本地,并详细说明特殊格式文件如何处理。如果你是一名前端开发者,恰好需要实现后端文件下载至本地的需求,那么恭喜你本篇文章一定会帮到你! 需求:实现二进制下载、URL下载、跨域下载 后端:Spring 前端:Vue 要点:后端返回文件流还是URL下载地址? 一、解析:二进制式下载 流程:后端返回二进制文件流的情况下,我们前端需要...

米斯特曹 2万+

stm32学习笔记:ADC

stm32学习笔记:ADC

hmh520i的博客 3223

js下载文件、音频、视频的方式 vue

1.a标签下载文件 // 这是传统的下载方式 const downloadFileA = document.createElement('a') document.body.append(downloadFileA) downloadFileA.href=`https://xxx` downloadFileA.download = '下载文件.csv' // 超链接 target="_blank" 要增加 rel="noopener noreferrer" 来堵住钓鱼安全漏洞。如果你在链接上使用 tar

xuyulong1993的博客 5026

【安全启动】HSM安全启动系统学习指南

HSM安全启动系统学习指南摘要 本指南为工程师提供关于HSM安全启动的系统性学习路径,以英飞凌AURIX TC377芯片为核心案例,涵盖基础理论、芯片实现、开发实践和行业应用四个阶段。安全启动作为设备信任链的起点,在汽车电子和工业控制领域尤为重要。指南详细解析了TC377的HSM架构、UCB/PROCON配置、密钥管理等关键技术,并提供了从开发到认证的全流程指导。特别关注汽车行业合规要求(如ISO/SAE 21434、UN R155),帮助开发者构建安全可靠的启动系统,规避常见工程陷阱。通过四阶段渐进学习,

weixin_46481662的博客 516

【1】Java 部分笔试题解析

解析A.abstract关键字应该放在class关键字之前。C.抽象方法不能有方法体。D缺少了class关键字。

博客 3943

Vue 文件下载功能的跨域处理与前后端实现详解

精细化安全配置,限定下载接口权限全局 CORS 配置解决跨域问题前后端协同处理文件流和异常完善的错误提示与用户引导本文提供的方案已在实际项目中验证,可有效解决文件下载功能中的跨域和权限问题,确保用户体验和系统安全性。

zhz5214的博客 1226

基于 Simulink 的固态变压器(SST)多级协同控制实战教程

《固态变压器多级协同控制仿真指南》摘要: 本教程详细讲解了基于Simulink的固态变压器(SST)三级架构建模与控制方法。核心内容包含:1)搭建级联H桥整流(CHB)、双有源桥(DAB)和逆变器(VSI)的三级主电路;2)提出创新的多级协同控制策略,通过功率前馈实现输入输出级动态匹配;3)给出系统级功率平衡、单元级均压控制的具体实现方案。教程特别强调解决实际工程中的关键问题:代数环处理、软启动设计和刚性系统求解器选择,并提供了硬件在环(HIL)仿真建议。附带的MATLAB代码示例可直接用于实现电容电压均衡

xiaoheshang_123的博客 120

前端下载文件的几种方式

前端下载文件的几种方式前言三级目录 前言 总结下载文件的几种方式,文件都是通过接口获取的,前端通过调用接口将接口返回的文件下载。 文件下载的方式的选择主要考虑以下几个方面: 1. 接口使用的是post请求还是get请求 2. 接口返回的是文件流还是下载的文件路由 3. 请求参数是什么类型 4. 是否打开新窗口 三级目录 ............

玛已的小空间 2831

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

前端文件下载方式总结

*写在前面:**网上关于前端实现文件下载的文章已经有很多了,而且有的写的十分详细专业。之前一直不愿意做此类记录,一来是觉得这方面的文章太多太详细了,没有写的必要;二来是想着自己写的还不一定有别人写的好。但随着日常开发中用到的文件下载功能用的越多,各种下载方式都有使用过,觉得需要记录一下,以方便使用。

m0_74825003的博客 548

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

记录--盘点前端实现文件下载的几种方式

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前端涉及到的文件下载还是很多应用场景的,那么前端文件下载有多少种方式呢?每种方式有什么优缺点呢?下面就来一一介绍。 1. 使用 a 标签下载 通过a标签的download属性来实现文件下载,这种方式是最简单的,也是我们比较常用的方式,先来看示例代码: <ahref="http://www.baidu.com"downlo...

林恒的博客 991

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

前端文件下载的正确打开方式

作者:田八https://juejin.cn/post/7156427561302982670前端涉及到的文件下载还是很多应用场景的,那么前端文件下载有多少种方式呢?每种方式有什么优缺点呢?下面就来一一介绍。1. a 标签通过a标签的download属性来实现文件下载,这种方式是最简单的,也是我们比较常用的方式,先来看示例代码:<ahref="http://www.baidu.com"d...

weixin_46837985的博客 409

导入、导出+复制粘贴文本

导入导出 1、导入: upload组件上传到阿里云服务器获取到地址,地址传给后台 2、导出: 3、下载模板: 页面动态添加a标签,href属性:下载文件地址,downLoad属性:文件名称(a点击事件触发,完成之后删除a标签) // 获取文件路径名称(path为下载地址) export function getLastNameLocation(path) { if (path.lastIndexOf('\\') >= 0) { const reg = new RegExp('\\\\',

zhouzhoua123321的博客 485

记录一下flutter在pc端下载文件的方式

flutter下载文件方法记录

u012745755的博客 1158

工作记录-a标签与文件流下载

前段下载方法记录

weixin_59339514的博客 386

前端常见问题和技术解决方案

前端常见问题和技术解决方案

龙骑士-黎明的博客 4693

vue不同下载

//下载图片地址和图片名 export const downloadIamge =(imgsrc,name) =>{ var image = new Image(); // 解决跨域 Canvas 污染问题 image.setAttribute("crossOrigin", "anonymous"); image.onload = function() { var canvas = document.createElement("canvas");

weixin_45437417的博客 160

nginx解决跨域问题

在我们前端开发的过程中, 相信大家都遇到过一个让人头疼的问题,那就是跨域问题. 跨域解决的方式有很多,这里主要讲的是如何来使用 nginx来解决我们所遇到的跨域问题 首先,在我们开始之前,首先要知道跨域是如何产生的: 协议 ip 端口号 这三者有任何一个不同,就会产生跨域问题 了解了跨域的产生,接着我们就来看看,如何解决它 一.下载nginx 下载地址: http://ngin...

rolinabc的博客 1万+

js解决跨域下载文件

之前用的是a标签的方式,同源是没有问题的,但一跨域就不行了,试了其它方法,不是报跨域错误,就是在当前页面打开文件,体验相当不好。 data = data.replace(/\\/g, '/'); var aLink = document.createElement('a'); aLink.download = data.split('/')[data.split('/').length ...

一劍傾城 5329

a标签跨域下载

之前项目中的一个文件上传后下载的需求,后端是把文件存在文件服务器,然后返回给前端一个文件地址 拿到url后使用a标签下载,但是对于文件是图片,.txt或者 .pdf这些浏览器可以直接打开的文件,没有下载,而是直接在当前页面打开了,原因是因为url不是同源的 MDN中说a标签的download的属性仅适用于同源URLs,但是它又说可以使用blob:URLs和data:URLs的形式 1. 下面是使...

weixin_34247299的博客 6419
上一篇: VSCode设置eslint自动缩进和自动格式化代码
下一篇: 字符串的字符数的含义
JCjunior
博客等级 码龄11年 45粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值