当我通过uvicorn main:app
运行这段代码时,一切都正常,但是当我使用Deta运行它时,我得到了Internal Server Error
,只有GET
端点正常(POST
端点甚至没有按照它应该被调用的那样被调用)。
import os
from pathlib import Path
from fastapi import FastAPI, Form, UploadFile
from fastapi.responses import FileResponse, HTMLResponse
from pdfpad import pdfpad, save_pdf
app = FastAPI()
@app.post("/processfile/")
async def process_file(file: UploadFile) -> FileResponse:
path = file.filename
if os.getenv("DETA_RUNTIME") == "true":
path = Path("/tmp") / file.filename
saved_path = save_pdf(pdfpad(await file.read()), path)
return FileResponse(saved_path)
@app.get("/")
async def main():
content = """
<body>
<form action="/processfile/" enctype="multipart/form-data" method="post" id="form1">
<label for file>Choose PDF:</label>
file: <input name="file" type="file" form="form1">
<br><br>
<input type="submit">
</form>
</body>
"""
return HTMLResponse(content=content)
2条答案
按热度按时间yh2wf1be1#
Deta的限制性很强,如技术规格所示,Deta Micros(微服务器)提供了一个只读文件系统,只能写入
/tmp
,存储限制为512 MB。Deta提供了两个额外的服务,即Deta Base(一个完全托管的NoSQL数据库,您可以使用它来存储、查询、更新和删除数据库中的记录)和Deta Drive(一个可扩展的文件存储服务,您可以使用它来上传和存储文件)。
然而,根据文档,Deta Micros的HTTP有效负载大小限制为5.5 MB,这意味着如果您想上传一个大于5.5 MB的文件,您不能上传-除非您将文件以5.5 MB为单位上传到您的API,然后从您的API重新上传文件到Deta Drive。如果文件大小小于10 MB,则使用此端点;否则,如果文件大于10 MB,则必须使用分块上传来分块上传文件。
每个区块的大小必须至少为5 Mb,最多为10 Mb。最后一个区块可以小于5 Mb。
从您提供的程式码片段来看,您似乎要使用
pathlib
模块中的Path
,将档案写入/tmp
目录。请尝试不使用pathlib
模块来指定路径,并尝试以./
开头来指定目录,例如:你说你得到了一个
Internal Server Error
,这是一个非常常见的错误,几乎没有说明错误的性质。你应该看看你的服务的实际日志(logging
的例子可以在here中找到),它会告诉你是什么导致了应用失败。如果你提供了完整的追溯,它将真正有助于识别问题。wb1gzix02#
由于缺少
poppler-utils
而发生错误,与FastApi无关。我的程序需要Linux包
poppler-utils
来处理PDF文件。由于德塔云没有一个,不允许用户执行任何... apt install ...
命令,发生了上述错误。