Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]upload obrazków
Forum PHP.pl > Forum > Przedszkole
inny02
witam

ostatnio kupiłem skrypt hostingu obrazków i chciałbym zmienić w nim linki i jest taki problem jak zrobić, żeby
jak wrzucimy dwa takie same pliki(chodzi o nazwę) to żeby ten drugi miał dodane przez skrypt do tej nazwy dodatkową litera/cyfra.

przykład wrzucamy plik.jpg a następnie znów plik.jpg a skrypt w tym drugim pliku zmienia nazwę przed wysłaniem na serwer na plik2.jpg
i nie mogą się nigdy zdublować te nazwy, bo wiadomo plik na serwerze się nadpiszę i pod danym adresem będzie się wyświetlał inny obrazek.

Tutaj zamieszczam plik który odpowiada za wrzucanie plików na serwer i zmianę nazwy. Aktualnie robi długi ciąg liter i cyfr.

http://odsiebie.com/pokaz/5032099---4787.html

Linie 173/179 odpowiadają za zamianę wgrywanych plików

Dzięki za pomoc
Suh
Możesz sobie dopisać do tego powiedzmy jakąś tablicę, w której będziesz zapisywał nazwy wysłanych w danym żądaniu plików. Po czym nazwę każdego wysyłanego pliku będziesz sprawdzał pod kątem istnienia jej w tablicy. Jeżeli istnieje to w miejscu gdzie masz losowo tworzona nazwę dodajesz powiedzmy jakiś znaczek - dzięki czemu nazwa będzie już zupełnie inna.
inny02
Dzięki.

słuchaj z PHP zaczynam przygodę od niedawną to raczej sobie nie poradzę, jeśli ktoś dopiszę mi to co wyżej pisał Suh to mogę zapłacić
Czyli tak wgrywam plik o takiej samej nazwie wykrywa mi, że już jest taki plik istnieje i porostu na końcu dodaje jakieś znaczek
FireMan
Proste. Też to robiłem aby to zrobić możesz dać ze przed nazwa plik.jpg dodaje sie jakies cyfry np. 02432. Najlepiej wziąć miesiąc, rok, dzień, sekundę.

  1. $data_uploadu = date("myds");


i teraz przed nazwą pliku dajesz $data_upload

Np.

  1. $uploadPath = "pictures/"$data_upload.$rndName;
Suh
@inny02 posłuchaj jest prostsza metoda. To co rano pisałem - faktycznie zdało by egzamin ale po co komplikować.
Nazwy po uploadzie w tym skrypcie są hashowane za pomocą md5(). Wystarczy, że zmienisz w linijce 175 :
  1. md5($n . date("d-m-y") . time())

na
  1. md5($n . date("d-m-y") . microtime())


Dzięki czemu niezależnie czy wgrasz 2 czy 20 plików o tej samej nazwie - każdy będzie miał po uploadzie inną nazwę.
inny02
z haszowania md5 nie chcę korzystać ponieważ daje to za długi adres później.
Chcę tylko, żeby dodawało na końcu nazwy pliku, np cyfrę 1, 2, 3, itd(taka cyfra ile razy będzie wgrywany plik z tą samą nazwą). Ale tylko, jeśli wgrywany plik będzie miał taką samą nazwę, instniejącego już pliku na serwerze. A jak wgrywam plik z nazwą, której jeszcze nie ma na serwerze to nie potrzebne dodawanie nic do nazwy, wyłącznie jak nazwą będzie tak sama jak już wcześniej wgrana snitch.gif
piotrekkr
  1. $filename = 'plik.jpg';
  2. $dir = '/katalod/ze/zdjeciami/';
  3. $path = $dir . $filename;
  4. $segments = pathinfo($path);
  5. while(file_exists($path)){
  6. $path = $dir . $segments['filename'] . '_' . $i . '.' . $segments['extension'];
  7. }
  8.  
  9. //zapis pod $path...
