axios 下载文件流或者预览在线pdf
问题: 后端返回文件流,前端使用axios下载或者在线预览
下载文件流
import axios from 'axios'
// 设置响应类型为blob
axios.get('/api/app/xxx/downloadExcel', { responseType: 'blob' }).then(resp => {
let temp = document.createElement('a') // 创建a标签
temp.download = 'excel.xls'// 设置下载名称
// 创建blob对象,在javascript中blob代表一个二进制流对象,不可修改
const blob = new Blob([resp.data], {
// 类型从响应头中获取
type: resp.headers["content-type"]
});
// 创建对象url,并赋值给a标签
let URL = window.URL || window.webkitURL;
temp.href = URL.createObjectURL(blob);
// 手动触发点击事件
temp.click()
})
提示:document.createElement()方法创建的标签,不挂载到document树中,会自动销毁。不用担心内存问题。
在线预览pdf
import axios from 'axios'
axios('/api/app/xxx/pdf', { responseType: 'blob' }).then(res => {
const blob = new Blob([res.data], { type: res.headers["content-type"] });
var URL = window.URL || window.webkitURL;
let href = URL.createObjectURL(blob);
// 方法一:使用浏览器自带
window.open(href)
// 方法二:使用pdf.js(将pdf.js下载至项目pdf文件夹)
this.pdfUrl = `/pdf/web/viewer.html?file=${encodeURIComponent(href)}`
})
后端工具类
package com.tons.utils;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class ResponseFileUtils {
public static void responseFile(HttpServletResponse resp, File file) throws IOException {
responseFile(resp, file, false);
}
public static void responseFile(HttpServletResponse resp, File file, boolean pdfDownload) throws IOException {
// 错误处理
if (!file.exists()) throw new RuntimeException(file.getAbsolutePath() + " 文件不存在");
// 判断是否pdf
int a = file.getName().toLowerCase().lastIndexOf('.');
int b = file.getName().toLowerCase().indexOf("pdf");
if (a < b && !pdfDownload) {
// 允许浏览器预览
resp.setHeader("content-type", "application/pdf;chartset=UTF-8");
resp.setHeader("Content-Disposition", "fileName=" + URLEncoder.encode(file.getName(), "utf-8"));
} else {
resp.setHeader("content-type", "application/octet-stream");
// attachment 告知浏览器,这个文件流应该是下载的
resp.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(file.getName(), "utf-8"));
}
// 读取文件,响应给浏览器
ServletOutputStream out = resp.getOutputStream();
FileInputStream in = new FileInputStream(file);
int size = 0;
byte[] data = new byte[1024];
while (true) {
int n = in.read(data, 0, data.length);
if (n <= 0) break;
size += n;
out.write(data, 0, n);
}
resp.setContentLength(size); // 返回大小
in .close();
out.close();
}
}
axios 下载文件流或者预览在线pdf的更多相关文章
- JS通过使用PDFJS实现基于文件流的预览功能
需求: 使用JS实现PDF文件预览功能 备选方案: 使用ViewerJS,官网 http://viewerjs.org/ 使用PDFJS,官网 https://mozilla.github.io/ ...
- Office在线预览及PDF在线预览的实现方式史上最全大集合
Office在线预览及PDF在线预览的实现方式大集合 一.服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPD ...
- atitit.javascript js 上传文件的本地预览
atitit.javascript js 上传文件的本地预览 1. .URL.createObjectURL 1 1.1. 吊销所有使用 URL.createObjectURL 而创建的 URL,以 ...
- 解决vue、js 下载图片浏览器默认预览而不是下载
在网页上,如果我们下载的地址对应的是一个jpg文件,txt文件等,点击链接时,浏览器默认的是打开这些文件而不是下载,那么如何才能实现默认下载呢? 后端解决 这就是Content-Disposition ...
- 基于bootstrap的上传插件fileinput实现ajax异步上传功能(支持多文件上传预览拖拽)
首先需要导入一些js和css文件 ? 1 2 3 4 5 6 <link href="__PUBLIC__/CSS/bootstrap.css" rel="exte ...
- vue element之axios下载文件(后端Python)
axios 接受文件流,需要设置 {responseType:'arraybuffer'} axios.post( apiUrl, formdata, {responseType:'arraybuff ...
- [java]文件上传下载删除与图片预览
图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...
- java原装代码完成pdf在线预览和pdf打印及下载
这是我在工作中,遇到这样需求,完成需求后,总结的成果,就当做是工作笔记,以免日后忘记,当然,能帮助到别人是最好的啦! 下面进入正题: 前提准备: 1. 项目中至少需要引入的jar包,注意版本: a) ...
- python爬虫处理在线预览的pdf文档
引言 最近在爬一个网站,然后爬到详情页的时候发现,目标内容是用pdf在线预览的 比如如下网站: https://camelot-py.readthedocs.io/en/master/_static/ ...
- windows 下 php 实现在线预览附件(pdf)
(写的有点啰嗦,具体的实现方法只是粗体和代码就够了) 给市场部门用dede做个cms,需要附件在线查看.公司有个系统(就叫develop_cms吧)是已经实现的,本以为很容易,不过是下一个插件然后把附 ...
随机推荐
- 如何用 30s 给面试官讲清楚跳表
查找 假设有如下这样一个有序链表: 想要查找 24.43.59,按照顺序遍历,分别需要比较的次数为 2.4.6 目前查找的时间复杂度是 O(N),如何提高查找效率? 很容易想到二分查找,将查找的时间复 ...
- Jmeter 函数助手之__UUID 生成唯一的标识符
在测试ws协议接口时,常常需要传入唯一标识符,jmeter 提供__UUID.__Random生成随机的字符串,两者区别为:__UUID生成的随机字符串不会重复,而__Random会重复 __UUID ...
- [python] 基于wordcloud库绘制词云图
词云Wordcloud是文本数据的一种可视化表示方式.它通过设置不同的字体大小或颜色来表现每个术语的重要性.词云在社交媒体中被广泛使用,因为它能够让读者快速感知最突出的术语.然而,词云的输出结果没有统 ...
- 大数据 - ADS 数据可视化实现
之前数据分层处理,最后把轻度聚合的结果保存到 ClickHouse 中,主要的目的就是提供即时的数据查询.统计.分析服务.这些统计服务一般会用两种形式展现,一种是为专业的数据分析人员的 BI 工具,一 ...
- Windows 平台计算 CPU 总利用率
利用 GetSystemTimes 可以获得 Windows 系统的 Idle Time. Kernel Time 和 User Time.Idle Time 是系统空闲的时间,也就是系统没有利用的时 ...
- Windows 11 内核新调试器「GitHub 热点速览 v.23.01」
本周热点趋势榜虽然新项目不多,但是还是有几个不错值得收藏的工具项目,比如用来做文本转语音的 tortoise-tts 能生成更加贴近真实人声的语音,让 Golang 并发更出色的 conc,以及通过 ...
- Hugging Face - 推理(Inference)解决方案
每天,开发人员和组织都在使用 Hugging Face 平台上托管的模型,将想法变成概念验证(proof-of-concept)的 demo,再将 demo 变成生产级的应用. Transformer ...
- CSS文字超出宽度---换行总结
2021-5-5重新总结---CSS文字超出宽度---附代码 <!DOCTYPE html> <html lang="en"> <head> ...
- win32com操作word API精讲 第十集 Paragraphs & Paragraph接口 (一)
本课程<win32com操作word API精讲&项目实战>以视频为主,文字为辅,公众号ID:一灯编程 在word编程中,Range和Paragraph(s)接口无愧于劳模接口的称 ...
- 读Java8函数式编程笔记03_高级集合类和收集器
1. 方法引用 1.1. 一种引用方法的轻量级语法 1.1.1. 提供了一种简短的语法 1.1.2. 标准语法为Classname::methodName 1.2. 凡是使用Lambda表达式的地方, ...