[英]Upload File operation using FastAPI does not work on Deta Cloud Platform
當我通過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)
Deta 非常嚴格。 如Technical Specifications所示,Deta Micros(微型服務器)提供了一個只讀文件系統,只能寫入/tmp
,它有 512 MB 的存儲限制。
Deta 提供了兩個額外的服務,即Deta Base (一個完全托管的 NoSQL 數據庫,您可以使用它來存儲、查詢、更新和刪除數據庫中的記錄)和Deta Drive (一個可擴展的文件存儲服務,您可以使用它上傳和存儲文件)。
Deta Drive 是您應該尋找的那種。 但是,根據文檔,Deta Micros 的 HTTP 負載大小限制為 5.5 MB,這意味着如果您想上傳大於 5.5 MB 的文件,則不能——除非您將文件分塊上傳到 API 5.5 MB,然后從您的 API 將文件重新上傳到 Deta Drive,如果文件大小小於 10 MB,則使用此端點; 否則,如果文件大於 10 MB,則必須使用chunked upload 分塊上傳文件。 根據上傳分塊部分:
每個塊必須至少為 5 Mb,最多為 10 Mb。 最終塊可以小於 5 Mb。
從您提供的代碼片段來看,您似乎正在使用pathlib
模塊中的Path
將文件寫入/tmp
目錄。 請嘗試指定路徑而不使用pathlib
模塊,以及嘗試以./
開頭指定目錄,例如:
path = Path("./tmp") / file.filename
你說你得到一個Internal Server Error
,這是一個非常普遍的錯誤,並且很少說明錯誤的性質。 相反,您應該查看服務中的實際日志(可以在此處找到logging
示例),它會告訴您是什么導致應用程序失敗。 如果您提供了完整的回溯,那將真正有助於確定問題。
該錯誤是由於缺少poppler-utils
而發生的,與 FastApi 無關。
我的程序需要 linux 包poppler-utils
來處理 pdf 文件。 由於 Deta cloud 沒有並且不允許用戶執行任何... apt install...
命令,因此發生了上述錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.