a标签下载出现预览场景

在开发者文档管理中,对于页面上的附件下载。一般快速实现方式,是使用a标签的download属性,直接下载文件。但是在测试中发现在一些特殊情况下,会变成在线预览。而对于开发需求中,json文件也要以附件形式下载,方便cp进行操作。本文针对这种情况说明及列举对应的解决方法。

1、使用a标签测试下载附件的现象

  • 在同源情况下,文件都可以正常下载
  • 不同源情况,部分文件(.json、.txt、.png等)会变成在线预览形式

2、a标签下载相关属性

download:设置该属性,可以让浏览器把地址视为在线下载资源

  • 如果没有指定值,浏览器会从多个来源决定文件名和扩展名:

  • filename:决定文件名的值。/ 和 `` 被转化为下划线(_)。文件系统可能会阻止文件名中其他的字符,因此浏览器会在必要时适当调整文件名。

href:设置下载地址,可以支持data:url,blob:url

注意:上述异常现象的原因是 download 只在同源 URLblob:data: 协议起作用

3、解决方法:

  • 不同源情况下,使用data:url或者blob:url处理,变成同源文件处理
javascript 复制代码
//blob:url,处理各种文件
    fetch("http://127.0.0.1:3000/test.png")
        .then(res => res.blob()).then(res => {
        document.querySelector("#file").href = URL.createObjectURL(res);
    })
//data:url处理指定文件
    fetch("http://127.0.0.1:3000/test.json")
        .then(res => res.text())
            .then(res => {
            document.querySelector("#file").href = `data:application/json,${res}`;
    })
  • 使用Content-Disposition 在服务端 设置HTTP 响应头设置,设置为附件形式attachment
css 复制代码
Content-Disposition: attachment;filename="fname";
  • 使用代理方案,变成同源文件处理

参考

相关推荐
2601_9498095919 小时前
flutter_for_openharmony家庭相册app实战+相册详情实现
javascript·flutter·ajax
qq_1777673719 小时前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos
2601_9498333919 小时前
flutter_for_openharmony口腔护理app实战+饮食记录实现
android·javascript·flutter
2601_9494800619 小时前
【无标题】
开发语言·前端·javascript
css趣多多19 小时前
Vue过滤器
前端·javascript·vue.js
●VON20 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
爱吃大芒果20 小时前
Flutter for OpenHarmony 实战:mango_shop 路由系统的配置与页面跳转逻辑
开发语言·javascript·flutter
qq_1777673720 小时前
React Native鸿蒙跨平台实现消息列表用于存储所有消息数据,筛选状态用于控制消息筛选结果
javascript·react native·react.js·ecmascript·harmonyos
沐雪架构师20 小时前
LangChain 1.0 Agent开发实战指南
开发语言·javascript·langchain
2501_9400078921 小时前
Flutter for OpenHarmony三国杀攻略App实战 - 战绩记录功能实现
开发语言·javascript·flutter