2010-09-03 18 views
8

Mam formularz, w którym administrator prześle trzy zdjęcia o różnych wymiarach do trzech różnych oznaczonych katalogów. teraz, aby upewnić się, że nie dostanę problemu z duplikowaniem nazw plików, zaimplementowałem coś takiego, jak php porówna nazwę przesłanego pliku i sprawdzi czy ta nazwa pliku istnieje w wyznaczonym katalogu, jeśli tak, to wyświetli błąd i zatrzymaj wykonywanie skryptu.Zmiana nazwy pliku PHP

Teraz jeden z moich przyjaciół zaproponował mi, że to jest bardzo złe prosząc administratora ręcznie zmienić nazwę pliku obrazu i prosząc ich, aby zająć się problemem plik powielania. rozwiązaniem, które zaproponował, było automatyczne zmienienie nazwy pliku, a następnie zapisanie go w bazie danych, a następnie skierowanie do katalogu.

Jestem mylić o co kombinacja mam dać do pliku przemianowany również upewnić się, pozostanie ono unikalną nazwę pliku, aby być bardziej precyzyjny i chciałby, aby zrozumieć moją strukturę katalogów

jak powiedziałem nie będzie trzy zdjęcia pliki admin będzie przesyłanie mianowicie

a) Tytuł zdjęcia b) Krótki Picture c) Szczegóły zdjęcia

i wszystkie trzy pliki obraz będzie przenieść do odpowiedniego katalogu, np. tytułowe zdjęcie przechodzi do katalogu tytułowego i tak dalej.

używam do skryptu poniżej obecnie tylko do przenoszenia i przechowywania nazwę pliku ze ścieżką przy użyciu varchar w bazie danych.

$ns_pic_title_loc= $_FILES["ns_pic_title"]["tmp_name"]; 
$ns_pic_title_name = $_FILES["ns_pic_title"]["name"]; 
move_uploaded_file($ns_pic_title_loc, $ns_title_target.$ns_pic_title_name) or die(mysql_error()); 

to tylko przykładowy kod i nie zawierałem funkcji sprawdzania poprawności, której używam. myślałem jak chcę zmienić nazwy wszystkich plików jak

a) w tytule katalogu plik powinien być przechowywany jako. title_1.jpg title_2.jpg title_3.jpg title_4.jpg

i tak dalej

i ten sam sposób do reszty zdjęć. jak mogę to zrobić? jakiej funkcji używam do osiągnięcia celu. a jeśli nie jest to dobry sposób na zmianę nazwy pliku, doceniłbym każdą sugestię, aby zmienić nazwę pliku.

góry dzięki

Odpowiedz

2

Cóż, tutaj jest możliwe rozwiązanie:

  1. Get dodany pliku z $_FILES["ns_pic_title"]["name"] i oddzielnym rozbudowa lub jeśli mówimy tylko o pliki graficzne uzyskać typ obrazu z getimagesize($_FILES["ns_pic_title"]["tmp_name"]);
  2. Sprawdź swoją bazę dla maksymalnego id zapisów graficznych i uczynić z $file_name zmienną 'title_'.($max_id + 1)
  3. W tym momencie powinieneś mieć $ nazwa_pliku i $ FILE_EXTENSION tak zrobić move_uploaded_file($_FILES["ns_pic_title"]["tmp_name"], $ns_title_target.$file_name.'.'.$file_extension)

Mam nadzieję, że to ma sens i pomaga .

+0

To jest lepsza alternatywa dla sugestii typu blob, a jednocześnie nadal używa się identyfikatora/klucza podstawowego z bazy danych. Używałem tego wiele razy sam. – Treffynnon

+1

mimo że jest to dobre rozwiązanie, należy rozważyć użycie funkcji tempnam. właśnie taką funkcję, której szukałem. –

+0

To dobry sposób na zsynchronizowanie identyfikatorów bazy danych i plików obrazów. W mojej odpowiedzi ma warunki wyścigowe, takie jak sugestia dotycząca znacznika czasu, ale znowu nie jest to wielka sprawa na stronie z kilkoma administratorami ładującymi zdjęcia. – Jeff

2

Istnieje kilka dobrych opcji o różnych zaletach i wadach.

  • Wykorzystanie PHP tempnam podczas przenoszenia pliku i zapisać ścieżkę w swojej bazie danych mysql. tempnam generuje unikalną nazwę pliku.

  • Use mysql to store the image content in a blob. W ten sposób uzyskasz dostęp do zawartości obrazu za pośrednictwem id zamiast nazwy ścieżki.

+4

Nie polecam przechowywania obrazów witryny w bazie danych. Problemy z wydajnością mogą pojawić się w bazie danych, a także brak buforowania obrazów. – janosrusiczki

+1

użyłbym funkcji tempnam i na pewno uniknę użycia bloba, wcześniej użyłem bloba i mam problem z wydajnością. +! dla reccomending tempnam dziękuję. –

+0

Zgadzam się, dodałem tylko sugestię typu blob dla kompletności. –

2

Zamiast logiki, aby dowiedzieć się, co najnowsza nazwa obraz i obliczyć następny numer przyrost, dlaczego nie wystarczy użyć PHP's tempnam() function? Generuje unikalną nazwę z wybranym prefiksem (tj. "Tytuł", "krótki", "szczegół").Możesz również po prostu wstawić znacznik czasu do nazwy pliku - jeśli nie masz wielu administratorów przesyłających zdjęcia w tym samym czasie, to powinno obsługiwać większość konfliktów nazw.

Od zdjęciach będą sortowane na już title, brief i detail katalogów, nie jest to naprawdę konieczne, aby wymienić każde zdjęcie title_*, brief_* i detail_*, prawda? Jeśli znajduje się w katalogu tytułowym, to oczywiście jest to tytułowe zdjęcie.

Dodaje również nazwy plików do bazy danych. Następnie w innym miejscu w aplikacji, gdy chcesz wyświetlić obraz, zakładam, że otrzymujesz poprawną nazwę pliku z bazy danych. Tak naprawdę nie jest ważne, jaka jest rzeczywista nazwa pliku, o ile aplikacja wie, gdzie ją znaleźć. Jeśli to prawda, nie trzeba mieć bardzo przyjaznej nazwy, dlatego nazwa pliku tempnam() lub znacznik czasu plus oryginalna nazwa pliku byłyby do przyjęcia.

+0

Wow, właśnie taka funkcja, której szukałem, jesteś od góry do dołu. teraz próbuję go .. wielkie dzięki. –

0

Ponieważ przechowujesz odniesienia do DB, wolałbym tylko md5 datetime i użyć tego dla nazwy pliku i przechowywać nazwę pliku dysku na DB. Nie ma znaczenia, jaka nazwa jest zapisywana na dysku tak długo, jak można wskazać na to z unikalną nazwą w DB.

Używam tej metodologii iw żadnym z moich testów nazwa dysku (md5 z datetime) nigdy nie wymaga wielu prób.

Powiązane problemy