2016-08-01 2 views
0

여러 개의 파일 입력이 필요한 양식을 처리하려고합니다 (양식의 다른 부분에 있음). 각 입력에 여러 첨부 파일이있을 수 있습니다. 나는 $ _FILES [ 'attach']가 모든 파일을 올바르게 얻을 것임을 이해하므로이 같은 입력을 같은 이름 (첨부)과 같이 설정했습니다.여러 입력 첨부 파일 PHP

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

나는이 소스 코드를 여러 소스에서 함께 자갈을 만들었으므로 이것을 검토해 주실 수 있습니까? 그것은 보내지 않습니다, 그래서 분명히 어딘가에 약간의 오류를 만들었습니다.

(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 : 첨부 부분에 초점을 맞춘. 나는 바로 다음과 같을 수 FormData에 연결하기 전에 FormData & 일반적인 키/값 콘솔 출력을 사용하고 있습니다 :

enter image description here

Files1 & Files2 키 &있는 나뿐만 아니라 이메일에 이들을 배치해야합니다. 예 :
Files1는 :
참고 (Files2 승/관련된 모든 파일 첨부) : 그들은 사용자 인 나는이 사전의 키의 이름을 알 수 없습니다를
Files2 (Files1 승/관련된 모든 파일을 첨부) -한정된.

// 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 />"; 
     } 
    } 

을 지금 폼이 나는 아무것도 서버에서는 error_log되어 표시되지 않습니다 자동으로 & 제출 : 그것은 FormData 이미로

누군가는 첨부 부분에 대해이 작업을 제안했다. 내가 뭘 잘못하고있다 - 코드 수정 인정 될 것이다.

+0

@u_mulder이 부분을 도와 주시겠습니까? – parti

답변

1

$_FILES은 2 차원 배열입니다. 첫 번째 색인은 파일이 업로드 된 필드 이름이고, 두 번째 색인은 파일에 대한 정보입니다. 대신 다음 루프의 :

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 단지 첫 번째 첨부 파일이 아니라 그들 모두했다), 당신은 시도 할 수 있습니다 :

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'])); 
    } 
} 

를 통해 첨부 파일의 모든을 안내합니다 , 파일 내용을 읽고 base64 인코딩하여 전자 메일 메시지에 추가하십시오.

+0

그래, 좋아. 파일을 가져 오는 방법을 알았어. 그래도 문제가 생겼지 만 제대로 된 것 같아. – parti