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

时间:2017-12-30 14:15:44

标签: django amazon-s3 boto3 pillow

我正在尝试使用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文件,但它是一些没有任何意义的默认文件。 请说明代码的问题。

1 个答案:

答案 0 :(得分:0)

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

正如您在new()方法的Pillow文档中所看到的,它返回一个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.