2016-07-14 3 views
0

Mein aktuelles Projekt erfordert, dass ich hochgeladene Dateien (meist Bilder) für die Vorverarbeitung, bevor ich sie speichern.Bild vorübergehend mit io für die Vorverarbeitung ohne Verwendung von Datenträger Ressourcen speichern

Bis jetzt war meine Hauptmethode, auf Amazon s3 zu laden, dann herunterzuladen und an ihnen zu arbeiten.

Dies ist nicht ideal, da ich das hochgeladene Bild nicht wirklich speichern muss, sondern das Endprodukt.

Ist es möglich, das io-Modul zu verwenden, um die Django InMemoryUploadedFile als Bytes zu speichern und irgendwie ein tatsächliches Bild von ihm zurückzugeben? Meine bisherigen Versuche sind kläglich gescheitert. Vielleicht verstehe ich das io Modul nicht unbedingt gut.

def temp_file(f): 
    """ 
    CREATES TEMP FILE THAT DOES NOT GET UPLOADED 
    f is the InMemoryUploadedFile of image 
    """ 
    buffer = io.BytesIO() 
    buffer.write(f.read()) 
    image = buffer.read() 
    buffer.close() 
    img = Image.open(image) 
    return img 
+1

Können Sie uns mehr über Ihre Versuche (einschließlich Code) und was ist bisher gescheitert? Es ist einfacher, anhand eines Code-Snippets zu antworten als nur eine formale Frage. 'io' wird möglicherweise nicht benötigt, wenn Sie' ContentFile' verwenden. – raphv

+0

Ich werde viel mit Bildern und PDFs zu tun haben. Es gibt hier ein Beispiel (unter "Komplexe PDFs"), wie man mit komplexen PDF-Dateien in der django-Dokumentation umgehen kann: https://docs.djangoproject.com/de/1.9/howto/outputting-pdf/. Ich versuche, das gleiche Beispiel für Bilder zu replizieren. – Edwinner

Antwort

0

Wenn Sie ein Bild integrieren möchten Sie in einem PDF hochgeladen haben, können Sie diese Art der Sache wollen:

from io import BytesIO 
from PIL import Image 
from reportlab.pdfgen import canvas 

def upload_view(request): 
    image = request.FILES['image'] 
    imagebuffer = BytesIO() 
    for chunk in image.chunks(): 
     imagebuffer.write(chunk) 
    image = Image.open(imagebuffer) 
    imagebuffer.close() 
    response = HttpResponse(content_type='application/pdf') 
    c = canvas.Canvas(response) 
    c.drawImage(image, x, y) 
    ... 
+0

Ich wollte eigentlich nur eine für Bilder. Schnelle Frage: Wenn ich 1000 Benutzer gleichzeitig hatte, wird es meinen Server langsamer machen, da alles im Speicher ist? Im Gegensatz zum Speichern von Bildern auf einer Festplatte? – Edwinner

+0

Mit der Art von Code, den ich oben geschrieben habe, bleibt das Bild nur von der HTTP-Anfrage bis zum Rendern der Antwort im Speicher. Es sollte den Speicher nicht viel mehr treffen als Disk-basierte Images, da diese beim Lesen aus POST.files und dann beim Schreiben in die HTTP-Response ohnehin über den Speicher übertragen werden müssten. Wenn Sie möchten, dass Bilder länger im Speicher bleiben als der POST, dann müssen Sie das Caching-Framework von Django verwenden. – raphv

0

Image.open() erwartet einen Dateinamen oder eine Datei wie Objekt (mit read(), seek() und tell() Methoden). Sie müssen also das buffer Objekt Image.open() geben. Nicht geschlossen und an den Anfang gebunden.

def temp_file(f): 
    return Image.open(io.BytesIO(f.read()))