Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: upload skalowanego pliku i odczyt rozmiaru przed wysłaniem na serwer
Forum PHP.pl > Forum > PHP
tish83
Czy istnieje możliwość odczytania wielkości przeskalowanego pliku zanim zostanie on zapisany na serwerze? ew. jakiś zapis w pamięci tymczasowej?
mój kod:
  1. function CreateImageJPG($new_width, $new_height, $src, $path, $file, $quality)
  2. {
  3. $tmp_image=imagecreatefromjpeg($src);
  4. $width = imagesx($tmp_image);
  5. $height = imagesy($tmp_image);
  6. $new_image = imagecreatetruecolor($new_width,$new_height);
  7. imagecopyresized($new_image, $tmp_image,0,0,0,0, $new_width, $new_height, $width, $height);
  8. imagejpeg($new_image, $path.$file, $quality);
  9. }
  10.  
  11. function scaleh($width, $height, $new_width)
  12. {
  13. if ($new_width>$width)
  14. {
  15. return ($height);
  16. }
  17. else
  18. {
  19. $new_height=$new_width/$width*$height;
  20. return($new_height);
  21. }
  22. return ($height);
  23. }
  24. function scalew($width, $height, $new_height)
  25. {
  26. if ($new_height>$height)
  27. {
  28. return ($width);
  29. }
  30. else
  31. {
  32. $new_width=$new_height/$height*$width;
  33. return($new_width);
  34. }
  35. return ($width);
  36. }
  37.  
  38.  
  39. if (is_uploaded_file($_FILES['obraz1']['tmp_name']))
  40. {
  41. $src=$_FILES['obraz1']['tmp_name'];
  42. $path1='photos/maxi/';
  43. $path2='photos/mini/';
  44. $a=getimagesize($_FILES['obraz1']['tmp_name']);
  45. $maxphotouserid=$DB->GetOne("SELECT MAX(id) FROM zdjecia_klasa WHERE userid='".$_GET['userid']."'");
  46. mysql_query("INSERT INTO zdjecia_klasa (plik, rok_u, profilid, klasaid, userid) VALUES ('', '', '', '', '".$_GET['userid']."')");
  47. $maxphotoid=mysql_insert_id();
  48.  
  49.  
  50. $t=strtolower(substr($_FILES['obraz1']['name'], -3));
  51. if ($t=="jpg" || $t=="gif" || $t=="bmp" || $t=="png")
  52. {
  53.  
  54. $new_height1=480;
  55. $new_width1=scalew($a[0], $a[1], $new_height1);
  56.  
  57. $new_height3=120;
  58. $new_width3=scalew($a[0], $a[1], $new_height3);
  59.  
  60. $file='klasa_'.$_GET['userid'].'_'.$maxphotoid.'_'.$_FILES['obraz1']['name'];
  61.  
  62. $quality1=75;
  63. $quality3=75;
  64.  
  65. if ($t=="jpg")
  66. {
  67. CreateImageJPG($new_width1, $new_height1, $src, $path1, $file, $quality1);
  68. CreateImageJPG($new_width3, $new_height3, $src, $path2, $file, $quality3);
  69. }
  70.  
  71.  
  72. $dane=$DB->GetRow("SELECT * FROM dziennik WHERE userid='".$_GET['userid']."'");
  73. mysql_query("UPDATE zdjecia_klasa SET plik='".$file."', rok_u='".$dane['rok_u']."', profilid='".$dane['profilid']."', klasaid='".$dane['klasaid']."', userid='".$_GET['userid']."' WHERE id='".$maxphotoid."'");
  74.  
  75. echo 'zdjęcie zostało wgrane :)<br>'.$file;
  76. }
  77. else
  78. {
  79. echo 'nieobslugiwany format pliku '.substr($_FILES['obraz1']['name'], -3);
  80. }
  81. }
  82.  


zdjęcie po zeskalowaniu znacznie się zmniejsza, a max ilość miejsca na galerię dla jednego użytkownika to 10MB. Chciałabym odczytać wielkość pliku po zeskalowaniu, żeby uniknąć sytuacji, że plik wysyłany jest na serwer, po czym dopiero sprawdza ile w sumie zdjęcia zajmuja miejsca i w razie prekroczenia go trzeba usuwać wgrany plik i dane z bazy - za duże obciążenie dla strony...
jaslanin
  1. <input type="hidden" name="MAX_FILE_SIZE" value="4194304" />


możesz ustawić by dało się wgrać pliki które nie przekraczają określonego rozmiaru i ustawić to na ilość miejsca jakie zostało użytkownikowi, jeżeli jest limit wielkości pliku to można to połączyć w ten sposób że bierze się minimalną wartość z obu.

niemniej jednak trzeba też to sprawdzać po stronie serwera a nie tylko użytkownika,

pewnie też da się to zrobić w JS, ale nie jestem pewny.
PrinceOfPersia
myślałbym o Canvasie i o tym, że możnaby ew. przeskalować obrazek po stronie przeglądarki i wysłać już przeskalowany.
w necie widziałem tutoriale oraz jakąś gotową bibliotekę.
poza tym w HTML5 jest coś takiego jak FileApi, ale nie wiem jak to dokładnie działa.

albo inne rozwiązanie - ale nic mi nie przychodzi do głowy.



tish83
No niestety musiałam na szybko zrobić tak, że przesyła zdjęcie na serwer i tam sprawdza czy nie przekroczono miejsca. Jeżeli przekroczono to usuwa z serwera i zwraca błąd :/ straszne obciążenie dla serwera - ale trudno. W wolnej chwili pomyślę o Canvas. Dziękuję wszystkim za dobre chędzi.
Temat do zamknięcia
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.