Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: <input> zmiana nazwy przesyłanego pliku
Forum PHP.pl > Forum > PHP
maxcv5123
Witam,
Korzystam z tego (https://www.developphp.com/video/JavaScript/File-Upload-Progress-Bar-Meter-Tutorial-Ajax-PHP) gotowego rozwiązania do przesyłania plików na serwer. Dodatkowo sam zrobiłem zapis url pliku do bazy. Mam jednak problem aby każdy plik miał inną nazwę. Chcę uniknąć posiadania na serwerze plików o dwóch identycznych nazwach. I tu pytanie jak to zrobić, aby np oryginalny plik o nazwie 'super pies.mp4' miał nazwę np 'super-pies-*.mp4' gdzie * to aktualna data
Niree
Raczej opcji z datą nie polecam. Ktoś może np. wrzucić plik tego samego dnia i jeden plik zastąpi się drugim plikiem (zakładając, że będą one tej samej nazwy).
Bardziej pasowałoby użyć generatora np. 5 losowych znaków z cyfr i liter, wtedy zmniejszy się możliwość zastąpienia pliku.

Ale jeżeli już:

  1. $temp = explode(".", $fileName); //rozdzielamy nazwe pliku od typu ($temp[0] - super pies, $temp[1] - mp4)
  2. $text = str_replace(' ','_',$temp[0]); //zamiana spacji na _ (wynik: $text = super_pies)
  3. $newfilename = "test_uploads/".$text."-".date("Y-m-d").".".end($temp); // ustawiamy ścieżkę i nazwę nowego pliku.
  4. if(move_uploaded_file($fileTmpLoc, $newfilename)){
  5. echo "$fileName upload is complete";
  6. //zapytanie mysql itp
  7. } else {
  8. echo "move_uploaded_file function failed";
  9. }


Wersja z generatorem:

  1. function passwordGenerator($length) {
  2. $uppercase = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'W', 'Y', 'Z');
  3. $lowercase = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'w', 'y', 'z');
  4. $number = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  5.  
  6. $password = NULL;
  7.  
  8. for ($i = 0; $i < $length; $i++) {
  9. $password .= $uppercase[rand(0, count($uppercase) - 1)];
  10. $password .= $lowercase[rand(0, count($lowercase) - 1)];
  11. $password .= $number[rand(0, count($number) - 1)];
  12. }
  13.  
  14. return substr($password, 0, $length);
  15. } //wrzucić nad kodem
  16.  
  17. $temp = explode(".", $fileName); //rozdzielamy nazwe pliku od typu ($temp[0] - super pies, $temp[1] - mp4)
  18. $text = str_replace(' ','_',$temp[0]); //zamiana spacji na _ (wynik: $text = super_pies)
  19. $newfilename = "test_uploads/".$text."-".passwordGenerator(5).".".end($temp); // ustawiamy ścieżkę i nazwę nowego pliku.
  20. if(move_uploaded_file($fileTmpLoc, $newfilename)){
  21. echo "$fileName upload is complete";
  22. //zapytanie mysql itp
  23. } else {
  24. echo "move_uploaded_file function failed";
  25. }
Pilsener
A po co tak kombinować?
1. Jeśli zakładamy, że zawsze mamy bazę danych to używamy po prostu ID z bazy - proste i intuicyjne
2. Jeśli dopuszczamy brak bazy to nazwę pliku możemy wygenerować (mamy w tym celu dość szerokie spektrum funkcji oraz dodatków)

Dodatkowo sugeruję aby:
1. Nazwa pliku zawierała tylko ID. Każde doklejanie do nazwy np. panieńskiego nazwiska matki twórcy aplikacji czy też rozszerzenia to dodatkowa komplikacja i utrudnienie.
2. Pliki umieszczać w subfolderach typu: plik abc w subfolderze a/b, plik 123 w subfolderze 1/2. Jak nie wiecie dlaczego, to spróbujcie np. odczytać pliki z folderu, gdzie jest ich kilkadziesiąt milionów. Nie wiem czemu każdy zakłada, że nikt nie będzie tego używał - czasami jednak ludzie wbijają oneeyedsmiley02.png

Oczywiście o takich podstawach jak walidacja czy sprawdzenie, czy mamy odpowiednie prawa przed wywołaniem np. funkcji move_uploaded_files nie trzeba pisać. arrowheadsmiley.png
maxcv5123
Cytat(Niree @ 5.12.2016, 01:44:19 ) *
Raczej opcji z datą nie polecam. Ktoś może np. wrzucić plik tego samego dnia i jeden plik zastąpi się drugim plikiem (zakładając, że będą one tej samej nazwy).



Dzięki za pomoc. Dodałbym jeszcze godzinę.
Chyba jednak zdecyduję się na id. Mam pytanie odnośnie wydajności. Do plików zawsze będę znał dokładny adres, nie będą one wyszukiwane itp. jest więc konieczność grupowania ich w podkatalogi? czy mogą być wszystkie w jednym folderze?
I drugie pytanie, czy w kodzie który podałem istnieje możliwość przesłania do pliku file_upload_parser.php dodatkową zmienną php nie podaną w formularzu. Niestety JavaScript to nie moja mocna strona.


nospor
Cytat
Do plików zawsze będę znał dokładny adres, nie będą one wyszukiwane itp. jest więc konieczność grupowania ich w podkatalogi?
Tak, jest koniecznosc.
Niree
Cytat(maxcv5123 @ 6.12.2016, 12:22:38 ) *
Dzięki za pomoc. Dodałbym jeszcze godzinę.


  1. date("Y-m-d-G:i:s")


Lepiej faktycznie grupować w katalogi. Zamiast "test_uploads" daj np. ID usera z bazy, albo jeszcze co innego, co mogłoby zidentyfikować użytkownika, który to wrzucił.
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.