Я не могу найти локальный файл из своего приложения, отправив имя файла в почтовом запросе.Как мне найти файл? - PullRequest
0 голосов
/ 24 июня 2019

Я создаю REST API (используя FastAPI), и в моем проекте есть локальная папка с изображениями, и я должен отправить имя фотографии в POST-запросе, чтобы получить к нему доступ с помощью созданного мной метода.

Проблема в том, что когда я отправляю имя фотографии в POST, оно не находит файл в моем приложении.

Как найти фотографию, чтобы использовать ее?

Я использую относительный путь (dirname и abspath из os.path), но он не работает.

Структура папок:

.
├── 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)})

Я пытался отправить ПОЧТУ:

localhost/analyze?image_name=1

И ответ был:

FileNotFoundError: [Errno 2] No such file or directory: '/public/1.png'

Ответы [ 2 ]

0 голосов
/ 23 июля 2019

Возможно, лучше задать следующие вопросы в GitHub: https://github.com/tiangolo/fastapi/issues, таким образом, я (или другие) смогу увидеть ваш вопрос и помочь вам.

В этом случае я вижу васесть файл docker-compose.yml.Итак, сначала убедитесь, что у вас есть файлы public, смонтированные как том в вашем контейнере, или что он создан.

Чтобы проверить это, вы можете использовать docker exec -it your-container bash, а затем перейти к каталогу и увидетьгде ваши файлы.

0 голосов
/ 24 июня 2019

Когда вы передаете аргументы в os.path.join, если второй аргумент является абсолютным путем (имеет / в начале), он возвращает второй аргумент.

images_path = join(dirname, '/public/') следует изменить наimages_path = join(dirname, 'public/').

...