“使用 POSTMAN 发布图像数据”
Posted
技术标签:
【中文标题】“使用 POSTMAN 发布图像数据”【英文标题】:"Post Image data using POSTMAN" 【发布时间】:2017-02-01 06:33:05 【问题描述】:我正在尝试将数据发布到我的 API。我有一个带有image
字段的模型,其中:
image = models.ImageField()
我的本地盒子上有一张图片,我正在尝试发送。我发送正确吗?
"id": "3",
"uid":"273a0d69",
"uuid": "90",
"image": "@/home/user/Downloads/tt.jpeg"
【问题讨论】:
这里是从邮递员youtu.be/sFlPa_Vow3w发送文件的2分钟快速指南 【参考方案1】:这不是您在邮递员上发送文件的方式。你所做的只是发送一个字符串,它是你的图像的路径,仅此而已。
你应该做的是;
-
将请求方法设置为 POST 后,单击“正文”选项卡。
选择表单数据。在第一行,您将看到名为 key 和 value 的文本框。将“图像”写入密钥。您将看到默认设置为“文本”的值类型。将其归档并上传您的文件。
然后选择“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-data
和raw-data
。【参考方案2】:
现在您可以悬停输入键并选择“文件”,这将在值列中为您提供文件选择器:
【讨论】:
【参考方案3】:如果您在form-data
面板中将 JSON 设置为键/值对,则接受的答案有效(参见下图)
不过,我想知道这是否是一种非常简洁的 API 设计方式。如果您必须在一次调用中同时上传图像和 JSON 可能没问题,但如果您可以分离路由(一个用于图像上传,另一个用于具有适当内容类型标头的 JSON 正文),它似乎更好.
【讨论】:
它对我不起作用。我尝试了同样的方法....但我需要将文件保存在服务器中,文件名作为参数。任何建议......将不胜感激。 您不必为此提供任何标题。只需确保您在视图中正确访问文件和数据即可。【参考方案4】:它对我有用:
-
转到正文
表单数据
在第一个单元格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】:按照以下步骤操作:
-
无需提供任何类型的标题。
选择 body > form-data 并按照图片所示进行操作。
现在在您的 Django view.py 中
def post(self, request, *args, **kwargs): image = request.FILES["image"] data = json.loads(request.data['data']) ... return Response(...)
-
您可以从数据变量中访问所有键(id、uid 等)。
【讨论】:
只是为了澄清-“图像”键是文件输入字段的名称。所以如果你有 那么你在 Postman 中的键就是 myImageFile。 @CodeCaptain,我已经在我的系统上对其进行了测试,答案非常好。 “图像”是键名,邮递员也是如此。 你的答案是正确的。我只是指出,如果有人有一个未命名为“图像”的文件输入,它将不起作用。我的文件输入字段名称是“imageFile”,所以它在 Postman 中对我不起作用。然后我意识到“图像”不是文件的类型,在这种情况下,它是文件输入字段的实际名称。只想为下一个人节省几分钟。 @CodeCaptain 好的 :)【参考方案7】:如果端点只需要一张图片(而不是键值对),您可以从 二进制 选项卡上传您的图片。
【讨论】:
以上是关于“使用 POSTMAN 发布图像数据”的主要内容,如果未能解决你的问题,请参考以下文章