Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] upload zdjęc - te same nazwy
Forum PHP.pl > Forum > PHP
grzegorz_g
proszę o podpowiedź jak rozwiązać taki problem:

mam komis samochodowy i chciałbym aby user dodawał zdjęcia swojego samochodu . Do uploadu używam takiego czegoś:

  1. <?php
  2.  
  3.  // upolad zdjęć
  4. foreach ($_FILES[&#092;"foto\"][\"error\"] as $key => $error) {
  5.  if ($error == UPLOAD_ERR_OK) {
  6.  $tmp_name = $_FILES[&#092;"foto\"][\"tmp_name\"][$key];
  7. $name = $_FILES[&#092;"foto\"][\"name\"][$key];
  8.  $name= strtr($name, 'ążśźęćńół', 'azszecnol');
  9.  move_uploaded_file($tmp_name, &#092;"foto/$name\");
  10.  $array[] = $name;
  11.  
  12. resizeImage(&#092;"foto/$name\", 60, 60, \"foto/mini_\".$name, 75);
  13. resizeImage(&#092;"foto/$name\", 320, 280, \"foto/ok_\".$name, 75);
  14. unlink(&#092;"foto/$name\");
  15. }
  16. }
  17.  
  18. ?>


problem polega na tym iż gdy jeden uzer wprowadzi fotkę o nazwie auto.jpg a później inny dla innego samochodu też wprowadzi fotkę "auto.jpg" nadgra się.

Jak wybrnąć z tego problemu.
mario
ja to rozwiązałem w prosty sposób, wyciagam rozszerzenie uploadowanego pliku, losuję ciąg znaków i zapisuję pod nową losową nazwą:

  1. <?php
  2. $ext = pathinfo ($zdjecie_wstaw_name);
  3. $ext = $ext[&#092;"extension\"];
  4.  
  5. If ($ext==&#092;"gif\" || $ext==\"GIF\" || $ext==\"jpg\" || $ext==\"JPG\" || $ext==\"jpeg\" || $ext==\"JPEG\" || $ext==\"png\" || $ext==\"PNG\" && $ok==\"1\" && $ext!=\"\")
  6.  {
  7.  $nazwa = md5(uniqid(rand()));
  8.  $nazwa_pliku = &#092;"$nazwa\".\"$ext\";
  9.  copy (&#092;"$zdjecie_wstaw\", \"$nazwa_pliku\");
  10.  }
  11. ?>
tara
nie lepiej numerować ? od 1 ?
  1. <?
  2. $zdjec = count(glob(&#092;"galeria/katalog/*.jpg\"));
  3. $jeden = 1;
  4.  
  5. $nowanazwa= $zdjec+$jeden;
  6.  
  7.  
  8.  
  9. if (move_uploaded_file($_FILES['fotka1']['tmp_name'], &#092;"galeria/katalog/\".$nowanazwa.\".jpg\")) { 
  10. print(&#092;"Zdjęcie o numerze <b> $nowanazwa</b> zostało pomyślnie wysłane na serwer do galerii \"); 
  11. } else { 
  12. print(&#092;"Niestety przysłanie nie powiodło się. \"); 
  13. }
  14. ?>


a jak bardzo chcesz zostać przy nazwach od usera, sprawdzaj czy plik istnieje przez file_exists.
mario
rozwiązanie które proponujesz jest proste, lecz ma wadę. Przy uploadzie bez możliwości kasowania zdjęc spoko, ale w momencie kiedy user będzie miał możliwość skasowania swojej fotki, pozostają "luki w liczeniu", tzn. jeżeli powiedzmy zostanie skasowane kilka(naście) fotek zostają wolne cyfry które można ponownie użyć. Gdyż zliczasz ilość zdjęć w katalogu. I tak powiedzmy nie ma 5, 9 i 15 zdjęcia z 15 wczytanych.
Skrypt poda że $zdjec = 12 gdyż 15-3 fotki skasowane daje właśnie 12. Ale nie możesz zapisać fotki jako 13.jpg gdyż jest, 14.jpg również itd. Musiałby zrobić pętelkę i sprawdzać czy jest wolne miejsce na następne liczenie, czyli dopiero by zapisał jako 16.jpg co daje już 4 razy wykonanie pętli (13, 14, 15, 16). Gdy tego będzie więcej analogicznie pętla zostanie wykonana znacznie więcej razy. Nie wspominam już o możliwości powtórnego nazewnictwa 5.jpg, 9.jpg i 15.jpg

W moim rozwiązaniu mając daną losową nazwę składającą się z 32 znaków (cyfry 0-9 i litery a-z) masz znacznie więcej kombinacji, można sobie policzyć ile jest mozliwych takich kombinacji - mnóstwo. Gwarantuję że aby się dana nazwa powtórzyła jest tak jak szansa wygrania w toto, więc co najwyżej warunek sprawdzający czy dana fotka o takiej nazwie istnieje wykona się co najwyżej raz.

Moim zdaniem obie metody są dobre, jak każdy kod php ma swoje wady i zalety. Każdy cel można osiągnąć na milion sposobów, a jak to zrobić należy już do twórcy.
tara
akurat ten mój kod został stworzony bez możliwości usuwania fotek winksmiley.jpg

w przypadku o którym piszesz trza by zmodyfikować o sprawdzanie czy plik istnieje.

EDIT

można by też datą i godziną wstawienia. Wtedy by łatwiej było obsługiwać taką galerie fotek.
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.