python fastapi 通过html页面上传一个压缩文件,然后解压缩到一个文件夹下
时间: 2024-09-18 22:09:44 浏览: 86
在Python中,你可以使用FastAPI框架构建API来处理HTML页面上传的压缩文件,并将其解压到指定目录。首先,你需要安装一些必要的库,如`fastapi`, `uvicorn`, `python-multipart` (用于处理文件上传),以及`zipfile` (用于解压缩)。
以下是一个简单的步骤概述:
1. **设置项目结构**:
- 创建一个名为`app.py`的文件,这是你的主应用入口。
- 定义一个包含HTML模板的静态目录,例如`templates`,这里创建一个用于上传的HTML表单。
2. **导入必要的库**:
```python
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import HTMLResponse
import zipfile
import os
```
3. **配置FastAPI应用程序**:
```python
app = FastAPI()
UPLOAD_DIR = "./uploads" # 设置文件上传目录
UNZIP_DIR = "./unzipped_files" # 设置解压后的文件夹
if not os.path.exists(UPLOAD_DIR):
os.makedirs(UPLOAD_DIR)
if not os.path.exists(UNZIP_DIR):
os.makedirs(UNZIP_DIR)
```
4. **定义路由处理文件上传和解压**:
```python
@app.post("/upload-zip")
async def upload_zip(file: UploadFile = File(...)):
file_name = file.filename
file_path = os.path.join(UPLOAD_DIR, file_name)
try:
with open(file_path, "wb") as f:
await file.readinto(f)
except Exception as e:
raise HTTPException(status_code=400, detail="Failed to save the file.")
try:
with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall(UNZIP_DIR)
except zipfile.BadZipFile:
raise HTTPException(status_code=400, detail="Invalid zip file.")
finally:
# 清理已保存的临时文件
os.remove(file_path)
return {"message": f"{file_name} uploaded and unzipped successfully."}
@app.get("/")
async def form_upload():
return HTMLResponse(content=open("templates/upload.html", "r").read())
```
5. **创建HTML表单**(假设在`templates/upload.html`):
```html
<!DOCTYPE html>
<html lang="en">
<head>
<!-- ... -->
</head>
<body>
<form action="/upload-zip" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept=".zip">
<button type="submit">Upload</button>
</form>
</body>
</html>
```
6. **运行应用**:
在命令行里,使用`uvicorn app:app --reload`启动服务。
现在,用户可以访问`http://localhost:8000/`并选择一个压缩文件上传。上传完成后,FastAPI会自动解压并将结果放在`./unzipped_files`目录下。
阅读全文