zoukankan      html  css  js  c++  java
  • 任意文件下载包含https的图片

    使用a标签进行下载

     <a href="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png">下载</a>
    

    出现的问题

    如果使用a标签指向一个图片,
    你会发现点击链接时它会直接在浏览器中打开图片并显示.
    并不是下载到本地,与我们的初衷相违背
    我们应该如何去解决这个问题了。
    

    尝试了将图片转成Base64或者Blob的办法

    function downloadImgByBlob(url) {
        var img = new Image()
        img.onload = function() {
            var canvas = document.createElement('canvas')
            canvas.width = img.width
            canvas.height = img.height
            var ctx = canvas.getContext('2d')
            // 将img中的内容画到画布上
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
            // 将画布内容转换为Blob
            canvas.toBlob((blob) => {
                // blob转为同源url
                var blobUrl = window.URL.createObjectURL(blob)
                // 创建a链接
                var a = document.createElement('a')
                a.href = blobUrl
                a.download = ''
                // 触发a链接点击事件,浏览器开始下载文件
                a.click()
            })
        }
    img.src = url
    // 必须设置,否则canvas中的内容无法转换为blob
    img.setAttribute('crossOrigin', 'Anonymous')
    }
    
    function downloadImgByBase64(url) {
        var img = new Image()
        img.onload = function() {
            var canvas = document.createElement('canvas')
            canvas.width = img.width
            canvas.height = img.height
            var ctx = canvas.getContext('2d')
            // 将img中的内容画到画布上
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
            // 将画布内容转换为base64
            var base64 = canvas.toDataURL()
            // 创建a链接
            var a = document.createElement('a')
            a.href = base64
            a.download = ''
            // 触发a链接点击事件,浏览器开始下载文件
            a.click()
        }
        img.src = url
        // 必须设置,否则canvas中的内容无法转换为base64
        img.setAttribute('crossOrigin', 'Anonymous')
    }
    
    

    出现的问题

    上述两种方法效果都不太理想。因为这两种方法仅支持生成jpeg和png格式图片。如果是gif图,仅能显示第一帧的内容
    

    通过XMLHttpRequest()请求图片链接

    <button @click="myFileDownLoad"> 下载</button>
    
    myFileDownLoad(){
      var x=new XMLHttpRequest();
      x.open("GET", "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1986179278,1118313821&fm=27&gp=0.jpg", true);
      x.responseType = 'blob';
      x.onload=function(){
          var url = window.URL.createObjectURL(x.response)
          var a = document.createElement('a');
          a.href = url
          a.download = '你的下载'
          a.click()
      }
      x.send();
    }
    
    该示例的思路是,通过XMLHttpRequest()请求图片链接,然后获取返回的Blob。那结合上面下载图片的方法,就能下载图片了:
    通过这种方法下载图片,gif图也能够显示正常了。
    注意,上述方法能够兼容大部分浏览器,但是不兼容IE浏览器(不支持download属性)。要兼容IE浏览器需要用其他办法。
    下载的链接好像要是https的才行 (我下载的都是https的图片)
    
    ps:语法
    objectURL = URL.createObjectURL(object);
    参数object;用于创建 URL 的 File 对象、Blob 对象或者 MediaSource(媒体资源) 对象。
    返回值:该URL可用于指定源 object的内容
    

    文件下载 既可以下载图片又可以任意文件类型[xls,word,mp4]

    function downLoad(item) {
    //filePathUrl是一个https的地址哈。
                if (item.filePathUrl) {
                    // 下载https的图片
                    let fileType = item.fileName.split('.').pop()
                    let canDownFileType = ['jpg', 'png', 'gif', 'webp', 'jpeg']
                    if (canDownFileType.indexOf(fileType) != -1) {
                        // 下载的是图片
                        var x = new XMLHttpRequest()
                        x.open('GET', item.filePathUrl, true)
                        x.responseType = 'blob'
                        x.onload = function (e) {
                            var url = window.URL.createObjectURL(x.response)
                            var a = document.createElement('a')
                            a.href = url
                            a.download = item.fileName //图片的下载名称
                            a.click()
                        }
                        x.send()
                    } else {
                        // // 下载的是文件类型的,
                        var url = item.filePathUrl
                        var xhr = new XMLHttpRequest()
                        xhr.open('GET', url, true)
                        xhr.responseType = 'blob'
                        xhr.onload = function () {
                            if (xhr.status === 200) {
                                var blob = xhr.response
                                var link = document.createElement('a')
                                var body: any = document.querySelector('body')
                                link.href = window.URL.createObjectURL(blob)
                                link.download = item.fileName
                                link.style.display = 'none'
                                body.appendChild(link)
                                link.click()
                                body.removeChild(link)
                            }
                        }
                        xhr.send()
                    }
                } else {
                    window.$message.error('资源地址不存在')
                }
            }
    
    

    继续优化可以通过http下载任意文件

    function downLoad = (url, item) => {
    	var xhr = new XMLHttpRequest()
    	xhr.open('GET', url, true)
    	xhr.responseType = 'blob'
    	xhr.onload = function () {
    		if (xhr.status === 200) {
    			var blob = xhr.response
    			var link = document.createElement('a')
    			var body: any = document.querySelector('body')
    			link.href = window.URL.createObjectURL(blob)
    			link.download = item.name
    			link.style.display = 'none'
    			body.appendChild(link)
    			link.click()
    			body.removeChild(link)
    		}
    	}
    	xhr.send()
    }
    
    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    Bootstrap入门(八)组件2:下拉菜单
    Bootstrap入门(七)组件1:字体图标
    Bootstrap入门(六)按钮和图片
    Bootstrap入门(五)表单
    Bootstrap入门(四)表格
    Bootstrap入门(三)<p>标签的css样式
    Bootstrap入门(二)栅格
    Bootstrap入门(一)准备
    shellcode加密与解密
    功能强大而又简单易学的编程语言Python
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/15214432.html
Copyright © 2011-2022 走看看