python下载jsdelivr的内容

jsdelivr被不能访问后,好多引用要修改成本地,需要把引用下载下来。这个脚本就是这个作用!

import urllib.request
import requests
import re, os

def get_file(url):
    '''
    递归下载网站的文件
    :param url:
    :return:
    '''

    if isFile(url):
        print(url)
        try:
            download(url)
        except:
            pass
    else:
        urls = get_url(url)
        for u in urls:
            get_file(u)

<think>我们参考了用户提供的引用内容,特别是引用[1]和引用[3]。 引用[1]展示了使用Vue+axios实现文件下载的前端代码,其中使用了axios发送POST请求,并设置responseType为'blob',然后通过一个自定义的download方法处理响应。 引用[3]展示了Flask+html+axios的前后端交互,前端使用Vue和axios获取后端数据并显示。 用户需求:使用Python(后端)、HTML和Axios(前端)实现文件下载。 方案: 1. 后端(Python)使用Flask框架,提供一个文件下载的接口。 2. 前端(HTML)使用Vue和Axios发起请求,并处理文件下载。 步骤详解: 后端(Flask)部分: - 创建一个路由,用于处理文件下载请求。 - 根据请求参数(如果需要的话)生成或获取要下载的文件。 - 使用send_file函数返回文件,或者使用make_response设置响应头为文件下载类型。 前端部分: - 使用Axios发送请求(GET或POST),设置responseType为'blob'(重要,用于处理二进制流)。 - 在响应中,将返回的Blob数据转换为可下载的URL,并触发浏览器的下载。 注意:由于浏览器的安全策略,前端下载文件通常需要用户触发(比如点击按钮),所以我们的下载请求应该在用户点击按钮后发起。 代码示例: 后端Python(Flask)代码: ```python from flask import Flask, send_file app = Flask(__name__) @app.route('/download', methods=['GET', 'POST']) def download_file(): # 假设我们有一个文件叫做example.txt,位于当前目录的files文件夹下 file_path = "files/example.txt" # 使用send_file发送文件,并设置下载时的文件名(可选) return send_file(file_path, as_attachment=True, download_name='example.txt') if __name__ == '__main__': app.run(port=5000) ``` 前端HTML/Vue/Axios代码: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>File Download Example</title> <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div id="app"> <button @click="downloadFile">下载文件</button> </div> <script> const { createApp, ref } = Vue createApp({ setup() { const downloadFile = () => { // 发送请求到后端下载接口 axios({ method: 'get', // 也可以是post,根据后端接口设计 url: 'http://localhost:5000/download', responseType: 'blob' // 重要:指定响应类型为blob }).then(response => { // 创建一个Blob对象 const blob = new Blob([response.data]); // 创建一个指向该Blob的URL const downloadUrl = window.URL.createObjectURL(blob); // 创建一个<a>标签 const link = document.createElement('a'); link.href = downloadUrl; // 设置下载属性(文件名) link.setAttribute('download', 'example.txt'); // 将<a>标签添加到DOM中并模拟点击 document.body.appendChild(link); link.click(); // 清理:移除<a>标签和释放Blob URL document.body.removeChild(link); window.URL.revokeObjectURL(downloadUrl); }).catch(error => { console.error('下载失败:', error); }); }; return { downloadFile } } }).mount('#app') </script> </body> </html> ``` 说明: 1. 后端使用Flask的send_file函数,设置as_attachment=True可以让浏览器以附件形式下载(即弹出下载对话框),download_name可以指定下载时默认的文件名。 2. 前端通过axios请求时,设置responseType:'blob',这样axios会把响应数据作为Blob对象处理。 3. 前端创建Blob对象的URL,通过动态创建<a>标签并设置download属性来触发下载。 注意事项: - 跨域问题:如果前端和后端不在同一个域,需要后端设置CORS支持。 - 错误处理:前端代码中应加入错误处理,如catch部分。 - 文件类型:如果需要下载不同类型的文件,后端应正确设置MIME类型,但Flask的send_file会自动处理。如果手动设置,可以使用mimetype参数。 相关问题: 1. 如何实现带参数的文件下载(例如根据用户选择下载不同的文件)? 2. 如何在后端动态生成文件(例如生成Excel报表)并提供下载? 3. 如何处理大文件下载,避免内存溢出? 4. 如何实现下载进度显示? </think>### 使用 Python、HTML 和 Axios 实现文件下载的方法 #### 核心实现原理 1. **后端(Python/Flask)**:创建文件下载路由,设置响应头指定文件类型和下载行为 2. **前端(HTML/Axios)**: - 发送请求时设置 `responseType: 'blob'` 接收二进制数据 - 将响应数据转换为可下载的 URL - 动态创建 `<a>` 标签触发下载 #### 完整示例代码 ##### 后端 Python (Flask) ```python from flask import Flask, send_file app = Flask(__name__) @app.route('/download') def download_file(): # 文件路径(示例文本文件) file_path = "example.txt" # 创建示例文件(实际使用时替换为真实文件) with open(file_path, 'w') as f: f.write("这是通过Axios下载的文件内容") # 发送文件并设置下载文件名 return send_file( file_path, as_attachment=True, download_name="自定义文件名.txt" # 用户下载时显示的文件名 ) if __name__ == '__main__': app.run(port=5000) ``` ##### 前端 HTML + Axios ```html <!DOCTYPE html> <html> <head> <title>文件下载示例</title> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <button onclick="downloadFile()">下载文件</button> <script> function downloadFile() { axios({ method: 'get', url: 'http://localhost:5000/download', responseType: 'blob' // 关键:指定响应类型为二进制流 }).then(response => { // 创建Blob对象 const blob = new Blob([response.data]); // 创建下载链接 const downloadUrl = window.URL.createObjectURL(blob); const link = document.createElement('a'); // 设置下载属性 link.href = downloadUrl; link.setAttribute('download', '下载的文件.txt'); // 下载文件名 // 触发下载 document.body.appendChild(link); link.click(); // 清理资源 document.body.removeChild(link); window.URL.revokeObjectURL(downloadUrl); }).catch(error => { console.error('下载失败:', error); }); } </script> </body> </html> ``` #### 关键配置说明 1. **后端必需响应头**: ```python # Flask 自动添加的下载相关响应头: # Content-Disposition: attachment; filename="自定义文件名.txt" # Content-Type: application/octet-stream ``` 2. **Axios 关键参数**: ```javascript responseType: 'blob' // 必须设置以正确处理二进制文件 ``` 3. **前端下载流程**: ```mermaid graph LR A[点击下载按钮] --> B[Axios请求] B --> C{后端返回二进制流} C --> D[创建Blob对象] D --> E[生成临时URL] E --> F[创建隐藏A标签] F --> G[触发点击下载] G --> H[清理临时资源] ``` #### 常见问题解决方案 1. **跨域问题**:在后端添加 CORS 支持 ```python from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许所有域名跨域访问 ``` 2. **POST 请求下载**: ```javascript // 前端修改请求方法 axios({ method: 'post', url: '/download', data: { param1: 'value' }, // POST参数 responseType: 'blob' }) ``` 3. **大文件下载优化**: ```python # Flask 使用流式响应 return send_file(file_path, as_attachment=True, conditional=True) ``` #### 相关引用说明 - 文件下载需设置 `responseType: 'blob'` 处理二进制数据 [^1] - POST 请求传递参数的方式 [^2] - 前端基础框架配置参考 [^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值