2013-06-18 6 views
6

Ich habe ein Bild auf der Clientseite erzeugt, die ich über ein Formular auf den Server übertragen möchte. Nehmen wir zum Beispiel an, dass ich ein Registrierungsformular habe, in dem das Profilbild automatisch von JavaScript generiert wird, und ich dieses Bild an django übertragen möchte.Hochladen von JavaScript generierten Bild zu Django

Was ist der beste Weg, um die Bild-Binärdaten auf den Server zu übertragen, wenn Benutzer die Schaltfläche zum Senden drücken? Welches Formularfeld sollte ich verwenden?

danke!

+0

Was haben Sie versucht? Was meinst du "automatisch generiert"? holst du aus einer Liste von Bildern oder zeichnest tatsächlich ein neues? Hast du das https://docs.djangoproject.com/de/dev/topics/http/file-uploads/ überprüft? –

+0

Ich zeichne eigentlich etwas Neues, also funktioniert das Senden eines Bildindex nicht. Ich habe versucht, ein CharField zu verwenden, um die binären Daten zu übertragen, aber ich verliere einige der Daten (vielleicht gibt es einen Workaround das?). Das Dateiobjekt könnte eine gute Idee sein. Ist es möglich, einen Datei-Upload von Javascript zu fälschen, ohne eine Datei hochzuladen? - Vielen Dank –

Antwort

8

eine Antwort selbst gefunden, hier ist die Lösung, falls es jemand braucht:

In der Client-Seite, das ist, wie Sie das Bild von der Leinwand zu bekommen und es zu einem Formularfeld (ein verstecktes Zeichen Feld) gesetzt:

var dataURL = document.getElementById('canvas_id').toDataURL("image/png"); 
document.getElementById('id_hidden_image_field').value = dataURL; 

Und in django Seite:

  1. in das Formular ein verstecktes Feld 'hidden_image_field', genannt hinzufügen, die verwendet werden, um die Daten zu übergeben. Dieses Feld ist ein einfaches CharField. Sie können max_length limit hinzufügen, um sicherzustellen, dass das Bild in einer vernünftigen Größe ist (Hinweis: keine Abmessungen, sondern die tatsächliche Größe).

  2. die Bilddaten zu analysieren:

    import re 
    import base64 
    dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$') 
    ImageData = request.POST.get('hidden_image_field') 
    ImageData = dataUrlPattern.match(ImageData).group(2) 
    
    # If none or len 0, means illegal image data 
    if (ImageData == None or len(ImageData) == 0: 
        # PRINT ERROR MESSAGE HERE 
        pass 
    
    # Decode the 64 bit string into 32 bit 
    ImageData = base64.b64decode(ImageData) 
    

und jetzt Imagedata enthält die binären Daten, können Sie einfach in einer Datei speichern und es sollte funktionieren.

hoffe das hilft.