我正在创建REST API(使用FastAPI),并且在我的项目中有一个包含图像的本地文件夹,我应该在POST请求中发送照片的名称,以使用我创建的方法对其进行访问。
问题是,当我将照片名称发送到POST时,它在我的应用程序中找不到文件。
如何找到照片以便使用?
我正在使用相对路径(os.path中的目录名和abspath),但是它不起作用。
文件夹结构:
.
├── app/
│ └── main.py
├── public/
│ ├── 1.png
│ ├── 2.png
│ └── 3.png
├── docker-compose.yml
├── Dockerfile
├── .gitignore
└── requirements.txt
main.py
from fastapi import FastAPI
from starlette.responses import JSONResponse
import io
from os.path import dirname, abspath, join
from PIL import Image
dirname = dirname(dirname(abspath(__file__)))
images_path = join(dirname, '/public/')
def read_byte_img(image_path):
img = Image.open(image_path, mode='r')
imgByteArr = io.BytesIO()
img.save(imgByteArr, format='PNG')
return imgByteArr
@app.post("/test")
def test(image_name: str):
image_name = image_name + '.png'
img = images_path + image_name
byte_img = read_byte_img(img)
return SONResponse({'response': str(byte_img)})
我尝试发送POST:
localhost/analyze?image_name=1
答案是:
FileNotFoundError: [Errno 2] No such file or directory: '/public/1.png'
答案 0 :(得分:0)
将参数传递给os.path.join
时,如果第二个参数是绝对路径(开头为/
),则它将返回第二个参数。
images_path = join(dirname, '/public/')
应该更改为images_path = join(dirname, 'public/')
。
答案 1 :(得分:0)
最好在GitHub问题中问这些问题:https://github.com/tiangolo/fastapi/issues,这样我(或其他人)可以看到您的问题并为您提供帮助。
在这种情况下,我看到您有一个docker-compose.yml
文件。因此,首先,请检查您public
个文件是否已作为卷安装在容器中或已创建。
要进行检查,可以使用docker exec -it your-container bash
,然后导航到目录并查看文件在哪里。