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吧)是已经实现的,本以为很容易,不过是下一个插件然后把附 ...
随机推荐
- pytest常用参数汇总
1. -s 表示输出调试信息,包括print打印信息 D:\demo>pytest -s ./pytest_1 ===================================== ...
- go语言行为(方法)的两种定义差别
概述: go在定义方法时,有如下两种表示形式: 第一种,在实例方法被调用时,会产生值复制 func (e Employee) String() string {} 第二种,不会进行内存拷贝,所以通常情 ...
- (四)elasticsearch 源码之索引流程分析
1.概览 前面我们讨论了es是如何启动,本文研究下es是如何索引文档的. 下面是启动流程图,我们按照流程图的顺序依次描述. 其中主要类的关系如下: 2. 索引流程 我们用postman ...
- Windows 平台计算 CPU 总利用率
利用 GetSystemTimes 可以获得 Windows 系统的 Idle Time. Kernel Time 和 User Time.Idle Time 是系统空闲的时间,也就是系统没有利用的时 ...
- [cocos2d-x]从源码角度思考convertToWorldSpace()与convertToWorldSpaceAR()坐标系的转换
convertToWorldSpace() 话不多说,先上源码,之后再慢慢讲解: (5和6图截图的时候重复了,这里就不弄出来了) 只要通过图1到图8中我写的注释进行分析(不懂的地方可以自己去翻一下co ...
- js节流防抖 减少服务器请求
- Java入门与进阶P-3.7+P-3.8
猜数游戏 让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉它这是大了还是小了,知道用户猜中为止,最后还要告诉用户它猜了多少次 因为需要不断重复让用户猜,所以需要用到循环 在实际写出程序之前 ...
- 真正“搞”懂HTTP协议10之缓存控制
HTTP缓存相关的问题好像是前端面试中比较常见的问题了,上来就会问什么cache-control字段有哪些,有啥区别啥的.嗯--说实话,我觉得至少在本篇来说,HTTP缓存还算不上复杂,只是字段稍微多了 ...
- Python中的枚举类enum
0. 本文来历 上一篇文章,我写了Pytest插件pytest-order指定用例顺序 我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一个dict ...
- 树莓派4B—LCD触摸屏和硬件串口配置
1.LCD触摸屏直接下载官网驱动,这里选用的是3.5寸显示屏,解压后直接运行 sudo ./LCD35-show 然后重启. 注意:一定要先安装LCD驱动,因为安装驱动会修改/boot/config. ...