Hoi

Ik gebruik de folgende functie voor foto winkel waar klanten meerdere foto's kunnen uloaden en die dienen verzonden te worden naar de winkel eigenaar:


	public function upload_fotosAction()
	{
		if ($_SERVER['REQUEST_METHOD'] == 'POST')
		{
			$vNaam       = filter_input(INPUT_POST, 'vNaam', FILTER_SANITIZE_STRING);
			$aNaam       = filter_input(INPUT_POST, 'aNaam', FILTER_SANITIZE_STRING);
			$adres       = filter_input(INPUT_POST, 'adres', FILTER_SANITIZE_STRING);
			$postcode    = filter_input(INPUT_POST, 'postcode', FILTER_SANITIZE_STRING);
			$woonplaats  = filter_input(INPUT_POST, 'woonplaats', FILTER_SANITIZE_STRING);
			$email       = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
			$telefoon    = filter_input(INPUT_POST, 'telefoon', FILTER_SANITIZE_STRING);

			$uploader_id = $this->page->uploader_toevoegen($vNaam,$aNaam,$adres,$postcode,$woonplaats,$email,$telefoon);
			
			if ($uploader_id)
			{
				$ontvangers = array(
				    "[email protected]",
                );
				
				$aan         = implode(',', $ontvangers);
				$onderwerp   = 'Afdruk bestelling via de website';
				$mail_aanhef = 'De volgende persoon heeft een afdruk bestelling geplaatst';
				$naam        = $vNaam . '  ' .$aNaam; 
				
				$bericht     = '';
				$bericht    .= 'De volgende persoon heeft een afdruk bestelling geplaatst';
				$bericht    .= "\n\n";
				$bericht    .= "Naam: ";
				$bericht    .= $naam;
				$bericht    .= "\n";
				$bericht    .= "Adres: ";
				$bericht    .= $adres;
				$bericht    .= "\n";		 
				$bericht    .= "Woonplaats: ";
				$bericht    .= $postcode;
				$bericht    .= "\n";		 
				$bericht    .= "Email: ";
				$bericht    .= $email;
				
				$strSid = md5(uniqid(time()));
				
				$headers = "";  
				$headers .= "From: [email protected]";       
				$headers .= "MIME-Version: 1.0\n";  
				$headers .= "Content-Type: multipart/mixed; boundary=\"".$strSid."\"\n\n";  
				$headers .= "This is a multi-part message in MIME format.\n";       
				$headers .= "--".$strSid."\n";  
				$headers .= "Content-type: text/html; charset=utf-8\n";  
				$headers .= "Content-Transfer-Encoding: 7bit\n\n";

				for($i=0;$i<count($_FILES["file"]["name"]);$i++)  
				{  
					if($_FILES["file"]["name"][$i] != "")  
					{  
						$filesName = $_FILES["file"]["name"][$i];  
						$strContent = chunk_split(base64_encode(file_get_contents($_FILES["file"]["tmp_name"][$i])));  
						$headers .= "--".$strSid."\n";  
						$headers .= "Content-Type: application/octet-stream; name=\"".$filesName."\"\n";  
						$headers .= "Content-Transfer-Encoding: base64\n";  
						$headers .= "Content-Disposition: attachment; filename=\"".$filesName."\"\n\n";  
						$headers .= $strContent."\n\n";  
					}  
				}
				$flgSend = mail($aan,$onderwerp,$bericht,$headers);
			}      			
		}
	}


Het versturen gaat prima, alleen krijg ik het niet voor elkaar om de bericht gegevens (naam, adres, postcode etc) ook in het bericht te vertonen. Wat doe ik hier fout?

Alvast bedankt
Donald,

Om images echt in je email weer te geven en niet als bijlage zul je je email in HTML moeten opstellen.
Hiervoor valt PHPMailer (of Swift) zeker wel aan te bevelen inderdaad. Je kunt op twee manieren te werk gaan.

a) Je kunt de afbeeldingen online zetten en met een absolute url naar deze afbeelingen verwijzen:

<img src="http://een.server.nl/plaatje.jpg" />

Nadeel: veel emailprogramma's zullen de afbeeldingen blokkeren.
Voordeel: kleine omvang van je bericht.

