python 使用FastAPI的上传文件操作在数据云平台上不起作用

dgsult0t  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(241)

当我通过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)
yh2wf1be

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模块来指定路径,并尝试以./开头来指定目录,例如:

path = Path("./tmp") / file.filename

你说你得到了一个Internal Server Error,这是一个非常常见的错误,几乎没有说明错误的性质。你应该看看你的服务的实际日志(logging的例子可以在here中找到),它会告诉你是什么导致了应用失败。如果你提供了完整的追溯,它将真正有助于识别问题。

wb1gzix0

wb1gzix02#

由于缺少poppler-utils而发生错误,与FastApi无关。
我的程序需要Linux包poppler-utils来处理PDF文件。由于德塔云没有一个,不允许用户执行任何... apt install ...命令,发生了上述错误。

相关问题