【问题标题】:Send image via post request to ImageField通过 post 请求将图像发送到 ImageField
【发布时间】:2021-08-02 11:22:26
【问题描述】:

我有一个带有用于 ImageField 的 API 的模型。我需要发送通过模板上的 post 方法获取的图像,并通过 post 请求将其发送到创建的 API。获取的图像类型为InMemoryUploadedFile,如果我尝试直接发送它,由于序列化程序验证失败,我会得到 406。所以我尝试用它制作一个 PIL 对象并尝试发送。我检查了代码的 JS 对应部分,它只是从输入字段中获取文件并将其直接发送到同一字段并且它可以工作。

有没有一种方法可以让我通过 post 请求发送一个图像文件对象以使序列化程序验证失败。

category_thumbnail = request.FILES.get('category_thumbnail')

category_thumbnail = Image.open(category_thumbnail)
data = {
   'category_thumbnail': category_thumbnail
}
             

这会给我 406。

我还尝试将图像字符串转换为 base64 字节对象。

category_thumbnail = request.FILES.get('category_thumbnail')

category_thumbnail = Image.open(category_thumbnail)

with io.BytesIO() as output:
   category_thumbnail.save(output, format="GIF")
   contents = output.getvalue()

category_thumbnail = base64.b64decode(contents)
data = {
   'category_thumbnail': category_thumbnail
}

但这也会给我 406。

我想知道是否有一种方法可以发送从InMemoryUploadedFile 获取的图像文件对象。

也试过了

category_thumbnail = request.FILES.get('category_thumbnail').file

【问题讨论】:

  • 服务器对“category_tumbnail”字段的期望是什么?
  • @AkashRudra 它是一个 ImageField 并且在 API 中它只是通过序列化程序进行验证。所以一个图像类型的对象。
  • @JPG 这是他在 API 方面面临的问题。我的问题是在视图方面。我需要将图像作为参数发送而不接收。

标签: python json django django-rest-framework


【解决方案1】:

如果代码在 API 中,您应该使用 request.data 而不是 request.FILES 如果代码在普通的 html 视图中,比如表单。那么它应该使用 HTML formenctype="multipart/form-data"FormData 由 javascripts 生成。

在视图中:

obj.category_thumbnail = request.FILES['category_thumbnail']

不管是InMemoryUploadedFile还是UploadedFile,都应该直接和rest_framework一起使用。

如果由于某种原因,您在view 中使用serializer 而不是form。 如果基于类,则视图应派生自APIView。或者使用 @api_view 装饰器来实现基于函数的视图。

【讨论】:

  • 您的解决方案再次出现在 API 端。使用邮递员或 JS 发送文件时,API 显示接受 200。我需要通过 json 将 Image 类型文件发送到从我的视图创建的 API。
  • @coder 你说这与 API 无关,那你是什么意思 to API created from my viewview 有什么作用?提到如果是django标准视图,那么标准方式就是使用form。或者它应该是一个 APIView 或 @api_view。
  • @coder 您在帖子中的代码根本不会引发异常。当您尝试使用serializer 验证和保存图像时,例外情况是对吗?
  • 我的错。 API 是在不同的服务器上创建和托管的。我正在做的是独立于该服务器。我将此代码托管在不同的机器上,并将发布请求发送到在不同服务器上创建的 API。让我们将其视为 python 问题。
  • 也许我完全错过了......你的问题是“如何使用 python 发送提交的图像?”
猜你喜欢
  • 2018-04-20
  • 2019-11-24
  • 2020-05-12
  • 1970-01-01
  • 2021-11-18
  • 2015-07-24
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多