博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原生ajax通过post或者get下载文件,或处理IE浏览器因为后缀不能显示图片
阅读量:4653 次
发布时间:2019-06-09

本文共 2267 字,大约阅读时间需要 7 分钟。

前言

通过post或者get下载路径,还需要知道下载完成的状态,知道什么时候下载完成。

IE浏览器或者有些手机的浏览器有些图片不显示,因为图片路径不被浏览器识别。

概述

显示图片大家都知道只要用img标签,把url给上路径就可以显示出来了,但是如果是路径是这种

1433614-20181122154651539-1193592304.png
图片在谷歌火狐或者safari显示没有问题,但是在IE上无法正常显示。如果是一png、jpg这种路径的却没有问题。那么怎么来处理这种问题呢?

思考

为什么这种在IE上无法显示?既然能通过路径获取图片的数据

可不可以直接ajax方法拿到文件数据,然后显示到页面或者下载?

获取文件数据

不多说直接上代码

/** * @description 通过请求获取文件  * @param {String} url 请求接口 * @param {Object} data 发送的数据 */getImageUrl(url, data) {    return new Promise(resolve => {  // new 一个Promise对象        let xmlhttp        let 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不支持download                window.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

你可能感兴趣的文章
【Android实战开发】3G技术和Android发展简介
查看>>
【精解】EOS标准货币体系与源码实现分析
查看>>
AFore.NET 翻译
查看>>
[大牛翻译系列]Hadoop(8)MapReduce 性能调优:性能测量(Measuring)
查看>>
What to do when the Chinese Characters are messed up when extracting from zip archive?
查看>>
SQLYog快捷键大全
查看>>
(转载)DLL动态链接库编程入门之三:MFC规则DLL(上)
查看>>
隐藏Nginx或Apache以及PHP的版本号的方法
查看>>
N32926之jlink调试配置
查看>>
ASP.NET ACCESS 分页
查看>>
HashMap
查看>>
Android广播机制概述
查看>>
mysql触发器
查看>>
我是怎么让全国最大的儿童失踪预警平台流量掉底的
查看>>
领扣(LeetCode)二叉树的中序遍历 个人题解
查看>>
MySQL5.5登录密码忘记了,怎嘛办?
查看>>
[javascript]9宫格拖拽拼图游戏 puzzle
查看>>
论文笔记《Hand Gesture Recognition with 3D Convolutional Neural Networks》
查看>>
java内部类
查看>>
Entity Framework底层操作封装(3)
查看>>