b) Je zendt de afbeeldingen mee als attachments en verwijst in je HTML naar deze attachments:

<img src="cid:plaatje.jpg" />

Voordeel: geen blokkade
Nadeel: grote omvang van je bericht.
Ik ga hier maar even verder i.p.v. een nieuw topic aan te maken. Zoals eerder aangegeven had (ja inderdaad had) ik dit dus werkend alleen is de situatie iets veranderd. In de werkende versie werden de gegevens en foto's meteen verstuurd nadat de gebruiker op de knop verzenden klikte. Voor de foto toevoeging gebruikte ik derhalve het volgende:

$foto_path  = APP_PATH.'/../public_html/images/uploads/' . $uniqid . '/';
$nieuw_path = mkdir($foto_path, 0777);

for ($i = 0; $i < count($_FILES['file']['name']); $i++) 
{
	$foto_naam        = $_FILES['file']['name'][$i];
	$nieuw_foto_path  = $foto_path . $foto_naam;
				
	if(move_uploaded_file($_FILES["file"]["tmp_name"][$i], $nieuw_foto_path)) 
	{
		$mail->addAttachment($nieuw_foto_path);										
	}
}

if($mail->Send()) {
        $dir = $foto_path;
	array_map('unlink', glob($dir."/*"));
	rmdir($dir);				
}

Met andere woorden eerst creëerde ik een nieuwe folder op basis van een eerder aangemaakte uniqid() waar de foto's tijdelijk werden geplaatst en in de loop voegde ik die vervolgens aan het bericht toe. Wanneer de email dan succesvol verzonden was verwijderde ik die nieuwe folder en inhoud weer. Zoals gezegd dit werkte prima alleen is de situatie iets veranderd. Er is namelijk een betaal module tussen gekomen. Dus nu als de gebruiker het formulier verzend worden de n.a.w. gegevens en de foto namen in de database opgeslagen en de foto's geüpload naar de zoals boven beschreven folder waarna de gebruiker naar IDEAL wordt gestuurd. Bij een succesvolle betaling wordt de gebruiker terug gestuurd naar de website en wordt phpMailer geactiveerd en zou de eerder genoemde loop uitgevoerd moeten worden. Maar daar gaat het dus fout. De n.a.w.gegevens worden netjes verstuurd maar de toevoegingen worden niet mee gestuurd. Dit is wat ik hiervoor gebruik:

$foto_path         = APP_PATH.'/../public_html/images/uploads/' . $uniqid . '/';
$gebruikers_fotos  = $this->page->get_gebruikers_fotos($uniqid);

foreach ($gebruikers_fotos as $foto)
{
	$foto_naam        = $_FILES['file']['name'][$i];
	$nieuw_foto_path  = $foto_path . $foto_naam;
	$mail->addAttachment($nieuw_foto_path);
}


De $uniqid is gebruikt als identifier van en naar IDEAL en die werkt want daar haal ik tevens de gebruikers informatie mee uit de database die zoals gezegd wel in de email wordt verstuurd. Wat is er dus foout met het gedeelte waar de foto's toegevoegd zouden moeten worden?

Bij voorbaat dank
Zou dat niet $i => $foto moeten zijn? $i (regel 6) krijgt nergens een waarde.

Daarnaast: ontwikkel je niet met error reporting aan? Dat zou direct een "undefined index" moeten opleveren.

Tevens: plemp jij alle foto's in de publieke webdirectory? Cool. Dus als iemand de uniqid raadt (of gewoon bruteforced) dan kan die bij iemands foto's? Nice.

Waarom niet gewoon: Foto's buiten webdirectory opslaan en gewoon nummeren (hernoemen naar een nummer) en alle relevante data omtrent een foto ook opslaan in de database zodat als er ergens iets misgaat onderweg dat iemand niet zijn/haar foto's opnieuw hoeft te uploaden, en je hebt tevens een reservekopie?
Ik kan je aanraden de upload class te gebruiken van Verot.net
Hiermee kan je gemakkelijk bestanden beheren en uploaden e.d
Werkt echt super.

Dat maakt je script overzichtelijk en behoudt zijn functionaliteiten.
- PHPmailer
- Upload class Verot.net

http://www.verot.net/php_class_upload.htm

Reageren