Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Javascript] Kod base64 do pliku
Forum PHP.pl > Forum > Przedszkole
Niree
Cześć, w swoim skrypcie zamieniłem SVG na Canvas, a następnie Canvas na kod image/jpg;base64.

var imgURI = canvas
.toDataURL('image/jpg;base64;');


Żeby przenieść ten adres imgURI użyłem ukrytego formularza:

  1. <form method="POST" action="raport.php" id="myForm">
  2. <input type="hidden" value="" name="img_val" id="img_val" />
  3. <input type="submit" value="RAPORT" name="raport" onclick="capture();" /></form>


W tej samej funkcji, gdzie jest var imgURI zrobiłem podłożenie adresu do formularza:

  1. $('#img_val').val(imgURI);
  2.  
  3. function capture() {
  4. var content = document.getElementById("img_val").value;
  5. writeToFile(id, content);
  6. document.getElementById("myForm").submit();
  7. }


Jak widzimy, wszystko ładnie pięknie, formularz leci do raport.php, pokazuje nam obrazek na tamtej stronie, super.

Problem w tym, że jak na canvie (a to spore canvy, bo wykresy...), jest sporo danych, wywala mi error, że przekroczono dopuszczalną ilość pamięci operacyjnej serwera, 200mb, a jeżeli nie error o pamięci to w ogóle obrazek się nie generuje (po zerknięciu w Google Chrome okazuje się, że zmienna $_POST['img_val'] jest pusta).

Pomyślałem, że może w tej samej funkcji, gdzie definiuję var imgURI warto wrzucić tą zmienną do pliku i potem z pliku brać url obrazka, żeby odczytać go w raport.php.

Więc moje pytanie brzmi, w jaki sposób mogę wrzucić text ze zmiennej imgURI do pliku w JS? Chyba, że macie inne pomysły...

Pozdrawiam i liczę na pomoc ;-)
Pyton_000
Nie poradzisz. Musisz zwiększyć limity pamięci w PHP.
post_max_size
Niree
Cytat(Pyton_000 @ 2.11.2016, 19:24:02 ) *
Nie poradzisz. Musisz zwiększyć limity pamięci w PHP.
post_max_size


Cholera, tam jest naprawdę dużo danych, może coś w tym stylu:
  1. var data = imgURI.replace(/^data:image\/\w+;base64,/, '');
  2.  
  3. fs.writeFile('test.jpg', data, {encoding: 'base64'}, function(err){
  4. //Finished
  5. });
Pyton_000
JS nie zapiszesz pliku na serwerze. Nawet jeśli zapiszesz go na komputerze to i tak go musisz przesłać formularzem do serwera. Od biedy możesz próbować wypchać plik na inny serwer po jakimś API a potem pobrać go na swoim serwerze stamtąd.
Niree
Cytat(Pyton_000 @ 2.11.2016, 20:02:15 ) *
JS nie zapiszesz pliku na serwerze. Nawet jeśli zapiszesz go na komputerze to i tak go musisz przesłać formularzem do serwera. Od biedy możesz próbować wypchać plik na inny serwer po jakimś API a potem pobrać go na swoim serwerze stamtąd.

emmm.. Jest mały problem.
Z phpinfo(); wynika, że:
post_max_size 200M 200M

więc, jak mogę zaradzić?

Zrobiłem coś takiego (zupełnie dla testu):
  1. if(!empty($_POST['img_val']))
  2. {
  3. $filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1);
  4. $plik1 = fopen('img.png', 'w'); flock($plik1, 2); fputs($plik1, $filteredData); flock($plik1, 3);fclose($plik1);
  5. }


Z tego co widzę, jeżeli zmienna przesyła się prawidłowo przez POST, to robi mi się plik o wielkości 40MB, wewnątrz cały kod base64.
Jest to dużo mniej niż w post_max_size, więc co jest nie tak? sad.gif
Pyton_000
To może pokaż jaki błąd wywala PHP
Niree
Cytat(Pyton_000 @ 2.11.2016, 20:38:15 ) *
To może pokaż jaki błąd wywala PHP


