2016-08-01 23 views
0

Ich versuche, ein Formular zu verarbeiten, das mehrere Dateieingaben (in verschiedenen Teilen des Formulars) erfordert, die mehrere Anhänge für jede haben können. Ich habe jeden Eingang wie diesen mit dem gleichen Namen (attach) gesetzt, wie ich es verstehe, die $ _FILES ['attach'] wird alle Dateien erhalten, richtig?Mehrere Eingabe-Anhänge PHP

<input type="file" class="file" name="attach[]" title="" dropzone="copy" multiple="multiple" required></input> 

Ich habe dieses php zusammen aus einer Reihe von Quellen zusammengeschustert, können Sie dies bitte überprüfen. Es sendet nicht, also habe ich offensichtlich irgendwo Fehler gemacht.

(other variables not shown, but sanitized as well) 
$attachments = $_FILES['attach']; 
// email body 
$mes_body = "<html><head></head><body>"; 
// $mes_body .= "<img src='http://www.domain.com/marketing/image.png' alt='Image' /><br /><br />"; (optional header image) 
// Sanitize unknown input data 
function sanitize(text) { 
    $san = filter_var(text, FILTER_SANITIZE_STRING); 
    return $san; 
} 
$mes_body .= "<br /><br />"; 
foreach ($_POST as $key => $value) { //define & insert unknown inputs into message body 
    if ($key != 'From' && $key != 'Subject' && $key != 'Filecheck') { 
    $mes_body .= sanitize($key) . ': ' . sanitize($value) . '<br />'; 
    } 
} 
$mes_body .= "</body></html>"; 
// multipart email 
$boundary = md5("text_for_hash"); 
if ($filecheck == 1) { // multipart email w/ attachment(s) & $filecheck=1 means files present 
    $headers = "MIME-Version: 1.0\r\n"; 
    $headers .= "From: " . $from_email . "\r\n"; 
    $headers .= "Reply-To: " . $from_email . "" . "\r\n"; 
    $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 
    // message text 
    $body = "--$boundary\r\n"; 
    $body .= "Content-Type: text/html; charset=\"ISO-8859-1\"\r\n"; 
    $body .= "Content-Transfer-Encoding: 8bit\r\n"; 
    $body .= $mes_body; 
    $body .= "boundary = $boundary\r\n"; 
    // attachment(s) 
    foreach ($attachments as $attachment) { 
     if ($attachment['size']) { 
     $body .= "\r\n" . $boundary; 
     $body .= "Content-Type: " . $attachment['type'] . "; name=\"". $attachment['filename'] . "\"\r\n"; 
     $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
     $body .= $attachment['content']; 
     } 
    } 
    $body .= "boundary = $boundary\r\n"; 
    $message_body = $mes_body; 
} 
else { // plain text email 
    $headers = "From: " . $from_email . "\r\n" . "Reply-To: " . $from_email . "\r\n" . "Content-type: text/html" . "\r\n" . "X-Mailer: PHP/" . phpversion(); 
    $message_body = $mes_body; 
} 
$send_mail = mail($to_email, $subject, $message_body, $headers); 

UPDATE: Konzentration auf das Anbauteil. Ich verwende Formdata & eine typische Schlüssel/Wert-Konsolenausgabe direkt vor der Formdata Befestigung könnte wie folgt aussehen:

enter image description here

Dateien1 & files2 ist Schlüssel & ich diese in der E-Mail als auch vergeben müssen. Ex:
Dateien1: (fügen Sie alle Dateien zugeordnet w/Dateien1)
files2: (eingebundene alle Dateien zugeordnet w/files2)
Hinweis: Ich will nicht wissen, die Namen der Tasten vor der Zeit, wie sie Benutzer sind -definiert.

Jemand schlug vor, dies für den Befestigungsteil, wie es schon ist Formdata:

// attachment(s) 
foreach ($_FILES as $attachment) { 
     $name = $attachment["tmp_name"]; 
     if ($attachment["size"]) { 
     $body .= "--$boundary\r\n"; 
     $body .= "Content-Type: " . $attachment["type"] . "; name=\"" . $name . "\"; Content-Disposition: attachment" . "\r\n"; 
     $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
     echo $attachment . "<br />"; 
     } 
    } 

Im Augenblick ist die Form einreicht still & ich sehe nichts auf dem Server error_log. Was mache ich falsch - Codekorrektur wäre willkommen.

+0

@u_mulder Würde es Ihnen etwas ausmachen, mir dabei zu helfen ?, wie Sie waren hilfreich mit einem anderen Teil des Formulars – parti

Antwort

1

$_FILES ist ein 2-dimensionales Array. Der erste Index ist der Feldname, in den die Datei hochgeladen wurde, der zweite Index ist die Information über die Datei. Anstelle der folgenden Schleife:

foreach ($attachments as $attachment) { 
    if ($attachment['size']) { 
    $body .= "\r\n" . $boundary; 
    $body .= "Content-Type: " . $attachment['type'] . "; name=\"". $attachment['filename'] . "\"\r\n"; 
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
    $body .= $attachment['content']; 
    } 
} 

($attachments war nur die erste Befestigung, nicht alle von ihnen), sollten Sie versuchen:

foreach ($_FILES as $attachment) { 
    if ($attachment['size']) { 
    $body .= "\r\n" . $boundary; 
    $body .= "Content-Type: " . $attachment['type'] . "; name=\"". $attachment['filename'] . "\"\r\n"; 
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
    $body .= base64_encode(file_get_contents($attachment['tmp_name'])); 
    } 
} 

Das durch alle Ihrer Anhänge wandeln , lese die Dateiinhalte ein und base64 kodiere sie, bevor du sie an deine E-Mail-Nachricht anfügst.

+0

Ja, ok ich sehe, wie das die Dateien bekommen würde. Habe immer noch Probleme mit Tasten, aber ich denke ich bin auf dem richtigen Weg. – parti