inny02
a jak dodać ten kod do pliku, aby działało. Coś mi to nie działa dry.gif

  1. if ($_FILES[$name]["error"] > 0) {
  2. die("Error: " . $_FILES[$name]["error"]);
  3. }
  4. else {
  5. $n = $_FILES[$name]["name"];
  6. $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);
  7. $uploadPath = "pictures/" . $rndName;
  8. $tempPath = $_FILES[$name]["tmp_name"];
  9. move_uploaded_file($tempPath, $uploadPath);
  10. }
  11.  
  12. }
  13. else
  14. die("Sorry ! \"{$_FILES[$name]["name"]}\" is an invalid image.");
piotrekkr
za
  1. $uploadPath = "pictures/" . $rndName; daj:

daj
  1. $segments = pathinfo($uploadPath);
  2. while(file_exists($uploadPath)){
  3. $uploadPath = $dir . $segments['filename'] . '_' . $i . '.' . $segments['extension'];
  4. }

reszta bez zmian...
inny02
no ok dodałem,

  1. else {
  2. $n = $_FILES[$name]["name"];
  3. $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);
  4. $uploadPath = "pictures/" . $rndName;
  5. $segments = pathinfo($uploadPath);
  6. while(file_exists($uploadPath)){
  7. $uploadPath = $dir . $segments['filename'] . '_' . $i . '.' . $segments['extension'];
  8. }
  9. $tempPath = $_FILES[$name]["tmp_name"];
  10. move_uploaded_file($tempPath, $uploadPath);
  11. }
  12.  


ale jak pozostawię $uploadPath = "pictures/" . $rndName; bez zmian to dalej będzie używać md5
funkcja move_uploaded_file wywala
failed to open stream: No such file or directory in /home/pic/www/process.php on line 182 // to jest move_uploaded_file($tempPath, $uploadPath);
piotrekkr
To sobie zmien $rndName = $_FILES[$name]["name"]; czy na co tam chcesz...
inny02
działa tongue.gif
ale są małe problemy mianowicie
1 obrazek plik.jpg wrzuci wszytko ładnie do folderu pictures z nazwą plik.jpg
2 obrazek plik.jpg wrzuci już do głównego katalogu strony z nazwą plik_1.jpg
3 obrazek plik.jpg nie wrzuci w ogóle tylko wyskoczy komunikat po kliku sekundach Fatal error: Maximum execution time of 30 seconds exceeded in /home/pic/www/process.php on line 179

179 linia $uploadPath = $dir . $segments['filename'] . '_' . $i . '.' . $segments['extension'];
Fafu
chyba powinno byc tak:
  1. 1.
  2. $segments = pathinfo($uploadPath);
  3. $i=0;
  4. while(file_exists($uploadPath)){
  5. $i++;
  6. $uploadPath = $dir . $segments['filename'] . '_' . $i . '.' . $segments['extension'];
  7. }
inny02
Cytat(Fafu @ 25.08.2009, 17:54:59 ) *
chyba powinno byc tak:
  1. 1.
  2. $segments = pathinfo($uploadPath);
  3. $i=0;
  4. while(file_exists($uploadPath)){
  5. $i++;
  6. $uploadPath = $dir . $segments['filename'] . '_' . $i . '.' . $segments['extension'];
  7. }



-obrazek z nazwą, jak jeszcze nie była wgrywana na serwer wywali błąd, ale wrzuci go do poprawnego katalogu:


Warning: getimagesize(/tmp/phpMJAPZ6) [function.getimagesize]: failed to open stream: No such file or directory in /home/picl/www/process.php on line 91

Warning: getimagesize(/tmp/phpMJAPZ6) [function.getimagesize]: failed to open stream: No such file or directory in /home/pic/www/process.php on line 91

Warning: getimagesize(/tmp/phpMJAPZ6) [function.getimagesize]: failed to open stream: No such file or directory in /home/pic/www/process.php on line 91
Sorry ! "asd.jpg" is an invalid image.

linia 91:
  1. if ( ( list($width, $height, $temptype, $attr) = getimagesize( $path ) ) !== false ) {
  2. $x = $temptype;



-Obrazek z instniejącom nazwą na serwerze wgra się poprawnie i oczywiście nazwa się zmieni, ale jest wgrany do głównego katalogu strony zamiast do katalogu picutres

-Jeśli wrzucam dwa lub więcej obrazków wgra się tylko pierwszy obrazek na serwer
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.