CDN链接下载或不同域名下载

本文介绍了一种解决CDN链接不能直接用于下载的方法:通过AJAX请求转换为二进制流并创建下载链接。同时提供了批量下载实现及解决跨域问题的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景: 后端返回的下载链接为cdn链接,而cdn链接不能直接作为下载的链接地址

解决方案(步骤):

1. 向后端请求得到CDN的下载地址

2. 通过ajax的方式向cdn链接请求

3. 将请求得到的结果转成二进制流

4. 再将其变成一个下载的链接赋值给a标签的href属性,并自动触发a标签的下载

  // 这里是批量下载,请求的谷歌云的链接

  const ajax = (url, callback, options) => {
    window.URL = window.URL || window.webkitURL;
    const xhr = new XMLHttpRequest();
    xhr.open('get', url, true);
    if (options.responseType) {
      xhr.responseType = options.responseType;
    }
    xhr.onreadystatechange = () => {
      if (xhr.readyState === 4 && xhr.status === 200) {
        callback(xhr);
      }
    };
    xhr.send();
  };

  // 生成符合可以请求的地址
  const downloadAjax = (url) => {
    const innerurl = url; // 文件地址
    const name = url.replace(/(.*\/)*([^.]+).*/ig, '$2');
    let filename = `${name}.${innerurl.replace(/(.*\.)/, '')}`;
    filename = filename?.split('?')[0];
    return new Promise((resolve) => {
      ajax(innerurl, (xhr) => {
        const p = { xhr, filename };
        resolve(p);
      }, {
        responseType: 'blob',
      });
    });
  };
    
 const downUrlList = [] // 这里是链接的数组
 const arr = [];
    for (let index = 0; index < downUrlList?.length; index++) {
      const url = downUrlList[index];
      arr.push(downloadAjax(url?.replace('http://1.2.3.4', '/gcp')));
      // 本地就需要切换成这个 由于会跨域:'http://1.2.3.4' 这个就需要替换

      // arr.push(downloadAjax(url)); 
      // 生产环境配置好跨域,直接传url就行,在开发环境就需要进行代理解决跨域问题
    }

    Promise.all(arr).then((res) => {
      res.forEach((i) => {
        const { xhr, filename } = i;
        const content = xhr?.response;
        const a = document.createElement('a');
        const blob = new Blob([content]);
        const urls = window.URL.createObjectURL(blob);
        a.href = urls;
        a.download = filename;
        a.click();
        window.URL.revokeObjectURL(urls);
      });
    })

下载时会遇到跨域问题,上面的代理是一种方法,但也可以试一试简单的方式

// 方式一
location.href = 'http://1.2.3.4/2342/2342.jpg'

// 方式二
window.open('http://1.2.3.4/123/2345.png')

有不当之处还望各位大佬指点

### 下载特定域名下的资源 对于下载 `pri-cdn-tx.xiaoeknow` 域名下的文件资源,通常涉及两种主要方法:通过浏览器直接访问下载以及使用命令行工具进行批量下载。 #### 方法一:使用 wget curl 工具 wget 和 curl 是 Linux 系统中常用的两个命令行工具,可以用来从网络上抓取文件。这两个工具同样适用于 Windows 平台(需安装)。下面以 wget 为例说明如何操作: ```bash wget --recursive --no-parent http://pri-cdn-tx.xiaoeknow.com/path/to/resource/ ``` 这条命令会递归地下载指定 URL 及其子页面中的所有文件,但不会超出该站点的范围[--parent 参数的作用][^2]。需要注意的是,某些网站可能会设置 robots.txt 来阻止此类行为;另外,频繁请求可能违反服务条款并导致 IP 被封禁。 #### 方法二:利用 Python 编写脚本自动下载 如果目标网页结构较为复杂者有动态加载的内容,则可以通过编写简单的爬虫程序实现自动化下载过程。这里给出一段基于 requests 库和 BeautifulSoup 解析库的小例子: ```python import os import requests from bs4 import BeautifulSoup def download_file(url, save_path): response = requests.get(url) with open(save_path, 'wb') as f: f.write(response.content) base_url = "http://pri-cdn-tx.xiaoeknow.com" target_page = "/path/to/page.html" response = requests.get(base_url + target_page) soup = BeautifulSoup(response.text, features="html.parser") for link in soup.find_all('a'): href = link.get('href') if not href.startswith("http"): full_link = base_url + href file_name = os.path.basename(full_link) local_save_path = "./downloads/" + file_name try: print(f"Downloading {full_link}") download_file(full_link, local_save_path) except Exception as e: print(e) print("Download completed.") ``` 这段代码遍历 HTML 页面内的 `<a>` 标签,并尝试下载每个链接指向的对象。实际应用时还需要考虑更多细节,比如处理不同类型的媒体文件、过滤不需要的数据等[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值