使用 curl 将文件上传到 FastAPI 端点 - 307 临时重定向

Posted

技术标签:

【中文标题】使用 curl 将文件上传到 FastAPI 端点 - 307 临时重定向【英文标题】:uploading flie to FastAPI endpoint using curl - 307 Temporary Redirect 【发布时间】:2021-11-24 13:25:40 【问题描述】:

我有一个 fastAPI 端点,它接收文件并将其保存到磁盘,如下所示:

from fastapi import FastAPI, File, UploadFile
import shutil

app = FastAPI()

@app.post('/upload')
async def upload_file(file: UploadFile=File(...)):
    with open(file.filename, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    return 
        "filename": file.filename,
    

当我通过http://localhost:8000/docs 的文档界面上传文件时,这可以正常工作 我可以选择一个文件并成功上传。

但是,尝试使用 curl 失败:

curl -X POST localhost:8000/upload -F file=@photo.png

curl 命令不返回任何内容,并且在服务器端记录了 307 Temporary Redirect

我不确定我在这里缺少什么

【问题讨论】:

您是从运行 http://localhost:8000/docs 的同一台本地计算机上执行 curl 吗?你卷曲看起来不错。如果你尝试使用完整的地址 `curl -X 'POST' '127.0.0.1:8000/upload' -F 'file=@photo.png',你会得到什么?如果请求重定向,也尝试将标头放在 curl 中。 是的,一切都是从我的本地机器上运行的。在 curl 命令中将 localhost 更改为 127.0.0.1 修复了它。谢谢! @simpleApp 你可能想回答,我会接受的。 谢谢! :) 添加了答案。 【参考方案1】:

FastAPI 重定向请求的某些场景/设置中,使用带有完整 dns/ip 地址的 curl。

类似这样的:

curl -X 'POST' '127.0.0.1:8000/upload' -F 'file=@photo.png

或者也可以根据构建的应用程序添加标题(-H)。

curl -X 'POST' \
  'http://127.0.0.1:8000/upload' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@photo.png;type=application/json'

【讨论】:

以上是关于使用 curl 将文件上传到 FastAPI 端点 - 307 临时重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 curl 将 CSV 文件发布到 spring rest 端点

如何在单独的文件中使用 FastAPI Depends 的端点/路由?

使用 cURL 将 PHP 文件上传到 imageshack

使用 Guzzle PHP 将文件分块上传到 URL 端点

使用 PHP cURL 将文件上传到 Google 签名 URL

如何测试使用图像的 FastAPI api 端点?