Autor | Zpráva | ||
---|---|---|---|
Matthew Cook Profil |
#1 · Zasláno: 8. 4. 2015, 15:36:42
Zdravím,
Mám tento script na odeslání mailu s přílohou. bohužel se mi nedaří odeslat soubor. pořád píše typ souboru není povolen i když mám ve scriptu soubour s povolenou příponou.. zkoušel jsem jpg, png, pdf a nic... Prosím o radu kde je chyba. Děkuji <?php if(isset($_POST) && !empty($_POST) ){ if(!empty($_FILES ['attachment']['name'])) { $file_name = $FILES['attachment']['name']; $temp_name = $FILES['attachment']['tmp_name']; $file_type = $FILES['attachment']['type']; $base = basename($file_name); $extension =substr($base, strlen($base)-4, strlen($base)); $allowed_extensions = array(".doc",".docx",".pdf",".zip",".png",".jpg"); if(in_array($extension,$allowed_extensions)) { //mail essenstials $from = $_POST['email']; $to = "mail@seznam.cz"; $subject = "předmět"; $message = "Zpráva s přílohou"; $file = $temp_name; $content = chunk_split(base64_encode(file_get_contents($file))); $uid = md5(uniqid(time())); $header = "From: ".$from. "\r\n"; $header .= "Reply-To: ".$replyto. "\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid. "\"\n\r\n"; $header .="This is a multi-part message in MIME format. \r\n"; $header .= "--" .$suid. "\r\n"; $header .= "Content-type:text/plain; charset=iso-8859-1\r\n"; $header .= "Content-Transfer-Enconding: 7bit\r\n\r\n"; $header .= $message."\r\n\r\n"; $header .= "--".$uid. "\r\n"; $header .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r"; $header .= $content."\r\n\r\n"; if (mail($to, $subject, "", $header)) { echo "úspěch"; } else { echo "neuspět"; } exit(); } else { echo "typ souboru není povolen"; } }else { echo "souubor neodeslán"; } } ?> <html> <body> <form method="post" action="index.php" enctype="multipart/form-data"> <input type="text" name="email" value="form"/> <br> <input type="file" name="attachment"/> <br> <input type="submit" value="odeslat mail"/> </form> </body> </html> |
||
Keeehi Profil |
#2 · Zasláno: 8. 4. 2015, 15:47:50
Když za 5. řádek vložíš
var_dump($file_name); tak ti to vypíše co?
|
||
petr 6 Profil |
#3 · Zasláno: 8. 4. 2015, 15:48:08
Matthew Cook:
Radek 10 je principielne spatne, ale to neni pricinou problemu. Zkus si vypsat promennou $base, pripadne $file_name, jestli obsahuji to, co maji. Nema nahodou soubor, ktery se pokousis nahrat, priponu psanou velkymi pismeny? |
||
Matthew Cook Profil |
#4 · Zasláno: 8. 4. 2015, 16:57:20
Nejsem tak zkušený v PHP začínám, akorát že potřebuji udělat tento script že jsem ho slíbil. Dělal jsem to podle video tutoriálu. Pokud máte někdo podobný funkční script klidne pošelete děkuji
|
||
mimochodec Profil |
#5 · Zasláno: 8. 4. 2015, 17:05:32
Matthew Cook:
Konec názvu toho souboru není v tom výčtu, který je uveden na 12. řádku. |
||
petr 6 Profil |
#6 · Zasláno: 8. 4. 2015, 17:07:43
Matthew Cook:
„Nejsem tak zkušený v PHP začínám“ V češtině zřejmě taky. Tak to zkusíme znovu: - Když za 5. řádek vložíš var_dump($file_name); tak ti to vypíše co? - Nema nahodou soubor, ktery se pokousis nahrat, priponu psanou velkymi pismeny? „Pokud máte někdo podobný funkční script“ Podle kódu se tvůj skript zdá být funkční (byť by mohl být lépe napsaný) |
||
Matthew Cook Profil |
#7 · Zasláno: 8. 4. 2015, 17:37:32 · Upravil/a: Matthew Cook
Pokud zadám na 5. řádek var_dump($file_name); vypíše:
NULL typ souboru není povolen Ano i když to zní blbě čeština není zrovna moje silná stránka a ani php. Děkuji za radu a soubory mají v příponě malé písmena. |
||
petr 6 Profil |
#8 · Zasláno: 8. 4. 2015, 17:50:51
No vidíš, to pomohlo. Napřed používáš proměnnou $_FILES a následně proměnnou $FILES (bez podtržítka), která samozřejmě neexistuje.
|
||
Tomáš123 Profil |
Matthew Cook:
Keďže koncovky majú rôznu dĺžku, myslím, že bude lepšie rozklad na príponu a názov súboru prevádzať pomocou funkcie explode() , ktorej dve časti sa uložia do premenných špecifikovaných v konštrukciu list() . Príklad:
list($filename, $extension) = explode(".", $file_name); $allowed_extensions = array("doc","docx","pdf","zip","png","jpg"); /* Pole nesmie obsahovať bodky pred príponami, pretože boli vyššie odstránené funkciou explode(). */ //výsledné premenné by mali korešpondovať so zvyškom skriptu //pokračuje podmienkou na riadku 14 ÚPRAVA: Upravené na podnet juriada ↓, s funkciou basename() som sa mýlil. Ďakujem za opravu.
|
||
juriad Profil |
#10 · Zasláno: 8. 4. 2015, 18:12:10
Tomáš123:
Mýlíš se. Ponechává příponu, pokud ji nepředáš jako druhý parametr. |
||
Matthew Cook Profil |
#11 · Zasláno: 8. 4. 2015, 18:17:30
petr 6
Byla chyba s proměnou Děkuji email se odešle akorát mi pošle bohužel soubor o (0 B) |
||
petr 6 Profil |
#12 · Zasláno: 8. 4. 2015, 18:23:00
Tomáš123:
„Keďže koncovky majú rôznu dĺžku, myslím, že bude lepšie rozklad na príponu a názov súboru prevádzať“ ... takto: $extension = pathinfo($file_name, PATHINFO_EXTENSION); |
||
Keeehi Profil |
Dost se tu zapomíná na to, že v souboru nemusí být jen jedna tečka!
toto.je.moje.fotka.jpg je naprosto legitimní název souboru. Taky se v něm vůbec tečka nacházet nemusí.
$extension = substr($base, (int)strrpos($base, '.')); Odeslat ručně email s prílohou je celeem složité. Proto je lepší využít už připravených tříd které snižují riziko chyby. V Nejčastější potíže s PHP (FAQ) » Odeslání více položek jsou zmíněné rovnou dvě. |
||
juriad Profil |
#14 · Zasláno: 8. 4. 2015, 18:57:54
Keeehi:
Co takový soubor .htaccess? Soubory začínající tečkou jsou podle UNIXové konvence skryté. On je dost naivní celý koncept přípon; není lepší prostě kontrolovat, že název souboru končí zadaným výrazem? Třeba regulárem: /\.(docx?|pdf|zip|png|jpe?g)$/i |
||
Keeehi Profil |
#15 · Zasláno: 8. 4. 2015, 19:14:34
juriad:
Právě proto, že je celý koncept přípon naivní, můžu soubor .htaccess považovat za soubor se jménem dlouhým nula znaků a příponou .htaccess, vím že reálně to tak není ale při whitelistovém ověření mi to vůbec nemusí vadit. |
||
Časová prodleva: 8 let
|
0