I'm using standard PHP functions to upload a file for use as an attachment with PHPMailer.
<form name="upload" method="post" action="send_form_email3.php">
<div width="100%" class="con3">
<div class="lable">
<label for="first_name">First Name *</label>
</div>
<input type="text" name="first_name" id="first_name" class="span4">
<div class="lable">
<label for="email">Email Address *</label>
</div>
<input type="text" name="email" id="email" class="span4">
<div class="lable">
<label for="telephone">Contact Number *</label>
</div>
<input type="text" name="telephone" id="telephone" class="span4">
<div class="lable">
<label for="comments">Message *</label>
</div>
<textarea name="comments" rows="8" id="comments" class="span4"></textarea>
<div class="lable">
<label for="upload">Send Us Your CV *</label>
</div>
<input type="file" name="upload" id="upload" />
<input type="submit" value="Submit" class="btn btn-success">
</div>
</form>
This form gets submitted to the following php handler where the mail is built and sent:
<?php
require_once("class.phpmailer.php");
$first_name = $_POST['first_name']; // required
$email_from = $_POST['email']; // required
$telephone = $_POST['telephone']; // required
$comments = $_POST['comments']; // required
echo "just got form values<br />";
echo $_FILES['upload']['name'].'<br />';
$email_message = "Form details below.<br />";
function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}
$email_message .= "Name: ".clean_string($first_name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Contact: ".clean_string($telephone)."\n";
$email_message .= "Message:\n".clean_string($comments)."\n";
echo "added text to email<br />";
$target_path = "uploads/";
$target_path = $target_path . basename( $_FILES['upload']['name']);
// upload the file
echo "target = ".$target_path."<br />";
if (isset($_FILES['upload']['size']))
{
if ($_FILES['upload']['size'] > 0)
{
echo 'file size: '.basename($_FILES['upload']['size']).'<br />';
if (move_uploaded_file($_FILES['upload']['name'], $target_path))
{
echo "The file ". basename( $_FILES['upload']['name'])." has been uploaded<br />";
// adding an already existing file as an attachment to the email for debugging purposes.
$email->AddAttachment('uploads/CreditReportViewer.pdf');
}
else
{
echo "There was an error uploading the file, please try again!<br /> ".basename($_FILES['upload']['error']);
}
}
else
{
echo "There was an error uploading the file, please try again!<br />";
}
}
else
{
echo "No file was found for the upload.<br />";
}
$email = new PHPMailer();
$email->To = "[email protected]";
$email->From = $email_from;
$email->FromName = $first_name;
$email->Subject = "New Message from Website";
$email->Body = $email_message;
echo "\n mail built...<br />";
$email->Send();
echo "mail sent!";
?>
The problem is that $_FILES['upload']['name']
is not set. Here's the echoes that are being written to the browser:
just got form values
added text to email
target = uploads/
No file was found for the upload.
mail built...
mail sent!
This makes me think that I'm referencing the file upload field or the upload itself incorrectly.
Can anyone see any problems here or provide some guidance if this isn't the best way to do this?
You have to add,
enctype= "multipart/form-data"
Change your form to,
<form name="upload" method="post" action="send_form_email3.php" enctype= "multipart/form-data">
add enctype
to your form:
change:
<form name="upload" method="post" action="send_form_email3.php">
to
<form name="upload" method="post" action="send_form_email3.php" enctype="multipart/form-data">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With