CDN(内容分发网络)是现代互联网架构中不可或缺的一部分,它通过将内容缓存到离用户更近的服务器上,从而加快内容传输速度、减轻源服务器负载并提高整体用户体验,本文将详细介绍如何利用CDN下载资源,包括使用<a>标签和window.open()函数两种主要方法。
一、使用标签下载CDN资源
HTML5中的<a>标签提供了一种简便的方法来创建超链接,通过给<a>标签添加download属性,可以强制浏览器下载链接的资源而不是在新标签页中打开它。
未添加download属性的情况
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Download Example</title> </head> <body> <img src="https://img2020.cnblogs.com/blog/1456655/202110/1456655-20211004112059587-1816740282.png" alt="cdn and object storage"/> <a href="https://img2020.cnblogs.com/blog/1456655/202110/1456655-20211004112059587-1816740282.png">点击下载图片</a> </body> </html>
上述代码中,点击“点击下载图片”链接时,图片会在新标签页中打开,而不会开始下载。
添加download属性后
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Download Example</title> </head> <body> <img src="https://img2020.cnblogs.com/blog/1456655/202110/1456655-20211004112059587-1816740282.png" alt="cdn and object storage"/> <a href="https://img2020.cnblogs.com/blog/1456655/202110/1456655-20211004112059587-1816740282.png" download="cdn_and_object_storage.png">点击下载图片</a> </body> </html>
在这段代码中,当点击“点击下载图片”链接时,会弹出路径选择窗口,用户可以保存图片到本地。
注意事项
同源策略:如果非同一端口下直接下载第三方文件,download属性可能会失效,这种情况下,需要用JavaScript将资源按照二进制流的方式读取,然后生成一个URL绑定到<a>标签的href属性中。
二、使用window.open()函数下载CDN资源
另一种方法是使用JavaScript的window.open()函数来实现下载功能,这种方法适用于所有类型的文件,包括图片、视频、PDF等。
示例代码
function downloadByURL(url, fileName) { fetch(url, { responseType: 'blob' }) .then(response => { const link = document.createElement('a'); link.href = window.URL.createObjectURL(new Blob([response.data], { type: response.headers['content-type'] })); link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); }) .catch(error => console.error('Error downloading the file:', error)); }
使用方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Download Example</title> <script> function downloadByURL(url, fileName) { fetch(url, { responseType: 'blob' }) .then(response => { const link = document.createElement('a'); link.href = window.URL.createObjectURL(new Blob([response.data], { type: response.headers['content-type'] })); link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); }) .catch(error => console.error('Error downloading the file:', error)); } </script> </head> <body> <button onclick="downloadByURL('https://img2020.cnblogs.com/blog/1456655/202110/1456655-20211004112059587-1816740282.png', 'cdn_and_object_storage.png')">点击下载图片</button> </body> </html>
在这段代码中,当点击按钮时,会触发downloadByURL函数,该函数会从指定的URL下载文件并将其保存为指定的文件名。
三、常见的CDN资源库推荐
为了方便开发者快速获取和使用各种前端资源,以下是一些国内外常用的静态文件CDN资源库:
国内静态文件公共库
名称 | URL |
BootCDN | https://www.bootcdn.net/ |
七牛云开放存储文件托管 | http://www.staticfile.org/ |
字节跳动静态资源 | http://lib.bytedance.com/ |
腾讯网静态资源库 | http://lib.sinaapp.com/ |
新浪云计算CDN公共库 | http://lib.sinaapp.com/ |
又拍云JS CDN服务 | http://jscdn.upai.com/ |
腾讯网静态资源库 | http://lib.qq.com/ |
国外静态文件公共库
名称 | URL | |
Google Hosted Libraries | https://developers.google.com/speed/libraries/ | |
Microsoft Ajax CDN | https://docs.microsoft.com/en-us/aspnet/ajax/cdn/overview | |
CDNJS | http://www.cdnjs.com/ | |
Cloudflare | https://www.cloudflare.com/ | |
MaxCDN | https://www.maxcdn.com/ | |
jsDelivr | https://www.jsdelivr.com/ | |
Unpkg | https://unpkg.com/ | |
OpenCDN | https://www.opencdn.com/ | |
jsCombo | http://www.jscombo.com/ | |
BootstrapCDN | https://www.bootstrapcdn.com/ | |
jQuery CDN | https://code.jquery.com/ | |
Microsoft Ajax CDN | https://ajax.aspnetcdn.com/ajax/jQuery/ | |
EdgeDefl | https://www.edgecastcdn.net/cdn-cgi/pe/boot-vzletyqwkfgjt-cdn.js | |
KeyCDN | https://www.keycdn.com/ | |
jsDelivr | https://www.jsdelivr.com/ | |
jsCombo | http://www.jscombo.com/ | |
BootstrapCDN | https://www.bootstrapcdn.com/ | |
jQuery CDN | https://code.jquery.com/ | |
Microsoft Ajax CDN | https://ajax.aspnetcdn.com/ajax/jQuery/ | |
EdgeDefl | https://www.edgecastcdn.net/cdn-cgi/pe/boot-vzletyqwkfgjt-cdn.js | |
KeyCDN | https://www.keycdn.com/ | |
jsDelivr | https://www.jsdelivr.com/ | |
jsCombo | http://www.jscombo.com/ | |
BootstrapCDN | https://www.bootstrapcdn.com/ | |
jQuery CDN | https://code.jquery.com/ | |
Microsoft Ajax CDN | https://ajax.aspnetcdn.com/ajax/jQuery/ | |
EdgeDefl | https://www.edgecastcdn.net/cdn-cgi/pe/boot-vzletyqwkfgjt-cdn.js | |
KeyCDN | https://www.keycdn.com/ | |
jsDelivr | https://www.jsdelivr.com/ | |
jsCombo | http://www.jscombo.com/ | |
BootstrapCDN | https://www.bootstrapcdn.com/ | |
jQuery CDN | https://code.jquery.com/ | |
Microsoft Ajax CDN | https://ajax.aspnetcdn.com/ajax/jQuery/ | |
EdgeDefl | https://www.edgecastcdn.net/cdn-cgi/pe/boot-vzletyqwkfgjt-cdn.js | |
KeyCDN | https://www.keycdn.com/ | |
jsDelivr | https://www.jsdelivr.com/ | |
jsCombo | http://www.jscombo.com/ | |
BootstrapCDN | https://www.bootstrapcdn.com/ | |
jQuery CDN | https://code.jquery.com/ | |
Microsoft Ajax CDN | https://ajax.aspnetcdn.com/ajax/jQuery/ | |
EdgeDefl | https://www.edgecastcdn.net/cdn-cgi/pe/boot-vzletyqwkfgjt-cdn.js | |
KeyCDN | https://www.keycdn.com/ | |
jsDelivr | https://www.jsdelivr.com/ | og |
这些CDN资源库提供了丰富的前端资源,可以大大减少开发者自行托管资源的负担,提高网站加载速度和用户体验。
问题1:如何使用<a>标签下载CDN资源?
答:可以通过在<a>标签中添加download属性来实现下载功能。
<a href="https://example.com/image.png" download="image.png">点击下载图片</a>
这样,当点击链接时,浏览器会提示用户保存图片到本地。
问题2:为什么有时候download属性不起作用?
答:这通常是由于浏览器的同源策略导致的,如果非同一端口下直接下载第三方文件,download属性可能会失效,解决方法是用JavaScript将资源按照二进制流的方式读取,然后生成一个URL绑定到<a>标签的href属性中。
function downloadByURL(url, fileName) { fetch(url, { responseType: 'blob' }) .then(response => { const link = document.createElement('a'); link.href = window.URL.createObjectURL(new Blob([response.data], { type: response.headers['content-type'] })); link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); }) .catch(error => console.error('Error downloading the file:', error)); }
这样,即使跨域也能实现下载功能。
问题3:如何选择合适的CDN资源库?
答:选择合适的CDN资源库需要考虑以下几个因素:
稳定性:选择有良好口碑和稳定服务的CDN资源库。
速度:尽量选择靠近用户群体的CDN节点,以提高访问速度。
资源丰富度:选择提供丰富资源的CDN库,以满足项目需求。
兼容性:确保所选CDN库支持主流浏览器和设备。
成本:考虑CDN服务的费用,选择性价比高的服务。
通过以上方法和建议,开发者可以轻松实现CDN资源的下载,提升网站的加载速度和用户体验,希望本文对您有所帮助!
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1469302.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复