2013-06-18 16 views
6

Mam wygenerowany obraz po stronie klienta, który chcę przesłać do serwera za pośrednictwem formularza. Na przykład, załóżmy, że mam formularz rejestracyjny, w którym obraz profilu jest generowany automatycznie przez JavaScript, i chcę przenieść ten obraz do django.Przesyłanie wygenerowanego obrazu JavaScript do Django

Jaki jest najlepszy sposób przeniesienia danych binarnych obrazu na serwer po naciśnięciu przycisku "Prześlij"? w jakim polu formularza powinienem użyć?

dziękuję!

+0

co próbowaliście? co masz na myśli "automatycznie generowane"? czy pobierasz z listy zdjęć, czy faktycznie narysujesz jedną nową? czy sprawdziłeś to https://docs.djangoproject.com/en/dev/topics/http/file-uploads/? –

+0

W rzeczywistości rysuję coś nowego, więc wysłanie indeksu obrazów nie będzie działać. Próbowałem użyć CharField do przesyłania danych binarnych, ale tracę niektóre dane (być może istnieje obejście, które?). obiekt pliku może być dobrym pomysłem. czy możliwe jest sfałszowanie pliku przesłanego z javascript bez przesłania żadnego rzeczywistego pliku? - dzięki –

Odpowiedz

8

znalazłem odpowiedzi sam, oto rozwiązanie w przypadku, gdy ktoś potrzebuje go:

Na stronie klienta, to w jaki sposób można uzyskać obraz z płótna i ustawić go w polu formularza (ukrytym polem char):

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

a w bok django:

  1. dodać do formularza ukryte pole o nazwie 'hidden_image_field', który będzie wykorzystywany do przekazywania danych. to pole jest prostym CharField. możesz dodać limit max_length, aby upewnić się, że obraz jest w rozsądnym rozmiarze (uwaga: nie wymiary, ale rzeczywisty rozmiar).

  2. do analizowania danych obrazu:

    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) 
    

i teraz imageData zawiera dane binarne, można po prostu zapisać do pliku i powinno działać.

mam nadzieję, że to pomoże.

Powiązane problemy