原生ajax通过post或者get下载文件,或处理IE浏览器因为后缀不能显示图片
前言
通过post或者get下载路径,还需要知道下载完成的状态,知道什么时候下载完成。
IE浏览器或者有些手机的浏览器有些图片不显示,因为图片路径不被浏览器识别。
概述
显示图片大家都知道只要用img标签,把url给上路径就可以显示出来了,但是如果是路径是这种
图片在谷歌火狐或者safari显示没有问题,但是在IE上无法正常显示。如果是一png、jpg这种路径的却没有问题。那么怎么来处理这种问题呢?
思考
为什么这种在IE上无法显示?既然能通过路径获取图片的数据
可不可以直接ajax方法拿到文件数据,然后显示到页面或者下载?
获取文件数据
不多说直接上代码
/*** @description 通过请求获取文件 * @param {String} url 请求接口* @param {Object} data 发送的数据*/
getImageUrl(url, data) {return new Promise(resolve => { // new 一个Promise对象let xmlhttplet formData = new FormData() // 这里用的是formData包装数据,根据自己项目可以改成普通的json数据传输 用json传输注意转换成字符串 // let data = JSON.stringify(data)if (data) {Object.keys(data).forEach(item => {if (data[item]) {formData.append(item.toString(), data[item])}})}xmlhttp=new XMLHttpRequest()xmlhttp.open("GET", url, true);xmlhttp.responseType = "blob" // 返回响应数据的类型xmlhttp.onload = function(){if (xmlhttp.status == 200) {let fileUrl = window.URL.createObjectURL(xmlhttp.response)let fileName = decodeURI(xmlhttp.getResponseHeader('content-disposition').split('filename=')[1].replace(/\"/g, '')) //如果是下载文件需要在header中获取文件名 这里可能提取文件名不能完全符合每个项目,如果获取的不对 通过xmlhttp.getResponseHeader('content-disposition')方法自行正则或者其他方法拿到文件名resolve({fileName,fileUrl,fileBlob: xmlhttp.response})}}xmlhttp.send(formData) })
}
通过这个方法就可以完成下载一个文件了,并生成一个本地路径 用法:
const download = (url, data) => {getUrl(url, data).then(file => { // 这里可以只用file.flieUrl然后将这个赋值给页面的图片就能解决IE不能现在某些特殊路径的图片的问题if (window.navigator.msSaveBlob) { // IE 兼容IE不支持downloadwindow.navigator.msSaveOrOpenBlob(file.fileBlob, file.fileName)return}let elementA = document.createElement("a")document.body.appendChild(elementA)elementA.setAttribute('href', file.fileUrl) elementA.setAttribute('download', file.fileName)elementA.click()document.body.removeChild(elementA)})
}
这短代码演示的post方法并用FormData包装数据,请求方法和格式可根据自己项目随意修改。
转载于:https://www.cnblogs.com/slongs/p/10001725.html
原生ajax通过post或者get下载文件,或处理IE浏览器因为后缀不能显示图片相关推荐
- mac怎么删除下载文件及MAC电脑浏览器如何清除缓存?
很多用户在浏览器下载了很多文件,可能只打开过一次就再也没有使用过,也不知道怎么删除,等存储空间不够了才想起删除下载文件或者清理浏览器缓存.今天小编就来教大家mac怎么删除下载的文件,以及macbook ...
- java 上传图片后没法立马显示出来_SpringMVC多个文件上传及上传后立即显示图片功能...
多文件上传就是改良一个方法把MultipartFile类换成CommonsMultipartFile类,因为上传多个文件用数组方式的话MultipartFile类不能初始化,它不支持数组 packag ...
- JavaScript实战篇 -ajax方式实现js打包下载文件
一.问题描述 在我们日常开发中,会遇到批量下载方面的问题;如上图所示,我们要批量下载图片,接下来我们就模拟实现这个功能,并将下载文件打包下载; 二.准备工作 2.1 JSZip JSZip 是一个 j ...
- Java实现FTP下载文件到客户端(浏览器)
目录 一.简介 二.maven依赖 三.配置类 四.工具类 4.1.服务器文件名中文处理 4.2.下载文件名中文处理 五.接口验证 一.简介 我在之前的文章(Java实现文件上传和下载)里讲过非F ...
- Django下载文件中文乱码 FileResponse 浏览器正确识别文件名和文件大小的简单方法
起因 工作需要维护一个工单系统,下载文件时如果文件名有中文会导致乱码,并且下载时不显示文件的完整大小,没有进度条 修改 原先接口是这样写的 # view入口 class DownFile(BaseVi ...
- 微信公众号下载文件(避开微信浏览器的文件下载方法)
微信浏览器是屏蔽资源文件下载的,但是微信公众号内如何下载文件呢.只能借助于在其他浏览器打开,也就是跳到其他浏览器进行下载(如图). 具体的逻辑很简单,就是在需要下载的位置比如:是一个单击事件 < ...
- java文件下载并添加水印_Java下载文件加文字水印(Excel、PDF、图片)
一.导出Excel加文字水印 方法:通过实现准备一个带有水印的Excel文件,然后将数据覆盖该文件然后输出. 比如我准备了如下的一个带水印的模板,我起名为water.xlsx(网上有如何给Excel加 ...
- vue本地下载文件,解决ie浏览器本地下载文件无反应(已解决);vue-cli2本地下载文件,vue-cli3本地下载文件
1.vue-cli2+vue 注意:vue-cli2本地文件需要放在静态文件static下 <a href="javascript:void(0);" @click=&quo ...
- java安卓浏览器下载文件,JAVA实现文件下载,浏览器端得到数据没反应解决方案
JAVA实现文件下载,浏览器端得到数据没反应 代码如下 public void doPost(HttpServletRequest request, HttpServletResponse respo ...
最新文章
- 2022-2028年中国动力电池行业深度调研及投资前景预测报告
- Cacti Weathermap添加主机在线状态图示检测
- mysql3.0数据库修复_mysql3.0监控mysql数据库
- 汉字的理据与造字取向
- python用于什么-Python用于哪些领域
- 【线性规划与网络流24题】孤岛营救问题 分层图
- 用WPF开发Mapxtreme-- 在.net 4.0 下面开发WPF mapxtreme 程序
- 关于数据库与LoaderManager的联合使用,节流???。。。。。
- Greenplum-概念篇
- java的printf语法_Java中printf的用法总结
- 如何训练自己的编程思路
- python获取APP夸克答题助手答案
- linux飞信机器人,在Nagios使用飞信机器人发送警报
- 登陆apple pay显示无法登录服务器,apple pay无法添加卡怎么办?未能连接到apple pay的解决方法...
- 网站卡死服务器2008,winserver2008r2频繁卡死?
- 搭档之家:牛市来了!阿里云“临牛受命”,接到多家券商扩容需求
- mysql中explain执行结果各个字段的意思
- 低估价值选股策略(含源代码)
- 串口、网口等自定义通信协议的问题
- #Python #2022卡塔尔世界杯 #FIFA World Cup Qatar 2022 # 机器学习 #数据分析 用Python预测世界杯决赛