2014-06-19 5 views
1

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"; 
    } 
} 
+1

suggèrent fortement remplacer le mail de php() par une librairie comme swiftmailer ou phpmailer –

+0

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

+1

@Alex, heureux que vous l'avez eu de travail :) –

Répondre

1

Je pense que ce problème est plus une question de ce que l'erreur indique:

Avertissement: file_get_contents() attend le paramètre 1 pour être un chemin valide, un tableau donné dans C: \ wamp \ www \ myapp \ submit.php sur la ligne 188.

file_get_contents attend un string, pas un array.

Donc, il y a deux ou trois choses que vous pouvez faire pour résoudre ce problème:

Soit utiliser la chaîne correcte:

$attachment = chunk_split(base64_encode(file_get_contents($f))); 

Ou utilisez le key du tableau $_FILES

for ($x=0; $x<sizeof($_FILES); $x++) { 
    $attachment = chunk_split(base64_encode(file_get_contents($_FILES[$x]))); 
} 
+0

Merci, @ I'L'I. Veuillez voir la mise à jour ci-dessus. Vous m'avez mis sur la bonne voie, puis un peu plus de peaufinage l'a fait fonctionner pour plusieurs fichiers. – Alex

+0

Un autre problème: Il télécharge le fichier, mais Irfanview dit 'Impossible de lire l'en-tête du fichier! Je télécharge des fichiers JPG à tester et leur contenu ou type mime est en train de se perdre. – Alex

+1

Est-ce seulement avec 'JPG's' ou avec d'autres formats, et comment décodez-vous les fichiers? –

1

Vous ne pouvez généralement pas télécharger plus d'un fichier avec un seul élément d'entrée de fichier. Le seul navigateur que j'ai rencontré qui le supporte était Opera, et ils ont supprimé la fonctionnalité, probablement à cause du manque de support côté serveur.

Et c'est exactement ce que vous vivez: Si vous changez le nom du champ de formulaire d'un nom unique en pointant vers un tableau, vous devez changer l'accès aux données du fichier du côté PHP. Si vous dites que vous ne pouvez pas utiliser une bibliothèque décente pour le publipostage, je suppose que vous ne pouvez pas changer le code PHP qui reçoit les fichiers. Ensuite, vous ne pouvez pas modifier le téléchargement d'un fichier dans un téléchargement multi-fichiers. Et s'il vous plaît envisager de ne pas essayer de créer un tel champ de saisie multi-fichiers sur le côté HTML, car aucun utilisateur ne sait qu'il pourrait être en mesure d'envoyer plus d'un fichier - et même si vous leur dites qu'ils le peuvent, ils ne Je ne sais pas comment.

+0

Merci, Sven.Je peux changer le code ci-dessus mais je ne peux pas ajouter d'autres bibliothèques pour l'envoi. – Alex

+0

Alors pourquoi ne pas concaténer une bibliothèque que vous avez sélectionnée dans ce fichier que vous pouvez changer? Oui, la taille du fichier sera énorme, mais la commodité et la sécurité en bénéficieront énormément. – Sven

Questions connexes