2010-10-15 19 views
22

Próbuję przesłać plik dokumentu z formularza i wysłać go na adres e-mail. Używam

$_FILES['file']['tmp_name']; 

Problem polega na zwrocie losowo wygenerowanej nazwy pliku. Tak więc, gdy dotrze do skrzynki odbiorczej, nazwa pliku to phpvwRGKN.dat (nazwa pliku jest losowa za każdym razem).

Jak mogę zachować nazwę pliku i rozszerzenie?

Uwaga: Używam geekMail class

+20

gość print_r ($ _ FILES); – rook

Odpowiedz

10

$_FILES["file"]["name"] - the name of the uploaded file

z http://www.w3schools.com/php/php_file_upload.asp

+0

Jeśli użyję $ _FILES ["plik"] ["nazwa"] i przypiszę do zmiennej, powiedzmy $ attachment, to nie zadziała, ponieważ zwraca tylko nazwę pliku. Myślę, że muszę podać ścieżkę, a ścieżka może pochodzić tylko z tmp_name. Proszę mnie poprawić, jeśli się mylę. – Jaspero

+2

Większość bibliotek poczty ma dwie nazwy plików, których używasz do załączników. Jedna to nazwa/lokalizacja pliku na serwerze, druga to nazwa, którą chcesz, aby użytkownik ją zobaczył. W twoim przypadku nazwa/lokalizacja to 'tmp_name', a nazwa użytkownika końcowego to' name'. –

+1

Z Twojego pytania rozumiem, że chcesz zapisać plik na serwerze, używając nazwy zamiast nazwy tmp. Rzeczą do zrobienia jest użycie http: // php.net/manual/en/function.move-uploaded-file.php 'move_uploaded_file()' i przenieś plik 'tmp_file' na jego stałą ścieżkę za pomocą nazwy pliku' name'. –

47

$_FILES['file']['tmp_name']; będzie zawierać nazwę pliku tymczasowego pliku na serwerze. To jest tylko element zastępczy na serwerze, dopóki nie przetworzysz pliku z oryginalną nazwą przesłanego pliku z komputera użytkownika.

+0

$ geekMail-> attach ('/ home/willem/file2.zip') powinien być formatem do korzystania z biblioteki. Więc musiałem użyć $ attachment = $ _FILES ['file'] ['tmp_name']; $ geekMail-> attach ($ attachment); Czy istnieje sposób, w jaki mogę przekazać ["imię"] wraz ze ścieżką? – Jaspero

+0

Co się dzieje, jeśli utworzysz plik img z plikiem src z nazwą_tmp? – Marcel

+2

Dzięki za wyjaśnienie tego! Nie można znaleźć tej informacji nigdzie w Internecie – JMS

0

Tylko sugestia, ale zamiast tego możesz wypróbować klasę Pear Mail_Mime.

http://pear.php.net/package/Mail_Mime/docs

W przeciwnym wypadku można użyć kawałek kodu. Metoda użycia nazwy() Gabi Purcaru nie zadziała tak, jak jest napisana. Zobacz ten post http://us3.php.net/manual/en/function.rename.php#97347. Musisz coś takiego:

$dir = dirname($_FILES["file"]["tmp_name"]); 
$destination = $dir . DIRECTORY_SEPARATOR . $_FILES["file"]["name"]; 
rename($_FILES["file"]["tmp_name"], $destination); 
$geekMail->attach($destination); 
1

Jak @Gabi Purcaru wspomina powyżej, właściwy sposób, aby zmienić nazwę i przenieść plik jest użycie move_uploaded_file(). Przeprowadza pewne kontrole bezpieczeństwa, aby zapobiec lukom w zabezpieczeniach i innym exploitom. Musisz odkażać wartość $_FILES['file']['name'], jeśli chcesz jej użyć lub wyprowadzić z niej rozszerzenie. Użyj pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION), aby bezpiecznie uzyskać rozszerzenie.

1

Jeśli chcesz dostać przesłanego nazwę pliku, użyj $_FILES["file"]["name"]

Ale jeśli chcesz odczytać przesłanego pliku należy użyć $_FILES["file"]["tmp_name"], ponieważ tmp_name jest tymczasową kopię przesłanego pliku i łatwiej niż przy użyciu

$_FILES["file"]["name"] // This name includes a file path, which makes file read process more complex

4

$_FILES["file"]["tmp_name"] zawiera rzeczywistą kopię zawartości pliku na serwerze podczas
$_FILES["file"]["name"] zawiera nazwę pliku, który został przesłany od clien t komputer.

Powiązane problemy