Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP Screenshot
Forum PHP.pl > Forum > PHP
timez
Witam serdecznie, poszukuje już od kilku dni i nie mogę znaleźć.. Potrzebuję mieć zwykły przycisk który po kliknięciu będzie wyświetlać gdzie chce zapisać dany obraz /png. Znalazłem tutaj jedno ale nie działa mi niestety..
  1. function take_screenshot()
  2.  
  3. {
  4. html2canvas(document.body, {
  5. onrendered: function(canvas)
  6. {
  7. var img = canvas.toDataURL()
  8. $.post("save_screenshot.php", {data: img}, function (file){
  9. window.location.href = "save_screenshot.php?file="+ file
  10. });
  11. }
  12. });
  13. }

PHP
  1. <?php
  2.  
  3. if($_GET['file'])
  4. {
  5. $file=$_GET['file'];
  6. if (file_exists($file))
  7. {
  8. header('Content-Description: File Transfer');
  9. header('Content-Type: image/png');
  10. header('Content-Disposition: attachment; filename='.basename($file));
  11. header('Content-Transfer-Encoding: binary');
  12. header('Expires: 0');
  13. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  14. header('Pragma: public');
  15. header('Content-Length: ' . filesize($file));
  16. flush();
  17. readfile($file);
  18. unlink($file);
  19. }
  20. }
  21.  
  22. if($_POST['data'])
  23. {
  24. $data = $_POST['data'];
  25. $file = md5(uniqid()) . '.png';
  26. $uri = substr($data,strpos($data,",")+1);
  27. file_put_contents('./'.$file, base64_decode($uri));
  28. echo $file;
  29. exit();
  30. }
  31. ?>


Piszę pracę o Leap Motion, mam dane ćwiczenie które rysuje i po tym kończy się zadanie i button się wyświetla. Ale gdy go klikam niestety nic się nie dzieje a zależy mi mega by się mógł zapisać screen.. Bardzo was proszę pomoc!
franki01
1. Funkcja html2canvas nie jest funkcją JavaScript. Trzeba użyć/pobrać odpowiednie biblioteki. Zrobiłeś to?
2. Nie wiem czy sobie zdajesz sprawę, ale pierwszy if() w PHP jest mega niebezpieczny i wręcz sam błaga o to, żeby wykorzystać jego lukę i wyciągnąć zawartość plików PHP. Przeanalizuj sytuację, gdy w $_GET['file'] znajdzie się tekst "index.php" albo co gorsza dowolny inny plik z serwera (z jakimiś hasłami).
3. Popularne przeglądarki pozwalają na zainstalowanie konsoli błędów dla JavaScript (webdeveloper toolbar dla firefox). Pozwala to na podglądanie błędów spowodowanych przez JavaScript. Zainstaluj sobie taki dodatek. Prawdopodobnie pojawi się jakiś błąd związany z punktem 1.
4. Prawdopodobnie problem jest z uprawnieniami katalogów na serwerze. Jeśli trzymasz skrypty na serwerze pod Windowsem, zignoruj ten punkt. Jeśli na linuxie, czytaj dalej.
a. Utwórz w katalogu ze stroną katalog "tmp".
b. Za pomocą klienta FTP, musisz zmienić mu atrybuty na 0777 (zaznaczyć wszystkie uprawnienia do odczytu, zapisu i wykonania).
c.
  1. file_put_contents('./'.$file, base64_decode($uri));

zmienić na:
  1. file_put_contents('./tmp/'.$file, base64_decode($uri));

d. bezpośrednio przed:
  1. if (file_exists($file))

dodaj taki kod:
  1. $file = './tmp/'.str_replace(array('/', '\\', '..'), '', $file);


Dodatkowo z grubsza pozbędziesz się tym problemu z punktem 2.

Przede wszystkim zacznij od odpowiedniej realizacji punktów 1 i 3.
timez
dzięki za szybką odpowiedź, a istnieje coś właśnie by na spokojnie dało się robić screenshota za pomocą przycisku?
franki01
Jeden z prostszych sposobów właśnie użyłeś, ale gotowców też trzeba umieć używać. Ściągnij html2canvas.js stąd: https://github.com/niklasvh/html2canvas/releases do katalogu ze stroną.
Na stronie w sekcji <head> użyj:
Kod
<script src="html2canvas.js" type="text/javascript"></script>


Teraz masz podane wszystko jak na tacy. Jeśli to Ci nie pomoże, należy wrócić do nauki HTMLa, JavaScriptu i PHP.
timez
mam pobrany html2canvas oraz tak jak napisałeś użyty. No nic, będę próbował dalej. Wielkie dzięki i tak.
franki01
A i jeszcze jedno. Plik php z podanym przez Ciebie kodem musi nazywać się save_screenshot.php. Tak w roli ścisłości.
timez
mam tak nazwane, mam zaimplementowaną bibliotekę, zmieniłem tam ale nadal niestety nie działa. Nawet jak robię na sucho, 2 pliki. Jeden z html a drugi php. włączam przez przeglądarke i mam przycisk button, klikam na niego ale niestety nic się nie robi.
  1. <script type="text/javascript" src="jquery.js"></script>
  2. <script src="html2canvas.js" type="text/javascript"></script>
  3. function take_screenshot()
  4. {
  5. html2canvas(document.body, {
  6. onrendered: function(canvas)
  7. {
  8. var img = canvas.toDataURL()
  9. $.post("save_screenshot.php", {data: img.split(',').pop()}, function (file){
  10. window.location.href = "save_screenshot.php?file="+ file
  11. });
  12. }
  13. });
  14. }
  15. <div id="wrapper">
  16. <div id="screenshot_div">
  17. <button type="button" onclick="take_screenshot()">Take Screenshot</button>
  18. </div>
  19. </div>
  20. </body>
  21. </html>

  1. <?php
  2. if($_GET['file'])
  3. {
  4. $file=$_GET['file'];
  5. $file = './tmp/'.str_replace(array('/', '\\', '..'), '', $file);
  6. if (file_exists($file))
  7. {
  8. header('Content-Description: File Transfer');
  9. header('Content-Type: image/png');
  10. header('Content-Disposition: attachment; filename='.basename($file));
  11. header('Content-Transfer-Encoding: binary');
  12. header('Expires: 0');
  13. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  14. header('Pragma: public');
  15. header('Content-Length: ' . filesize($file));
  16. flush();
  17. readfile($file);
  18. unlink($file);
  19. }
  20. }
  21.  
  22. if($_POST['data'])
  23. {
  24. $data = $_POST['data'];
  25. $file = md5(uniqid()) . '.png';
  26. $uri = substr($data,strpos($data,",")+1);
  27. file_put_contents('./tmp/'.$file, base64_decode($uri));
  28. echo $file;
  29. exit();
  30. }
  31. ?>
franki01
Wklejaj sobie:
Kod
alert('test');

po kolei do funkcji take_screenshot(), potem do onrendered: function(canvas), potem do funkcji w $.post i patrz czy się pokazuje okienko przy każdym wciśnięciu guzika. Wtedy dojdziesz, na czym się kod wiesza. Jeśli korzystasz z aktualnej wersji Firefoxa albo Chroma, wciśnij F12 i masz konsolę błędów - sprawdź czy JavaScript nie generuje żadnych błędów.
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.