通过发布请求将图像发送到 ImageField

时间:2021-05-12 05:33:11

标签: python json django django-rest-framework

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

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

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

1 个答案:

答案 0 :(得分:0)

如果代码在 API 中,您应该使用 <provider> 而不是 request.data 如果代码在普通的 html 视图中,就像一个表单。那么它应该使用由 javascripts 生成的 request.FILESHTML formenctype="multipart/form-data"

在视图中:

FormData

无论是obj.category_thumbnail = request.FILES['category_thumbnail'] 还是InMemoryUploadedFile,都应该直接和rest_framework一起使用。

如果出于某种原因,您在 UploadedFile 中使用了 serializer 而不是 form。 如果基于类,则视图应该从 view 派生。或者使用 APIView 装饰器来实现基于功能的视图。