Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zmniejszanie rozmiaru zdjęcia podczas uploadu
Forum PHP.pl > Forum > Przedszkole
adiseq
Witam serdecznie,

Staram się zrobić skrypt w którym użytkownik może zmieniać dane wizytówki na stronie. Bardzo prosta strona, kilka danych jak nazwa firmy email i nr tel oraz logo firmy. Udało mi się zrobić że po zalogowaniu użytkownik widzi zapisane dane w bazie i ma możliwość je edytować. Zdjęcie, wgrywa do folderu UPLOADS a ścieżkę do zdjęcia dopisuje do danego użytkownika w bazie. Wszystko ok. Problem polega na tym, że chciałbym ustawić aby zdjęcie które wgrywają użytkownicy zmieniało się do rozmiaru np 640px x 400 px. Ma to być tylko małe logo widoczne w wizytówce, a nie wielki obraz, który będzie mi zaśmiecał serwer.

Poniżej kod formularza:
  1. <?php if ($_SESSION['auth'] == TRUE)
  2. {
  3. echo 'Zalogowany jest: '. $_SESSION['user'];
  4. require_once('db.php');
  5. $id_user=$_SESSION['user'];
  6. $sql=mysql_query("select * from user where login='$id_user'");
  7. $row = mysql_fetch_array($sql);
  8. echo '<form enctype="multipart/form-data" method="POST" action="edytuj.php">';
  9. echo '<b>Nazwa firmy:</b><br /> ';
  10. echo '<input type="text" size=30 name="nazwa" disabled value="'.$row['nazwa'].'"><br />';
  11. echo '<b>NIP:</b><br /> ';
  12. echo '<input type="text" size=30 name="nip" disabled value="'.$row['nip'].'"><br />';
  13. echo '<b>Kod pocztowy:</b><br /> ';
  14. echo '<input type="text" size=30 name="kodp" value="'.$row['kodp'].'"><br />';
  15. echo '<b>Miejscowość:</b><br /> ';
  16. echo '<input type="text" size=30 name="miejscowosc" value="'.$row['miejscowosc'].'"><br />';
  17. echo '<b>Adres:</b><br /> ';
  18. echo '<input type="text" size=30 name="ulica" value="'.$row['ulica'].'"><br />';
  19. echo '<b>Telefon:</b><br /> ';
  20. echo '<input type="text" size=30 name="telefon" value="'.$row['telefon'].'"><br />';
  21. echo '<b>E-mail:</b><br /> ';
  22. echo '<input type="text" size=30 name="email" value="'.$row['email'].'"><br />';
  23. echo '<b>Strona www:</b><br /> ';
  24. echo '<input type="text" size=30 name="strona" value="'.$row['strona'].'"><br />';
  25. echo '<b>Opis:</b><br /> ';
  26. echo '<input type="text" size=30 name="opis" value="'.$row['opis'].'"><br />';
  27. echo '<b>Logo:</b><br /> ';
  28. echo '<input type="file" name="plik" id="plik"><br />';
  29. echo '<img src="'. $row['logo'] . '" /><br />';
  30.  
  31. echo '<input type="submit" value="Zmień" /> ';
  32. echo '</form>';
  33. echo ''.$row['nazwa'].'<br />';
  34. echo '<a href="index.php?logout">Wyloguj się</a>';
  35. }


a teraz kod z edytuj.php

  1. <?php if ($_SESSION['auth'] == TRUE) {
  2.  
  3. $id_user=$_SESSION['user'];
  4. // odbieramy dane z formularza
  5. $kodp = $_POST['kodp'];
  6. $miejscowosc = $_POST['miejscowosc'];
  7. $ulica = $_POST['ulica'];
  8. $telefon = $_POST['telefon'];
  9. $email = $_POST['email'];
  10. $strona = $_POST['strona'];
  11. $opis = $_POST['opis'];
  12.  
  13.  
  14. $connection = @mysql_connect($dbhost, $dblogin, $dbpass)
  15. or die('Brak połączenia z serwerem MySQL');
  16. $db = @mysql_select_db('adiseq_hf', $connection)
  17. or die('Nie mogę połączyć się z bazą danych');
  18.  
  19.  
  20. $plik_tmp = $_FILES['plik']['tmp_name'];
  21. $plik_nazwa = $_FILES['plik']['name'];
  22. $plik_rozmiar = $_FILES['plik']['size'];
  23.  
  24.  
  25. if(is_uploaded_file($plik_tmp)) {
  26. move_uploaded_file($plik_tmp, "uploads/$id_user.$plik_nazwa");
  27. echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze
  28. <strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
  29. $ins1 = @mysql_query("UPDATE user SET logo='http://domena.pl/wizytowka/uploads/$id_user.$plik_nazwa' WHERE login='$id_user'");
  30. }
  31.  
  32. $ins = @mysql_query("UPDATE user SET kodp='$kodp', miejscowosc='$miejscowosc', ulica='$ulica', telefon='$telefon' WHERE login='$id_user'");
  33.  
  34. if($ins)
  35. echo 'Dane zostały zmienione poprawnie <meta http-equiv="refresh" content="1; URL=hideus.php">';
  36.  
  37. else echo "Błąd nie udało się zmienić danych";
  38.  
  39. mysql_close($connection);
  40. }
  41.  
  42. elseif ($_SESSION['auth'] == TRUE) {
  43.  
  44. echo 'Treść dostępna tylko dla administratora<br />';
  45. echo '<a href="index.php?logout">Wyloguj się</a>';
  46. }
  47.  
  48. else {
  49.  
  50.  
  51. echo '<meta http-equiv="refresh" content="1; URL=index.php">';
  52. echo '<p style="padding-top:10px;color:white";><strong>Próba nieautoryzowanego dostępu...</strong><br />trwa przenoszenie do formularza logowania</p>';
  53. }
  54.  
  55. ?>

