J'essaie d'utiliser ce code pour télécharger plusieurs fichiers avec PHP 5.5 et joindre à un e-mail. Si je prends les crochets de file[]
(donc c'est file
) sur l'attribut name
du champ input
, je suis en mesure de télécharger un fichier avec succès; si je remets les parenthèses, la page donne cet avertissement (pour la ligne avec l'appel à file_get_contents()
) et attache un fichier à l'email appelé Array.dat
mais pas le fichier sélectionné. Qu'est-ce que je fais mal?Télécharger plusieurs fichiers avec PHP
Warning: file_get_contents() expects parameter 1 to be a valid path, array given in C:\wamp\www\myapp\submit.php on line 188
HTML:
<input id="file" name="file[]" type="file" multiple="true">
PHP:
$fullmessage = "This is a multi-part fullname in MIME format.
--_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"
--_2_$boundary
Content-Type: text/plain; charset=\"iso-8859-1\"
Content-Transfer-Encoding: quoted-printable
$msg_quoted
--_2_$boundary--\r\n";
$msg_b64 = base64_encode($msg);
$fullmessage .= "--_1_$boundary
Content-Type: application/octet-stream; name=\"".$date->format('U')."-".$company."-".$custname."-".$email.".txt\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$msg_b64\r\n";
foreach($_FILES as $f){
if($f['size'] > 0){
$attachment = chunk_split(base64_encode(file_get_contents($f['tmp_name'])));
$name = $f['name'];
$fullmessage .= "--_1_$boundary
Content-Type: application/octet-stream; name=\"$name\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment\r\n";
}
}
$fullmessage .= "--_1_$boundary--";
$mail_options = '';
$mail_options .= 'O DeliveryMode=b'; //tells sendmail to run asynchronously
mail(EMAIL_RECIPIENTS, $subject, $fullmessage, $headers, $mail_options);
Mise à jour: que ce soit réglé, merci à @ I'L'I:
// Process the uploaded files.
$num_files = count($_FILES['file']['tmp_name']);
for($i=0; $i < $num_files; $i++){
if($_FILES['file']['size'][$i] > 0){
$attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'][$i])));
$name = $_FILES['file']['name'][$i];
$fullmessage .= "--_1_$boundary
Content-Type: application/octet-stream; name=\"$name\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment\r\n";
}
}
suggèrent fortement remplacer le mail de php() par une librairie comme swiftmailer ou phpmailer –
Merci, Dagon. Mais je n'ai pas de contrôle sur cette partie de l'application. Ce code peut-il être récupéré d'une manière ou d'une autre? – Alex
@Alex, heureux que vous l'avez eu de travail :) –