请问,FastAPI如何获取到前端上传的二进制文件并且返回?

使用FastAPI想要获得前端上传的数据(是一个二进制文件):

from fastapi import FastAPI, Body

app = FastAPI()

@app.post('/callback')
def callback(item = Body(...)):

  return item 

但是我直接返回,这里是报错:
image.png

请问,FastAPI如何获取到前端上传的二进制文件并且返回(可以对其进行打印)?

阅读 203
avatarAI BotBETA

在 FastAPI 中,如果你想获取前端上传的二进制文件并返回或打印,你应该使用 FileUploadFile 类型来处理文件上传。你的当前代码使用了 Body,这通常用于处理 JSON 数据体,而不是文件上传。

以下是一个修正后的示例,展示了如何接收一个二进制文件,打印其内容,并将其返回(虽然直接返回二进制文件内容给前端可能不是很有用,通常你会选择保存文件或返回一些确认信息):

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import StreamingResponse
import io

app = FastAPI()

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):

# 打印文件内容(注意:对于大文件,这样直接打印可能会导致性能问题)
content = await file.read()
print(content)

# 如果你想返回文件内容,可以使用 StreamingResponse
# 注意:这里将内容包装在 BytesIO 对象中以模拟文件流
file_like_object = io.BytesIO(content)
return StreamingResponse(file_like_object, media_type="application/octet-stream")

注意:在实际应用中,你可能希望处理文件保存、错误处理等情况


在这个示例中:

1. 我们使用 `File` 和 `UploadFile` 来处理文件上传。
2. `await file.read()` 读取文件的全部内容为一个字节串(bytes)。
3. `print(content)` 打印文件内容。
4. 使用 `StreamingResponse` 返回一个流响应,其中包含文件的二进制内容。这里为了演示,我们将内容包装在 `io.BytesIO` 对象中。
1 个回答
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
import base64

app = FastAPI()

@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
    try:
        # 读取文件内容
        contents = await file.read()
        
        # 打印文件信息(而不是整个内容)
        print(f"文件名: {file.filename}")
        print(f"文件类型: {file.content_type}")
        print(f"文件大小: {len(contents)} bytes")
        
        # 根据文件类型处理内容
        if file.content_type.startswith('text/'):
            try:
                # 对于文本文件,尝试解码
                text_content = contents.decode('utf-8')
                # 如果文本太长,只返回部分内容
                preview = text_content[:1000] + '...' if len(text_content) > 1000 else text_content
                return JSONResponse(content={
                    "file_type": "text",
                    "content": preview,
                    "size": len(contents)
                })
            except UnicodeDecodeError:
                raise HTTPException(status_code=400, detail="无法解码文件内容,可能不是文本文件")
        else:
            # 对于二进制文件,返回 base64 编码的预览
            # 只编码前 100 字节作为预览
            preview = base64.b64encode(contents[:100]).decode('utf-8')
            return JSONResponse(content={
                "file_type": "binary",
                "content_type": file.content_type,
                "preview": preview,
                "size": len(contents)
            })
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"文件处理错误: {str(e)}")

# 启动命令:uvicorn main:app --reload
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