2010-06-12 6 views
9

Ich habe ein Modell mit zwei Bildfeldern, einem Quellbild und einem Miniaturbild.Django gibt beim Lesen von einem gespeicherten ImageField den Fehler "E/A-Vorgang bei geschlossener Datei"

Wenn ich das neue Quellbild aktualisiere, es speichere und dann versuche, das Quellbild zu lesen, um es auf ein Miniaturbild zuzuschneiden/skalieren, bekomme ich einen Fehler "E/A-Vorgang bei geschlossener Datei" von PIL.

Wenn ich das Quellbild aktualisieren, nicht das Quellbild speichern und dann versuchen, das Quellbild zum Zuschneiden/Skalieren zu lesen, erhalte ich einen Fehler "versucht, von geschlossener Datei zu lesen" von PIL.

In beiden Fällen wird das Quellbild tatsächlich gespeichert und ist in späteren Request/Response-Schleifen verfügbar.

Wenn ich nicht in einer einzelnen Anfrage/Antwort-Schleife zuschneiden/skalieren, sondern stattdessen auf eine Seite hochladen und dann auf einer anderen Seite zuschneiden/skalieren, funktioniert das alles gut.

Dies scheint ein zwischengespeicherter Puffer zu sein, der entweder von PIL oder vom Django-Dateispeicher wiederverwendet wird. Irgendwelche Ideen, wie man ein ImageField nach dem Speichern lesbar macht?

Weitere Informationen ... ImageField schließt die zugrunde liegende Datei nach dem Speichern eindeutig. Gibt es eine Möglichkeit, eine Aktualisierung des ImageField zu erzwingen? Ich sehe ein paar Leute mit Such (0), aber das wird in diesem Fall nicht funktionieren.

Antwort

17

Es gibt einen Fehler im ImageField, den ich aufgespürt habe und submitted to the django project.

Wenn Sie ein einfaches Modell mit einem Imagefield haben ?, der folgende Code wird mit einem „auf geschlossene Datei-I/O-Operation“ fail:

instance = MyClass.objects.get(...) 
w = instance.image.width 
h = instance.image.height 
original = Image.open(instance.image) 

Die Arbeit um ist die Datei wieder zu öffnen:

instance = MyClass.objects.get(...) 
w = instance.image.width 
h = instance.image.height 
instance.image.open() 
original = Image.open(instance.image) 
+0

Falls jemand fragen, ist, wie ich war, verwiesen auf das Bild oben ist Bild des PIL - von PIL Import Bild – Steve

+1

„imageField.open() ändert nicht den Inhalt der Datei, aber es setzen sie den Zeiger“ –

Verwandte Themen