Django:Digital Ocean Spaces / AWS S3,如何使用django_storages创建图像

问题描述 投票:0回答:1

我正在尝试使用django_storages包在AWS S3或Digital Ocean空间存储图像。

当我使用表单上传普通图像时,图像成功上传到服务器。

但是当我尝试手动创建图像然后将其写入S3或Digital Ocean Space存储桶时,图像无法正确创建。

以下是我在Shell上运行的代码并尝试了很多:

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGB', (500,500), (255,255,255))
d = ImageDraw.Draw(img)
d.text((10,10), "Hello", font=ImageFont.truetype("tahomabd"), fill='BLACK')
d.text((10,60), "World", font=ImageFont.truetype("tahomabd"), fill='BLACK')


from django.core.files.storage import default_storage as storage
JPEG_PATH = "pathtofile.jpeg"
storage.exists(JPEG_PATH)

storage.delete(JPEG_PATH)
JPEG_STORAGE = storage.open(JPEG_PATH, "w")
JPEG_STORAGE.write(img)
JPEG_STORAGE.close()

上面的代码在存储位置创建了一个.JPEG文件,但它是一些没有任何意义的默认文件。请提出建议代码的问题。

django amazon-s3 boto3 pillow
1个回答
0
投票

原因是django-storages需要一个类似文件的对象,理想情况下是文件指针在字节0。

正如你在枕头文档中看到的new()方法,它返回一个Image对象,但它不是一个文件对象。从Github上的Image模块代码可以看到更多参考:

Image.new()

Image module

作为替代方案,我会使用Pillow图像创建的临时文件。将其用作图像的文件对象,并将其传递给django-storages进行上传。

from tempfile import TemporaryFile

temp_file = TemporaryFile()
img = Image.new('RGB', (500, 500), (255, 255, 255))
d = ImageDraw(img)
d.text(10, 10), 'Hello', font = ImageFont.truetype('tahomabd', fill = 'Black')
d.text(10, 10), 'World', font = ImageFont.truetype('tahomabd', fill = 'Black')
im.save(temp_file, 'JPEG')

temp.seek(0)
# upload to S3 using temp_file rather than image.  
# Don't forget to close all open file pointers too.
© www.soinside.com 2019 - 2024. All rights reserved.