2017-12-30 17 views
0

Ich versuche, django_storages Paket zum Speichern von Bildern auf AWS S3 oder Digital Ocean Räumen zu verwenden.Django: Digitale Ozeanräume/AWS S3, wie man ein Bild mit django_storages erstellt

Wenn ich das normale Image-Upload mit einem Formular verwende, wird das Image erfolgreich auf den Server hochgeladen.

Aber wenn ich versuche, ein Bild manuell zu erstellen und dann in S3 oder Digital Ocean Space-Buckets schreiben, wird das Bild nicht ordnungsgemäß erstellt.

Es folgt der Code, den ich auf Shell ausgeführt haben und versucht, eine Menge:

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() 

Der obige Code erzeugt auf dem Ablageort eine JPEG-Datei, aber es gibt einige Standard-Datei, die keinen Sinn macht. Bitte schlagen Sie vor, was das Problem mit dem Code ist.

+0

'einige Standard-Datei'. Was meinst du damit? – Jason

+0

Ich meinte, was auch immer ist die Größe und Inhalt des Bildes, es ist eine Standarddatei mit den gleichen Abmessungen jedes Mal mit der gleichen Größe von 58kb oder so erstellt. Zum Beispiel versuche ich ein Bild von 500 x 500 px zu erstellen, aber ich erstelle dieselbe Standarddatei. Wenn ich 1000x1000 nochmal gleich versuche. Es kann also sein, dass ich nicht verstehe, wie man eine Bilddatei speichert. –

Antwort

0

Der Grund hierfür ist django-storages eine Objektdatei ähnliche erwartet, idealerweise mit dem Dateizeiger auf Byte 0

Wie Sie in den Kissen docs für die new() Methode sehen, es gibt ein Image Objekt, aber Es ist kein Dateiobjekt. Weitere Referenz kann aus folgenden den Code auf Github für das Image Modul zu sehen:

Image.new()

Image module

Als Alternative ich eine temporäre Datei mit Ihrem Kissen Image-Erstellung verwenden würde. Verwenden Sie das als Dateiobjekt für Ihr Bild und übergeben Sie dieses zum Hochladen an 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. 
+0

Was genau meinst du mit temporärer Datei? Sie beabsichtigen, Datei lokal zu speichern, dann zu S3 zu übertragen und dann die lokale Kopie zu löschen? –

+0

Ich werde das irgendwann ausprobieren und updaten. –

+0

aus tempfile import TemporaryFile temp_file = TemporaryFile() img.save (temp_file 'JPEG') temp_file.seek (0) = JPEG_STORAGE storage.open (JPEG_PATH, "w") JPEG_STORAGE.write (temp_file) temp_file.close() JPEG_STORAGE.close() Ich habe versucht, wie Sie vorgeschlagen, aber die Ergebnisse sind gleich. Es wird das gleiche Bild erstellt, das nicht geöffnet werden kann. Wie eine ungültige Bilddatei. –

Verwandte Themen