TypeError:预期的str,字节或os.PathLike对象,而不是ImageFieldFile

时间:2018-07-25 08:41:22

标签: python django file binary

我正在尝试将文件上传到另一台服务器。我正在尝试这样做:

 package = Package.objects.get(id=package_id)
 with open(package.logo_image.image, 'rb') as image_handle:
        image_data = bytes(image_handle.read())
        image = {
            'type': 'IMAGE',
            'data': image_data,
            'xsi_type': 'Image'
        }
        logo_image = media_service.upload(image)[0]

模型中的字段:

image = models.ImageField(upload_to=generate_file_path, null=True, blank=True)

尝试运行此代码后,我得到:

  

使用open(package.logo_image.image,'rb')作为image_handle:   TypeError:预期的str,字节或os.PathLike对象,而不是ImageFieldFile

转换为 str()没有帮助。

可以在二进制模式下打开此文件吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

您根本不需要打开文件。 ImageField(和FileField)使您可以直接访问基础文件对象。

package = Package.objects.get(id=package_id)
image_data = bytes(package.logo_image.image.read())

答案 1 :(得分:0)

可以打开 ImageField 类型的关系,以便将文件作为二进制数据读取。对于您的示例,这将使用以下语法:

package.logo_image.image.open(mode='rb')

一个有用的例子是,如果您想使用 ImageField 的图像使用请求模块来 POST 数据,例如:

file_list = [
    ('image[data]', (
        'image.jpg',
        package.logo_image.image.open(mode='rb'), 
        'image/jpg')
    ),
]
resp = requests.post(
        "http://example.com/image-ingester"
        files=file_list
 )

这在 Django 的 FileField API 文档 (link) 中有描述。