我正在尝试使用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文件,但它是一些没有任何意义的默认文件。 请说明代码的问题。
答案 0 :(得分:0)
原因是django-storages
需要一个类似文件的对象,理想情况下是文件指针位于字节0。
正如您在new()
方法的Pillow文档中所看到的,它返回一个Image
对象,但它不是文件对象。可以从Github上的Image
模块代码中看到更多参考:
作为替代方案,我会使用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.