2016-06-12 91 views
0

我已经制作了这段代码,现在我的头靠墙了。PHP发送带附件的电子邮件表格验证尺寸和扩展

看来代码无法兼顾文件的大小或扩展名!

我收到文件和电子邮件。有人能解释我为什么验证失败吗?

<?php 
//Get the uploaded file information 
$name_of_uploaded_file = 
    basename($_FILES['uploaded_file']['name']); 

//get the file extension of the file 
$type_of_uploaded_file = 
    substr($name_of_uploaded_file, 
    strrpos($name_of_uploaded_file, '.') + 1); 

$size_of_uploaded_file = 
    $_FILES["uploaded_file"]["size"]/1024;//size in KBs 

//Settings 
$max_allowed_file_size = 2000; // size in KB 
$allowed_extensions = array("jpg", "jpeg", "gif", "bmp", "pdf"); 
$upload_folder = '../receivedfiles/'; 

//Validations 
if($size_of_uploaded_file > $max_allowed_file_size) 
{ 
    $errors .= "\n Fejl: Filen er for stor"; 
} 

//------ Validate the file extension ----- 
$allowed_ext = false; 
for($i=0; $i<sizeof($allowed_extensions); $i++) 
{ 
    if(strcasecmp($allowed_extensions[$i],$type_of_uploaded_file) == 0) 
    { 
    $allowed_ext = true; 
    } 
} 

if(!$allowed_ext) 
{ 
    $errors .= "\n The uploaded file is not supported file type. ". 
    " Send venligst filer af følgende type: ".implode(',',$allowed_extensions); 
} 

//copy the temp. uploaded file to uploads folder 
$path_of_uploaded_file = $upload_folder . $name_of_uploaded_file; 
$tmp_path = $_FILES["uploaded_file"]["tmp_name"]; 

if(is_uploaded_file($tmp_path)) 
{ 
    if(!copy($tmp_path,$path_of_uploaded_file)) 
    { 
    $errors .= '\n error while copying the uploaded file'; 
    } 
} 

$name = $_POST['name']; 
$email = $_POST['email']; 
$phone = $_POST['phone']; 
$call = $_POST['call']; 
$company = $_POST['company']; 
$type = $_POST['type']; 
$adress = $_POST['adress']; 
$hesteid = $_POST['hesteid']; 
$hestenavn = $_POST['hestenavn']; 
$message = $_POST['message']; 
$areacode = $_POST['areacode']; 
$land = $_POST['land']; 
$formcontent=" Fra: $company \n Navn: $name \n Adresse: $adress , $areacode \n Land: $land \n Telefon: $phone \n Ringes op: $call \n Type: $type \n Hoppens navn og ID: $hestenavn , $hesteid \n Besked: \n $message \n Vedhæftede filer: \n $path_of_uploaded_file"; 
$recipient = "[email protected]"; 
$subject = "Besked fra hjemmesiden"; 
$mailheader = "Fra: $email \r\n"; 
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!"); 
header('Location: /thank_you.shtml') 
?> 

HTML formcode:

