js直接下载MP3等各类多媒体文件

以前下载一个文件,一般就是通过后端提供接口,或者通过window.open来下载,但是随着需求的发展,文件会动态生成或者文件会存放在一个专门的静态服务器上面,这个时候就需要前端直接下载了,通过window.open这种方式已经不能满足了,因为它只是打开一个新的页面,不是真正的下载。

事实上跳转后是MP3的播放页面,并不是直接下载,而且而且有兼容性问题。

利用 Blob对象进行下载

Blob(Binary Large Object)翻译成中文就是大型的二进制对象,不仅仅在js中有,在各种语言中都有,它是一种通用的数据格式

源码如下,源码中规避了一些兼容性问题,如微信、钉钉、QQ不支持直接下载,检测环境后会提示复制代码到自带浏览器中打开下载。

<div class="down-audio xiazai" href="javascript:;"  data-href="https://cdn.xxxx.cn/test.mp3" data-name="
test.mp3">
                            <img src="/guangwangmobile/audiom/picture/ic_download_audio_3.png">
                            <div class="down-audio-text">下载音频</div>
                        </div>




<script src="/static/js/layui/layui.all.js"  type="text/javascript"></script>
<script>

 layui.use(['layer', 'form'], function () {
                    var layer = layui.layer, form = layui.form;     
        
              
        $('.xiazai').on('click', function() {
              
    		    
    	  var userAgentStr = window.navigator.userAgent;
    // 	  alert(userAgentStr);
    	  if(/MicroMessenger/.test(userAgentStr)){
    	   //   c=$(this).attr('data-href');
    	   var currentPageUrl = window.location.href;
    	      navigator.clipboard.writeText(currentPageUrl).then(function() {
                    layer.msg("链接复制成功,请通过手机自带浏览器下载", { time: 3000});
		            return false; 
                }).catch(function(error) {
                     layer.msg("请复制链接在手机自带浏览器打开", { time: 3000});
		             return false; 
                });
        	}else if(/DingTalk/.test(userAgentStr)||/baidu/.test(userAgentStr)||/QQ/.test(userAgentStr)){
        	   var currentPageUrl = window.location.href;
	                $("#hide").attr('value',currentPageUrl);//这里可以获取动态数据赋值给$("#hide").val()
                  $("#hide").select();
                  try {var state = document.execCommand("copy");}
                  catch(err){var state = false;}
                  if(state){
                    layer.msg("链接复制成功,请通过手机自带浏览器下载", { time: 3000});
		            return false; 
                  }else{
                      layer.msg("请复制链接在手机自带浏览器打开", { time: 3000});
		             return false; 
                  }
        	}else{
        	   //方法一 
        	     var url=$(this).attr('data-href');
             var name=$(this).attr('data-name');
            fetch(url)
            .then(res => res.blob())
            .then(blob => {
            const a = document.createElement("a");
            const objectUrl = window.URL.createObjectURL(blob);
            a.download = name;
            a.href = objectUrl;
            a.click();
            window.URL.revokeObjectURL(objectUrl);
            a.remove();
            })  
//方法二
 // var url=$(this).attr('data-href');
            //       var name=$(this).attr('data-name');
            // 	  var type=$(this).attr('data-type');
            // 	  const x = new XMLHttpRequest()
            //       x.open("GET", url, true)
            //       x.responseType = "blob"
            //     //   x.setRequestHeader('Content-type', 'audio/mp3');
            //       x.onload = function () {
            //         const blob = x.response
            //         const url = window.URL.createObjectURL(blob)
            //         // 判断是否是IE浏览器
            //         if (window.navigator.msSaveBlob) {
            //           try {
            //             window.navigator.msSaveBlob(blob, name)
            //           } catch (e) {}
            //         } else {
            //           const a = document.createElement("a");
            //           document.body.appendChild(a);
            //           a.href = url;
            //           a.download = name;
            //           a.click();
            //           document.body.removeChild(a);
            //           window.URL.revokeObjectURL(url);
            //         }
            //       }
            //       x.send();


        	}
          
    
      })
      
 });   
    </script>