FastAPI实现从CDN/FTP服务器下载Excel文件的最优方案问询
FastAPI实现通过URL保存/读取服务器上的Excel文件
针对你需要通过API端点传入Excel文件URL来实现保存或读取的需求,这里提供更简洁高效的实现方案,替代原有的urllib代码:
依赖安装
首先安装所需的库:
pip install fastapi requests pandas uvicorn
完整实现代码
from fastapi import FastAPI, HTTPException import requests import pandas as pd from pathlib import Path app = FastAPI() # 从URL下载并保存Excel文件到本地 def save_excel_from_url(file_url: str, save_path: str = "./downloaded_excel.xlsx") -> bool: try: # 流式下载,分块写入避免大文件占用过多内存 with requests.get(file_url, stream=True, timeout=30) as resp: resp.raise_for_status() # 触发HTTP错误(如404、500) with open(save_path, 'wb') as f: for chunk in resp.iter_content(chunk_size=8192): f.write(chunk) return True except Exception as e: print(f"保存失败: {str(e)}") return False # 直接从URL读取Excel内容(无需保存到本地) def read_excel_from_url(file_url: str) -> pd.DataFrame: try: with requests.get(file_url, timeout=30) as resp: resp.raise_for_status() # 从字节流直接解析Excel return pd.read_excel(resp.content) except Exception as e: raise HTTPException(status_code=400, detail=f"读取失败: {str(e)}") # API端点:保存Excel到服务器本地 @app.post("/save-excel") async def save_excel(file_url: str, save_path: str = "./downloaded_excel.xlsx"): if save_excel_from_url(file_url, save_path): return {"msg": f"文件已保存至 {save_path}"} raise HTTPException(status_code=400, detail="保存失败,请检查URL有效性或文件权限") # API端点:直接读取并返回Excel内容 @app.get("/read-excel") async def read_excel(file_url: str): df = read_excel_from_url(file_url) return { "columns": df.columns.tolist(), "data": df.to_dict(orient="records") }
关键优化点
- 替代urllib:用
requests库简化HTTP/FTP请求代码,可读性和扩展性更强 - 流式处理:大文件下载时用分块写入,避免内存溢出
- 双模式支持:既可以保存文件到服务器本地,也可以直接读取内容返回,无需落地文件
- 错误处理:捕获网络异常、HTTP错误、Excel解析错误,返回明确的错误信息
- FTP支持:requests默认支持FTP URL,若需认证可在
requests.get中添加auth=("用户名", "密码")参数
使用方法
- 启动服务:
uvicorn main:app --reload
- 调用保存接口(POST请求):
- 示例:
http://localhost:8000/save-excel?file_url=ftp://server/path/to/file.xlsx&save_path=./my_excel.xlsx
- 示例:
- 调用读取接口(GET请求):
- 示例:
http://localhost:8000/read-excel?file_url=http://example.com/file.xlsx
- 示例:
注意事项
- 生产环境建议限制允许访问的URL域名,避免安全风险
- 若处理超大Excel文件,可考虑增加内存限制或异步处理逻辑
- 确保服务器有足够的磁盘空间用于保存文件
内容的提问来源于stack exchange,提问作者rafaelHTML
相关产品推荐
相关产品推荐