Wiem, że w kodzie jest duży bałagan ale jestem początkującym i dużo rzeczy robiłem metodą prób i błędów także proszę o wyrozumiałość wink.gif Wiem, też że funkcja mysql_query jest już na wymarciu ale jak na razie mi wystarczy smile.gif

Jak proponujecie rozwiązać sprawę z rozmiarem zdjęcia? Czy da się przeskalować zdjęcie do maksymalnego rozmiaru 640x400?

Pozdrawiam,
Adrian
mariolita
A uploadowane zdjęcia wszystkie będą w SKALI 640 na 400 ? bo jak będzie inne to będą rozciągnięte po zmianie (na wysokość albo szerokość). Więc przyadłoby się jeszcze przyciąć? No i jeszcze jedno, zdjęcia muszą mieć rozmiar 640px na 400 px minimum.
adiseq
nie nie, nie chcę żeby wszystkie miały taką wielkość ale żeby to był największy rozmiar z możliwych jak np logo będzie 1000px x 1000 px to żeby przeskalowało tak żeby było 400x400, a np logo 1200x800 przeskalowało na 640x426 itd.
Kombinowałem coś z taką funkcją:
  1. function resize_image($file, $w, $h, $crop=FALSE) {
  2. list($width, $height) = getimagesize($file);
  3. $r = $width / $height;
  4. if ($crop) {
  5. if ($width > $height) {
  6. $width = ceil($width-($width*abs($r-$w/$h)));
  7. } else {
  8. $height = ceil($height-($height*abs($r-$w/$h)));
  9. }
  10. $newwidth = $w;
  11. $newheight = $h;
  12. } else {
  13. if ($w/$h > $r) {
  14. $newwidth = $h*$r;
  15. $newheight = $h;
  16. } else {
  17. $newheight = $w/$r;
  18. $newwidth = $w;
  19. }
  20. }
  21. $src = imagecreatefromjpeg($file);
  22. $dst = imagecreatetruecolor($newwidth, $newheight);
  23. imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  24.  
  25. return $dst;
  26. }

Wywołanie:
  1. $img = resize_image('/path/to/some/image.jpg', 200, 200);

Ale nie wiem jak i w którym momencie ją wywołać
viking
Po move_uploaded_file kiedy masz już ten plik u siebie na serwerze. Twój kod jest mocno przestarzały. Używasz niewspieranych funkcji mysql do tego ukrywasz wszystkie błędy.
adiseq
Zdaje sobie sprawę z tego że kod jest przestarzały ponieważ opierałem go o różne poradniki (niektóre nawet z 2007 roku). Chodzi mi o bardzo prostą stronę ponieważ chce zobaczyć czy pomysł "zaskoczy" jak się uda to na pewno powierzę napisanie strony odpowiedniej osobie ale na razie nie chcę wydawać pieniędzy na coś co może nigdy nie powstać.
Dodałem wywołanie po move_uploaded_file niestety nic to nie dało.
  1. if(is_uploaded_file($plik_tmp)) {
  2. move_uploaded_file($plik_tmp, "uploads/$id_user.$plik_nazwa");
  3. $img = resize_image("uploads/$id_user.$plik_nazwa", 640, 400);

Mógłbyś podpowiedzieć co źle zrobiłem?

Pozdrawiam,
Adrian
kapslokk
funkcja resize_image zwraca Ci obrazek, ale istnieje on tylko w pamieci. Musisz zapisac go na dysku.
adiseq
funkcją move_uploaded_file?
kapslokk
http://php.net/manual/en/function.imagejpeg.php
I analogicznymi
adiseq
Dziękuję wszystkim, poradziłem sobie z zapisem smile.gif
Mam tylko jeszcze problem, funkcja resize_image (niżej) działa na plikach jpg, natomiast jeżeli wgarm plik png to rozmiar zmienia ale cały obraz jest czarny sad.gif
  1. function resize_image($file, $w, $h, $crop=FALSE) {
  2. list($width, $height) = getimagesize($file);
  3. $r = $width / $height;
  4. if ($crop) {
  5. if ($width > $height) {
  6. $width = ceil($width-($width*abs($r-$w/$h)));
  7. } else {
  8. $height = ceil($height-($height*abs($r-$w/$h)));
  9. }
  10. $newwidth = $w;
  11. $newheight = $h;
  12. } else {
  13. if ($w/$h > $r) {
  14. $newwidth = $h*$r;
  15. $newheight = $h;
  16. } else {
  17. $newheight = $w/$r;
  18. $newwidth = $w;
  19. }
  20. }
  21. $src = imagecreatefromjpeg($file);
  22. $dst = imagecreatetruecolor($newwidth, $newheight);
  23. imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  24.  
  25. return $dst;
  26. }

Problem chyba jest w tej linijce
  1. $src = imagecreatefromjpeg($file);

jakieś rady? czy ta funkcja będzie działać tylko z rozszerzeniem jpg?
trueblue
Ta funkcja nie działa z rozszerzenie jpg, lecz z formatem JPEG.
Wejdź do manuala i poszukaj w okolicy podobnych funkcji dla innych formató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.