我想上传一个文件,该文件将使用可以具有多个参数的包进行分析。例如,我想上传音频文件,然后检查一些可选参数来分析该音频。以下是前端的示例:
但是,我不太明白如何在 API 中实现这一点。谁能帮帮我吗?
这是我到目前为止的代码:
class audiofILE(BaseModel):
name : str
speech : str
music: str
noise: str
app = FastAPI()
templates = Jinja2Templates(directory="template")
@app.get('/home/{user_name}', response_class=HTMLResponse)
def write_home(request: Request, user_name: str):
return templates.TemplateResponse("basic_form.html", {"request": request, "username": user_name})
@app.post("/submitform")
async def handle_form(assignment: str = Form(...), audioFile: UploadFile = File(...)):
try:
seg = Segmenter()
segmentation = seg(audioFile.filename)
segmentation_1 = pd.DataFrame.from_records(segmentation, columns=['labels', 'start', 'stop'])
if noise :
result =
return HTMLResponse(content=segmentation_1.to_html(), status_code=200)
except Exception as e:
return HTMLResponse(content={'message': str(e)}, status_code=400)
HTML 代码:
<!DOCTYPE html>
<html>
<head>
<title>Awesome Form</title>
<link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
<h1>Super Realistic Form</h1>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="checkbox" id="multiply_by_2" name="multiply_by_2" value="True">
<input type="submit" value="Submit">
</form>
</body>
</html>
如有任何帮助,我们将不胜感激,谢谢。
最佳答案
请查看this answer的方法1 ,其中提供了有关如何提交 Form
的示例。和File
数据在一起。
在您的示例中,您必须确保包含 action
HTML <form>
中的属性(指定处理表单提交的 URL) ,以及定义 name
属性(指定 <input>
元素的名称),使用您为端点中的参数声明的相同键/名称。您可以将音频文件附带的各种参数声明为 Optional
与 False
作为默认值,并让前端发送 True
仅当用户选择它们时。
工作示例:
app.py
from fastapi import FastAPI, Form, File, UploadFile, Request
from typing import Optional
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory='templates')
@app.post('/submit')
def submit(
speech: Optional[bool] = Form(False),
music: Optional[bool] = Form(False),
noise: Optional[bool] = Form(False),
audio: UploadFile = File(...)
):
if noise:
print('Noise has been selected')
return {'speech': speech, 'music': music, 'noise': noise, 'file': audio.filename}
@app.get('/', response_class=HTMLResponse)
def main(request: Request):
return templates.TemplateResponse('index.html', {'request': request})
模板/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form method="post" action="/submit" enctype="multipart/form-data">
<input type="checkbox" id="speech" name="speech" value="True">
<label for="speech">Speech</label><br>
<input type="checkbox" id="music" name="music" value="True">
<label for="music">Music</label><br>
<input type="checkbox" id="noise" name="noise" value="True">
<label for="noise">Noise</label><br><br>
<label for="audio">Choose audio file</label>
<input type="file" id="audio" name="audio" onchange="enableSubmitBtn();"><br><br>
<input type="submit" id="submitBtn" value="submit" disabled>
</form>
<script>
function enableSubmitBtn() {
document.getElementById('submitBtn').removeAttribute("disabled");
}
</script>
</body>
</html>
关于python - 将文件上传到 FastAPI 时如何使用 HTML 复选框发送可选参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74307876/