AttributeError: у объекта 'NoneType' нет атрибута 'имя файла'.Flask-Restplus не распознает загруженный файл как объект Filestorage - PullRequest
0 голосов
/ 21 мая 2018

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

class FiguresResource(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument(
        'thing',
        type=str)
    parser.add_argument(
        'image_file',
        type=werkzeug.datastructures.FileStorage,
        location=UPLOAD_FOLDER)
    parser.add_argument(
        'audio_file',
        type=werkzeug.datastructures.FileStorage,
        location=UPLOAD_FOLDER)

    def post(self):
        db = connect(MONGODB_DB, host=MONGODB_HOST, port=MONGODB_PORT)
        data = self.parser.parse_args()
        image = data['image_file']
        audio = data['audio_file']
        fig = Figure(
            data['thing'],
            image.filename,
            get_file_size(image),
            audio.filename,
            get_file_size(audio)
        )
        image.save(image.filename)
        audio.save(audio.filename)
        fig.save()
        db.close()

Когда я пытаюсь отправить данные, я получаю сообщение «Внутренняя ошибка сервера»500 от моего запрашивающего клиента.Сервер-колба выбросит ---

Файл "/home/joe/Projects/PyKapi-venv/kapi/resources/figure_resource.py", строка 53, в сообщение image.filename,AttributeError: у объекта 'NoneType' нет атрибута 'filename' 127.0.0.1 - - [20 / May / 2018 17:12:25] "POST / figure HTTP / 1.1" 500 -

Я думалпроблема была в моем запросе Http, но не так уверен сейчас.Первоначально я отправлял свой запрос почтальону, но недавно перешел на использование curl.Это моя команда curl ---

curl -F thing=Fruits -F image_file=@/home/joe/Projects/Pics/Fruits.jpg -F audio_file=@/home/joe/Projects/Audio/Fruits http://127.0.0.1:5000/figures

1 Ответ

0 голосов
/ 22 мая 2018

[ОБНОВЛЕНИЕ] Я неправильно использовал аргумент location в requestparser ().Аргумент местоположения хочет тип содержимого запроса.Поэтому я изменил это следующим образом ~

class FiguresResource(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument(
        'thing',
        type=str,
        location='form')
    parser.add_argument(
        'image_file',
        type=FileStorage,
        location='files')
    parser.add_argument(
        'audio_file',
        type=FileStorage,
        location='files')

    def post(self):
        data = self.parser.parse_args()
        image = data['image_file']
        audio = data['audio_file']
        image_path = join(IMAGE_FOLDER, image.filename)
        audio_path = join(AUDIO_FOLDER, audio.filename)

        db = connect(MONGODB_DB, host=MONGODB_HOST, port=MONGODB_PORT)
        if Figure.objects(visual_aid_path=image_path):
            db.close()
            return {"message": "Visual Aid file with that name already exists"}
        if Figure.objects(audio_aid_path=audio_path):
            db.close()
            return {"message": "Audio file with that name already exists"}
        fig = Figure(
            data['thing'],
            image_path,
            audio_path
        )
        image.save(image_path)
        audio.save(audio_path)
        image.close()
        audio.close()
        fig.save()
        db.close()

`

...