<form class="contactform" action="php/mail.php" method="post" enctype="multipart/form-data"> 
<label for="company">Firma</label> 
<input type="text" name="company" id="company" /> 
<label for="name">Navn</label> 
<input type="text" name="name" placeholder="Dit navn" id="name" required="required" /><span class="red">&#42;</span> 
<br /> 
<label for="email">Email</label> 
<input type="email" name="email" placeholder="[email protected]" id="email" required="required" /><span class="red">&#42;</span> 
<br /> 
<label for="phone">Telefon</label> 
<input type="text" name="phone" placeholder="" id="phone" required="required" /><span class="red">&#42;</span> 
<br /> 
<label for="adress">Adresse</label> 
<input type="text" name="adress" placeholder="Din adresse" id="adress" /> 
<br /> 
<label for="areacode">Postnummer og By</label> 
<input type="text" name="areacode" placeholder="Postnummer og By" id="areacode" /> 
<br /> 
<label for="land">Land</label> 
<input type="text" name="land" placeholder="Land" id="land" /> 
<br /> 
<br /> 
<label for="call">Vil De ringes op?<span class="red">&#42;</span></label> 
<table class="callme"> 
<tr> 
<td class="callmetext"><p>Ja</p></td> 
<td class="callmecheck"><input type="radio" value="Ja" name="call" id="call" required="required" /></td> 
</tr> 
<tr> 
<td class="callmetext"><p>Nej</p></td> 
<td class="callmecheck"><input type="radio" value="Nej" name="call" /></td> 
</tr> 
</table> 
<br /> 
<label for="type">Emne</label> 
<select name="type" size="1" id="type" required="required"> 
<option value="">Vælg fra listen</option> 
<option value="Bestille dek&#230;ning">Bestille bedækning</option> 
<option value="Bestille brochure">Bestille brochure</option> 
<option value="Information om en hingst">Information om en hingst</option> 
<option value="Information om stutteriet">Information om stutteriet</option> 
<option value="Information om salgsheste">Information om salgsheste</option> 
<option value="Information om Afkomsformidling">Information om afkomsformidling</option> 
<option value="Information om samarbejdspartnere">Information om vore samarbejdspartner</option> 
<option value="Andet">Andet</option> 
</select><span class="red">&#42;</span> 
<br /> 
<label for="hesteid">Hoppens ID</label> 
<input type="text" name="hesteid" placeholder="208333DW..." id="hesteid" /> 
<br /> 
<label for="hestenavn">Hoppens navn</label> 
<input type="text" name="hestenavn" placeholder="Hoppens navn..." id="hestenavn" /> 
<br /> 
<br /> 
<label for="message">Din besked<span class="red">&#42;</span></label> 
<textarea name="message" rows="6" cols="20" placeholder="Skriv din besked her..." id="message" required="required"></textarea> 
<br /> 
<br /> 
<label for="uploaded_file">Vælg en fil:</label> 
<input type="file" name="uploaded_file"> 
<br /> 
<br /> 
<div class="center"> 
<label for="captcha">&#32;</label> 
<div id="captcha" class="g-recaptcha" data-callback="recaptchaCallback" data-sitekey="6LfnbiATAAAAAOBV8B7qaPGzfpyjdahePpyGhLjj"></div> 
</div> 
<br /> 
<br /> 
<div class="center"> 
<label for="submitBtn">&#32;</label> 
<input class="contactbtn" type="submit" value="Send besked" id="submitBtn" disabled /> 
</div> 
</form> 

奖金的问题:我将能够复制此代码,并改变“uploaded_file”到“uploaded_file2”,和3,等等,并能增加几个更多文件?

+0

我没有看到此代码的任何问题。 'print_r($ _ FILES)'产生什么样的输出? – Midas

+0

对不起,我不熟悉这个命令。我怎样才能插入这个? –

+0

它打印'$ _FILES'数组的内容。只需将它插入代码中的任何位置。 – Midas

回答

0

你的代码没有特别的问题。我唯一注意到的是,您不是在发送电子邮件之前在任何地方初始化$error,或者检查其内容。

而且,这个代码整块:

$allowed_ext = false; 
for ($i = 0; $i < sizeof($allowed_extensions); $i++) 
{ 
    if (strcasecmp($allowed_extensions[$i], $type_of_uploaded_file) == 0) 
    { 
     $allowed_ext = true; 
    } 
} 

...可以简化为:

$allowed_ext = in_array(strtolower($type_of_uploaded_file), $allowed_extensions); 

并回答了奖金问题:要实现多文件上传,你可以使用您input名称的数组:

<input type="file" name="uploaded_file[]"> 
<input type="file" name="uploaded_file[]"> 
<input type="file" name="uploaded_file[]"> 

使用print_r你可以在n找出这个数组在PHP中的样子,并相应地验证每个文件。

echo '<pre>'; print_r($_FILES); echo '</pre>'; 

调试完毕后,记得删除任何echoprint_r函数调用的函数header之前到来。否则,您将收到以下错误:

Warning: Cannot modify header information - headers already sent 
+0

感谢您的回答。 我不确定要检查什么。对于我希望在脚本上传到服务器文件夹的同时发送文件的路径和名称的电子邮件。我看不出为什么应该初始化错误?此外,我相信代码应该出来,并告诉如果文件超过最大限制或有一个错误的扩展名? 感谢您对脚本的重写:) 同样感谢您对multiupload的提示!我会继续:) –

+0

@SimonJensen启用[错误报告](http://php.net/manual/en/function.error-reporting.php),你就会知道为什么你需要初始化'$ error '变量。它会告诉你在变量被初始化之前你不能追加('。=')。当错误报告被禁用时,PHP将默默允许修改未初始化的变量,但这通常是不好的做法。此外,除非您告诉PHP打印验证错误,否则代码不会告诉您有关验证的任何内容。 :) – Midas

+0

我把所有'$ errors'都改成了〜'。这有很大帮助。下一步是使其弹出:) 我发现我无法访问php.ini,所以我无法呈现它。但是这对麻烦有很大帮助。我相信我的新需求超过了这个线程。感谢一堆:) –