Generalnie na początku, przy dużym wykresie pokazywało mi:

  1. Fatal error: Allowed memory size of 209715200 bytes exhausted


Zwiększyłem memory_limit do 250 i teraz już nie wyrzuca mi żadnego errora. Tylko strona dlugo myśli, ale kodu base64 i tak nie przesyła przez formularz.

Za to przy małych wykresach jest wszystko okej.

Z tego co zauważyłem, to przy większych danych po prostu value się nie zmienia.
Tak jakby był jakiś limit (na pewno nie po stronie serwera, skoro widze w Chromie, ze value to null).

Mniejsze wykresy (z częstotliwościa wpisów co 6h): value zmienia się na kod base64 (i później po kliknięciu, leci wszystko do raport.php).
Większy wykres (z częstotliwością wpisów co 15 minut): value się nie zmienia (dlatego leci pusty $_POST do raport.php)

Idzie obejść jakoś ten limit? textarea? albo co innego?
Puszy
Jeżeli problemem jest przesłanie pliku na serwer i używasz base64 to rozwiązanie samo się nasuwa. Base64 to string, podziel go na krótsze stringi i wyślij kilkukrotnie na serwer. Ustal dla każdego uploadu jakieś ID, na serwerze zapisuj pliki idUploadu.dat poprzez file_put_content() z flagą append FILE_APPEND. Części stringa wysyłaj AJAXem. Po przesłaniu ostatniej części stringa w pliku idUploadu.dat będziesz miał string zawierający pełen Base64 pliku. Jeżeli natomiast serwer nie jest w stanie udźwignąć tego a ini_set('memory_limit', '3G'); nie pomaga to z tego co wiem nie idzie tego przeskoczyć o ile nie można tego rozwiązać poprzez strumieniowanie danych, pytanie co chcesz przez to osiągnąć bo z tego co widzę to wyświetlasz obrazek a następnie go wysyłasz i ponownie wyświetlasz? Po co? Nie rozumiem idei.
Niree
Cytat(Puszy @ 3.11.2016, 14:10:53 ) *
Jeżeli problemem jest przesłanie pliku na serwer i używasz base64 to rozwiązanie samo się nasuwa. Base64 to string, podziel go na krótsze stringi i wyślij kilkukrotnie na serwer. Ustal dla każdego uploadu jakieś ID, na serwerze zapisuj pliki idUploadu.dat poprzez file_put_content() z flagą append FILE_APPEND. Części stringa wysyłaj AJAXem. Po przesłaniu ostatniej części stringa w pliku idUploadu.dat będziesz miał string zawierający pełen Base64 pliku. Jeżeli natomiast serwer nie jest w stanie udźwignąć tego a ini_set('memory_limit', '3G'); nie pomaga to z tego co wiem nie idzie tego przeskoczyć o ile nie można tego rozwiązać poprzez strumieniowanie danych, pytanie co chcesz przez to osiągnąć bo z tego co widzę to wyświetlasz obrazek a następnie go wysyłasz i ponownie wyświetlasz? Po co? Nie rozumiem idei.


Cześć, dzięki za zainteresowanie! :-)
W index.php wyświetla mi wyniki z tabeli:
  1. date | value

Dane zapisywane są co minutę, więc danych jest dużo. Zrobiłem wyszukiwarkę "pokaż wyniki z ostatniej: doby, tygodnia, miesiąca, kwartał co: 5 min, 15 min, 30 min, 1h, 6h.
Przy wyborze doba - co 1h. Wszystko leci ładnie. "img_val" przyjmuje wartość stringa base64 i to leci do raport.php, który przy użyciu TCPDF generuje nam raport PDF. Stąd właśnie potrzeba wysłania POST-em wszystko do raport.php.

Nie wpadłem na to, żeby podzielić stringa na kilka części, dzięki! Jednak zrobiłem coś wygodniejszego.
Base64 przekazuję do imgur API, które zwraca mi link do obrazka wprost do img_val. Przez co po wysłaniu formularza mam gotowy adres obrazu, bez wielkich stringów i przeciążeń $_POST.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.