I am trying to attach multiple images in the attachments. I have used forearch for every attachment but, its not getting the tempname and name when I use foreach, I'm probably doing something wrong. Below is the code and errors:
Input HTML
<input id="upload-file" class="upload-file" type="file" name="upload-file[]">
var_dump of $_FILES['upload-file']:
array(5) { ["name"]=> array(1) { [0]=> string(47) "WRANGLER_AW13_GIRLONTOP_A4_LANDSCAPE_300dpi.jpg" } ["type"]=> array(1) { [0]=> string(10) "image/jpeg" } ["tmp_name"]=> array(1) { [0]=> string(24) "C:\xampp\tmp\php41DC.tmp" } ["error"]=> array(1) { [0]=> int(0) } ["size"]=> array(1) { [0]=> int(91742) } }
var_dump for name and temp_name:
Notice: Undefined index: name in C:\xampp\htdocs\hmg\process-email.php on line 66
Notice: Undefined index: tmp_name in C:\xampp\htdocs\hmg\process-email.php on line 67
NULL
NULL
CODE:
foreach($_FILES['upload-file'] as $file) {
$name = $file['name'];
$path = $file['tmp_name'];
var_dump($name);
var_dump($path);
//And attach it using attachment method of PHPmailer.
$mail->addattachment($path,$name);
}
PHP Code to Attach Multiple Files to the EMailThe multiple files posted via the HTML form will be read by using $_FILES array variable. This array is iterated the corresponding file will be attached by calling the addAttachment() function with the reference of the mail object. <? php require('phpmailer/class.
Navigate to the file location for your files. Click the first one, and then hold the Control key and click the additional files. Press the button to choose your files and close the browse window. Depending on the program you are using, the button will say something like “Insert” or “Open.”
File Attachmentsmail->Send(); and it's called AddAttachment($path); . This single line will add the attachment to your mail. $path is the path of the filename. It can be a relative one (from your script, not the PHPMailer class) or a full path to the file you want to attach.
Welcome to the evil side of PHP. The $_FILES
is not that, what a developer would expect.
//wrong code
$img1 = $_FILES['upload-file'][0]['tmp_name'];
$img2 = $_FILES['upload-file'][1]['tmp_name'];
//working code
$img1 = $_FILES['upload-file']['tmp_name'][0];
$img2 = $_FILES['upload-file']['tmp_name'][1];
So you need something like
$totalFiles = count($_FILES['upload-file']['tmp_name']);
for ($i = 0; $i < $totalFiles; $i++) {
$name = $_FILES['upload-file']['name'][$i];
$path = $_FILES['upload-file']['tmp_name'][$i];
$mail->addattachment($path,$name);
}
Here is some example from the PHPMailer repository.
thanks for all the answers. I am sure all of your approaches would work just fine, but I decided to solve it myself. This code solved the problem
$validAttachments = array();
foreach($_FILES['upload-file']['name'] as $index => $fileName) {
$filePath = $_FILES['upload-file']['tmp_name'][$index];
$validAttachments[] = array($filePath, $fileName);
}
foreach($validAttachments as $attachment) {
$mail->AddAttachment($attachment[0], $attachment[1]);
}
I hope anyone who has the same problem gets some help from here ...
Most of the solutions here are based on forms.
So i came up with a simple solution if you want to attach all files from a particular directory.
$file_to_attach_directory = 'files/';
if ($handle = opendir($file_to_attach_directory)) {
try {
while (false !== ($entry = readdir($handle))) {
$attachment_location = $file_to_attach_directory. $entry;
$mail->addAttachment($attachment_location);
}
closedir($handle);
// Send Mail
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
} catch (Exception $e) {
var_dump($e);
}
}
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