通过在发布请求中发送文件名,我无法从我的应用程序中找到本地文件。我如何找到文件?

时间:2019-06-23 23:44:00

标签: python rest api directory os.path

我正在创建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'

2 个答案:

答案 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,然后导航到目录并查看文件在哪里。