2016-12-27 2 views
0

Benutzer laden eine Bilddatei über das Formular hoch, ich möchte die ursprünglich hochgeladene Bilddatei nicht auf dem Datenträger speichern und die Größe des Bilds durch Pillow-Bild von der Festplatte ändern.Wie kann Pillow die hochgeladene Bilddatei direkt von StringIO öffnen?

Ich möchte zuerst diese Bilddatei im Speicher ändern und dann die Größe der Bilddatei auf der Festplatte speichern. also importiere ich StringIO als Puffer, aber es funktioniert nicht mit Pillow. Hier

ist der Code:

Python3.4, Flask == 0.10.1, Kissen == 3.4.2

forms.py

class Form(): 
    img = FileField() 
    submit = SubmitField() 

views.py

from io import StringIO 
from PIL import Image 
from .forms import Form 

@app.route('/upload_img', methods=['GET', 'POST']) 
def upload_img(): 
    form = Form() 
    im = Image.open(StringIO(form.img.data.read()) 

    pass 

TypeError: initial_value must be str or None, not bytes

Antwort

2

Von Pillow docs:

PIL.Image.open(fp, mode='r')

Opens and identifies the given image file. Parameters:

fp – A filename (string), pathlib.Path object or a file object. The file object must implement read() , seek() , and tell() methods, and be opened in binary mode.

Was Sie vorbei an open ist ein StringIO. Es erstellt ein dateiähnliches Objekt aus einem Objekt str, das in Text Modus geöffnet wird.
Das Problem wird durch das Argument in StringIO verursacht. form.img.data.read() gibt ein Objekt bytes zurück, es ist verboten, es in den Konstruktor zu übergeben. Aber in Ihrem Fall wird StringIO nicht funktionieren.
Verwenden Sie stattdessen io.BytesIO. Es hat so ziemlich die gleiche Schnittstelle, außer dass es bytes Objekte benötigt und ein dateiähnliches Objekt zurückgibt, das in binär Modus geöffnet wird, was Sie brauchen.

from io import BytesIO 
from PIL import Image 
from .forms import Form 

@app.route('/upload_img', methods=['GET', 'POST']) 
def upload_img(): 
    form = Form() 
    im = Image.open(BytesIO(form.img.data.read()) 

    pass 
+0

ja, I'vd versuchte mit BytesIO, aber immer noch mit OSError: nicht-Image-Datei <_io.BytesIO Objekt bei 0x03B07880> – rogwan

+0

@rogwan dann den zurückgegebenen Daten von 'form.img.data.read identifizieren() 'ist kein gültiges Bild. Sie können dies testen, indem Sie einfach eine Datei im Binärmodus öffnen und den Rückgabewert dort schreiben. Wenn das Bild beschädigt wird, dann müssen Sie untersuchen, warum die Bilddaten nicht richtig übertragen werden. – Leva7

+0

OK, danke für Ihre Ratschläge, Dateispeicher direkt zu öffnen wäre die ideale Lösung. – rogwan

Verwandte Themen