【问题标题】:"Post Image data using POSTMAN"“使用 POSTMAN 发布图像数据”
【发布时间】:2017-02-01 06:33:05
【问题描述】:

我正在尝试将数据发布到我的 API。我有一个带有image 字段的模型,其中:

image = models.ImageField()

我的本​​地盒子上有一张图片,我正在尝试发送。我发送正确吗?

{
   "id": "3", 
   "uid":"273a0d69",
   "uuid": "90",
   "image": "@/home/user/Downloads/tt.jpeg"
}

【问题讨论】:

标签: django django-models django-rest-framework postman


【解决方案1】:

这不是您在邮递员上发送文件的方式。你所做的只是发送一个字符串,它是你的图像的路径,仅此而已。

你应该做的是;

  1. 将请求方法设置为 POST 后,单击“正文”选项卡。
  2. 选择表单数据。在第一行,您将看到名为 key 和 value 的文本框。将“图像”写入密钥。您将看到默认设置为“文本”的值类型。将其归档并上传您的文件。
  3. 然后选择“raw”并粘贴您的 json 文件。同样在二元选项旁边,您会看到单击了“文本”。将其设为 JSON。

你准备好了。

在您的 Django 视图中,

from rest_framework.views import APIView
from rest_framework.parsers import MultiPartParser
from rest_framework.decorators import parser_classes

@parser_classes((MultiPartParser, ))
class UploadFileAndJson(APIView):

    def post(self, request, format=None):
        thumbnail = request.FILES["file"]
        info = json.loads(request.data['info'])
        ...
        return HttpResponse()

【讨论】:

  • 你好有没有办法做嵌套图像,即 { model: { image: file } }
  • 我收到一个带有 415 HTTP 状态代码的 "detail": "Unsupported media type \"application/json\" in request."。有什么想法吗?
  • 你能把这个添加到标题中再试一次吗?键:内容类型值:应用程序/json
  • 我认为当您在 Postman 中选择 application/json 时,它会自动设置正确的标题,但如果我手动输入它也不起作用。实际上,根据我选择的单选框按钮,我似乎只在服务器端获得图像或 json。两者都不是。
  • 好的,我知道了,如果您想应用上述解决方案,您应该在form-data 中输入 JSON 作为键/值。单选按钮显示您不能同时发送form-dataraw-data
【解决方案2】:

现在您可以悬停输入键并选择“文件”,这将在值列中为您提供文件选择器:

【讨论】:

    【解决方案3】:

    如果您在form-data 面板中将 JSON 设置为键/值对,则接受的答案有效(参见下图)

    不过,我想知道这是否是一种非常简洁的 API 设计方式。如果您必须在一次调用中同时上传图像和 JSON 可能没问题,但如果您可以分离路由(一个用于图像上传,另一个用于具有适当内容类型标头的 JSON 正文),它似乎更好.

    【讨论】:

    • 它对我不起作用。我尝试了同样的方法....但我需要将文件保存在服务器中,文件名作为参数。任何建议......将不胜感激。
    • 您不必为此提供任何标题。只需确保您在视图中正确访问文件和数据即可。
    【解决方案4】:

    它对我有用:

    1. 转到正文
    2. 表单数据
    3. 在第一个单元格properties 中选择“文件”

    【讨论】:

      【解决方案5】:

      可以通过三种方式完成

      1.转到正文 > 表单数据 > 选择列中的文件

      2。转到正文 > 二进制 > 选择文件

      3.将图像编码为 base64 字符串并通过邮递员 Body > raw > JSON 传递,如所附屏幕截图中所述

      然后在服务器端,你可以这样解码

      import base64
      decode = base64.b64decode(data)
      
      from django.core.files.base import ContentFile
      file = ContentFile(decode, name=name)
      

      注意: 您可以通过该链接将文件编码为 base64 并在 curl 中发送。

      https://base64.guru/converter/encode/file

      【讨论】:

        【解决方案6】:

        按照以下步骤操作:

        1. 无需提供任何类型的标题。
        2. 选择 body > form-data 并按照图片所示进行操作。

        3. 现在在您的 Django view.py 中

        def post(self, request, *args, **kwargs):
            image = request.FILES["image"]
            data = json.loads(request.data['data'])
            ...
            return Response(...)
        
        1. 您可以从数据变量中访问所有键(id、uid 等)。

        【讨论】:

        • 只是为了澄清-“图像”键是文件输入字段的名称。所以如果你有 那么你在 Postman 中的键就是 myImageFile。
        • @CodeCaptain,我已经在我的系统上对其进行了测试,答案非常好。 “图像”是键名,邮递员也是如此。
        • 你的答案是正确的。我只是指出,如果有人有一个未命名为“图像”的文件输入,它将不起作用。我的文件输入字段名称是“imageFile”,所以它在 Postman 中对我不起作用。然后我意识到“图像”不是文件的类型,在这种情况下,它是文件输入字段的实际名称。只想为下一个人节省几分钟。
        • @CodeCaptain 好的 :)
        【解决方案7】:

        如果端点只需要一张图片(而不是键值对),您可以从 二进制 选项卡上传您的图片。

        【讨论】:

          猜你喜欢
          • 2019-12-02
          • 1970-01-01
          • 2019-11-14
          • 2021-08-11
          • 2019-07-20
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多