Korzystam z narzędzia JavaScript „Canvas2Image” Nihilogic do konwersji rysunków na obrazy w formacie PNG. Teraz potrzebuję przekształcić ciągi base64 generowane przez to narzędzie w rzeczywiste pliki PNG na serwerze, używając PHP.
Krótko mówiąc, obecnie tworzę plik po stronie klienta za pomocą Canvas2Image, a następnie pobieram dane zakodowane w standardzie base64 i wysyłam na serwer za pomocą AJAX:
// Generate the image file
var image = Canvas2Image.saveAsPNG(canvas, true);
image.id = "canvasimage";
canvas.parentNode.replaceChild(image, canvas);
var url = 'hidden.php',
data = $('#canvasimage').attr('src');
$.ajax({
type: "POST",
url: url,
dataType: 'text',
data: {
base64data : data
}
});
W tym momencie „hidden.php” otrzymuje blok danych, który wygląda jak data: image / png; base64, iVBORw0KGgoAAAANSUhEUgAABE ...
Od tego momentu jestem prawie zakłopotany. Z tego, co przeczytałem, uważam, że powinienem użyć funkcji imagecreatefromstring PHP , ale nie jestem pewien, jak faktycznie utworzyć rzeczywisty obraz PNG z ciągu zakodowanego w base64 i zapisać go na moim serwerze. Proszę o pomoc!
źródło
Odpowiedzi:
Musisz wyodrębnić dane obrazu base64 z tego ciągu, zdekodować go, a następnie możesz zapisać go na dysku, nie potrzebujesz GD, ponieważ jest już png.
I jako jedna linijka:
Wydajną metodą wyodrębniania, dekodowania i sprawdzania błędów jest:
źródło
$type
otrzymuje wartość z rozstrzelenia , w zależności od tego, czy są to dane: obraz / jpg, czy dane: obraz / png itp.Spróbuj tego:
file_put_contents docs
źródło
data:image/png;base64,
co psuje plik.data:image/png;base64,
to ciąg, który przekazujesz,base64_decode
nie jest prawidłowy base64. Musisz tylko wysłać dane, co ilustruje odpowiedź Draw010. Z tą odpowiedzią nic nie jest zepsute. Nie możesz kopiować i wklejać bez zrozumienia i oczekujesz, że „po prostu zadziała”.Musiałem zamienić spacje na symbole plus,
str_replace(' ', '+', $img);
aby to zadziałało.Oto pełny kod
Mam nadzieję, że to pomaga.
źródło
$img = str_replace(' ', '+', $img);
bardzo mi pomogła, dzięki! Dlaczego wcześniej muszę przekonwertować spację na „+”?Warto powiedzieć, że omawiany temat jest udokumentowany w RFC 2397 - Schemat URL „danych” ( https://tools.ietf.org/html/rfc2397 )
Z tego powodu PHP ma natywny sposób obsługi takich danych - „data: stream wrapper” ( http://php.net/manual/en/wrappers.data.php )
Możesz więc łatwo manipulować danymi za pomocą strumieni PHP:
źródło
preg_replace
+file_put_contents
?Cóż, powyższe rozwiązanie zależy od tego, czy obraz jest plikiem JPEG. Jako ogólne rozwiązanie zastosowałem
źródło
W ramach pomysłu @ dre010 rozszerzyłem go na inną funkcję, która działa z dowolnym typem obrazu: PNG, JPG, JPEG lub GIF i nadaje unikalną nazwę nazwie pliku
Funkcja oddziela dane obrazu i typ obrazu
źródło
Łączne obawy:
źródło
Rozwiązanie jednoliniowe.
źródło
na podstawie przykładu Draw010 stworzyłem działający przykład dla łatwego zrozumienia.
źródło
Spróbuj tego...
źródło
Ten kod działa dla mnie sprawdź poniższy kod:
źródło
Ta funkcja powinna działać. ma parametr foto, który przechowuje ciąg base64, a także ścieżkę do istniejącego katalogu obrazów, jeśli masz już obraz, który chcesz rozłączyć podczas zapisywania nowego.
źródło
To proste :
Wyobraźmy sobie, że próbujesz przesłać plik w ramach js, żądania ajax lub aplikacji mobilnej (po stronie klienta)
Tutaj, jak to zrobić za pomocą PHP
źródło
Jeśli chcesz losowo zmieniać nazwy obrazów i przechowywać zarówno ścieżkę obrazu w bazie danych jako obiekt blob, jak i sam obraz w folderach, to rozwiązanie ci pomoże. Użytkownicy Twojej witryny mogą przechowywać tyle obrazów, ile chcą, podczas gdy zdjęcia będą losowo zmieniane ze względów bezpieczeństwa.
Kod php
Generuj losowe varchary do użycia jako nazwy obrazu.
Pobierz rozszerzenie danych obrazu i część base_64 (część po danych: obraz / png; base64,) z obrazu.
źródło
PHP ma już uczciwe traktowanie base64 -> transformacja plików
Robię to w ten sposób:
źródło