首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么上传图片时resquest.files返回空的ImmutableMultiDict([])

为什么上传图片时resquest.files返回空的ImmutableMultiDict([])
EN

Stack Overflow用户
提问于 2021-03-18 02:18:41
回答 1查看 118关注 0票数 0

我正在使用Flask、Flask-Restfull、Flask-Uploads和Marshmallow构建一个rest API。我正在使用Postman来测试它。当我用邮递员发送请求时,我收到了"image":“必填字段缺少数据。”问题似乎是"request.files“返回一个空的ImmutableMultiDict([])。在这里,我发送了Postman请求的代码和图像。

代码语言:javascript
复制
from flask_restful import Resource
from flask import send_file, request
from flask_jwt_extended import jwt_required, get_jwt_identity
import traceback
import os
from werkzeug.utils import secure_filename
from libs import image_helper
from libs.strings import gettext
from schemas.image import ImageSchema
import logging

image_schema = ImageSchema()

class ImageUpload(Resource):
    @jwt_required()
    def post(self):
        """
        This endpoint is used to upload an image file. It uses the
        JWT to retrieve user information and save the image in the user's folder.
        If a file with the same name exists in the user's folder, name conflicts
        will be automatically resolved by appending a underscore and a smallest
        unused integer. (eg. filename.png to filename_1.png).
        """

        print(request.files) # IT RETURNS  ImmutableMultiDict([])
        data = image_schema.load(request.files)
    
        user_id = get_jwt_identity()
        folder = f"user_{user_id}"
        try:
            # save(self, storage, folder=None, name=None)
            image_path = image_helper.save_image(data["image"], folder=folder)
            # here we only return the basename of the image and hide the internal folder structure from our user
            basename = image_helper.get_basename(image_path)
            return {"message": gettext("image_uploaded").format(basename)}, 201
        except: #UploadNotAllowed:  # forbidden file type
            extension = image_helper.get_extension(data["image"])
            return {"message": gettext("image_illegal_extension").format(extension)}, 400

-架构

代码语言:javascript
复制
class FileStorageField(fields.Field):
    default_error_messages = {
        "invalid": "Not a valid image."
    }

    def _deserialize(self, value, attr, data) -> FileStorage:
        if value is None:
            return None

        if not isinstance(value, FileStorage):
            self.fail("invalid")

        return value


class ImageSchema(Schema):
    image = FileStorageField(required=True)

-邮递员图片

EN

回答 1

Stack Overflow用户

发布于 2021-03-20 23:57:52

我已经通过删除unwanted code(与问题无关)来尝试您的代码。并且我能够成功地接收到请求中的文件。

下面是我使用的代码

代码语言:javascript
复制
from flask import Flask, request
from flask_restful import Api, Resource
from marshmallow import Schema, fields
from werkzeug.datastructures import FileStorage

app = Flask(__name__)
api = Api(app)


class FileStorageField(fields.Field):
    default_error_messages = {
        "invalid": "Not a valid image."
    }

    def _deserialize(self, value, attr, data, **kwargs) -> FileStorage:
        if value is None:
            return None

        if not isinstance(value, FileStorage):
            self.fail("invalid")

        return value


class ImageSchema(Schema):
    image = FileStorageField(required=True)


image_schema = ImageSchema()


class ImageUpload(Resource):
    def post(self):

        print(request.files)  # IT RETURNS  ImmutableMultiDict([])
        data = image_schema.load(request.files)
        print(data)

        return {"ok": True}


api.add_resource(ImageUpload, '/upload/image')

if __name__ == "__main__":
    app.run(debug=True)

这是邮递员的截图

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66678975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档