<a>链接下载视频/图, 不是打开新页面预览

转自:<a>链接下载视频 而不是打开新页面播放_小垚尧的博客-CSDN博客_a标签下载视频文件

开发中我们常用<a标签>链接下载数据, 非常好用。但是在下载视频的时候 会遇到无法下载 转而打开新页面播放的bug
其实, 查看该响应的headers你就会发现, 它的 Response Headers 中有一条: Content-Type: text/html; charset=UTF-8
没错,当我们点击那个a标签时,浏览器检查了response的Content-Type,发现如果是text/html, 浏览器就会打开页面。当然, 如果这是一个特殊的类型(比如: application/octet-stream),就会触发下载行为。

Content-Type头部的内容实际上是MIME类型,用来表示文档、文件或字节流的性质和格式。浏览器就是根据这个MIME来识别不同的response,并决定如何处理它。

当然, 不光response会有, 其实, 我们发送request的时候, 对于特殊格式的数据, 也会设置特殊的Content-Type, 最常见的就是文件file的提交, 通常会设置'Content-Type': 'multipart/form-data',

现在问题来了,如果要下载的文件本身是一个html,怎么办呢?

将Content-Type手动修改为application/octet-stream可以吗?当然可以,这样浏览器就会认为a标签引用的是一个二进制文件,直接触发下载行为。但是这样做显得太暴力了,下载文件的类型信息丢失了,有没有其他办法呢?

那就是Content-Disposition这个header。Content-Disposition可以告诉浏览器,获取到的资源是展示还是下载,比如:

Content-Disposition: attachment; filename=hello.html

这样,我们就可以让Content-Type是text/html,同时浏览器也能正确识别并下载html文件了。

下面贴上具体的封装方法:

/**
 * 根据链接下载视频
 * @param {string} filePath 文件地址
 * @param {string} fileName 文件名
 */
export function videoDownload(filePath: string, fileName: string) {
    const a = document.createElement('a');
    document.body.append(a);
    a.style.display = 'none';
    
    // 指示回复的内容该以何种形式展示(是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。)
    a.href = filePath + '&response-content-disposition=' + encodeURIComponent('attachment; filename="' + fileName + '"');
    a.download = fileName;
    a.click();
    
    // 多文件时remove放在setTimeout里面
    setTimeout(() => {
        document.body.removeChild(a);
    }, 300);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot应用程序中实现打开预览文件并在新页面中显示其内容,您可以使用以下步骤: 1. 首先,您需要使用Thymeleaf或JSP等模板引擎创建一个HTML文件,其中包含一个链接或按钮以打开文件预览页面。例如,以下是使用Thymeleaf创建链接的示例: ```html <a th:href="@{/preview/file}" target="_blank">预览文件</a> ``` 在此示例中,我们使用`@{/preview/file}`指定链接的URL,`target="_blank"`用于在新页面打开链接。 2. 接下来,您需要创建一个控制器方法来处理预览文件的请求。在该方法中,您可以使用Java IO或Apache Commons IO等库来读取文件内容并将其传递给HTML模板以显示在页面上。例如,以下是使用Spring MVC创建控制器方法的示例: ```java @GetMapping("/preview/file") public String previewFile(Model model) throws IOException { String filePath = "/path/to/your/file"; File file = new File(filePath); String fileContent = FileUtils.readFileToString(file, "UTF-8"); model.addAttribute("fileContent", fileContent); return "preview"; } ``` 在此示例中,我们使用`@GetMapping("/preview/file")`指定控制器方法的URL,FileUtils类来读取文件内容,使用`Model`对象将文件内容传递给HTML模板。 3. 最后,您需要使用Thymeleaf或JSP等模板引擎创建一个HTML文件来显示文件内容。例如,以下是使用Thymeleaf创建文件预览页面的示例: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>文件预览</title> </head> <body> <pre th:text="${fileContent}"></pre> </body> </html> ``` 在此示例中,我们使用`<pre>`标签来显示文件内容,并使用Thymeleaf表达式`${fileContent}`将控制器方法中传递的文件内容呈现在页面上。 通过这些步骤,您可以实现在Spring Boot应用程序中打开预览文件并在新页面中显示其内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值