PHP-Mailer fileupload – bei gemischten dateitypen wird manchmal nur eins gesendet

Jan-Frederik Stieler

Monsterator
Moderator
Hi,
ich hab in einem Formular welches per PHPMailer verschickt wird ein Datenupload für jpgs und PDFs.
Nun habe ich das Problem das wenn ich PDFs und Jpgs hochlade, wird nur manchmal nur eins der Dateien verschickt. Bei zwei JPGs bekomm ich bisher immer beide.
Ich verstehe nicht woran das liegen könnte:

HTML:
    <div class="btn fileinput-button span-12">
        <i class="gh-upload primary-circle"></i>
        <!-- The file input field used as target for the file upload widget   accept=".jpg,.png,.pdf,.gif "-->
        <input id="fileupload" type="file" name="uploaded_files[]" multiple="multiples" accept=".pdf, .jpg">
        <span class="filelabel span-4">Lageplan/Fotos <br>(pdf oder jpg) </span><span class="filesize span-12" style="font-size: 12px;">max. Dateigröße = 5 MB</span>
    </div>
    <ul id="files" class="files"></ul>

Javascript:
    $("#fileupload").change(function(data) {
        var files = $(this)[0].files;

        for (var i = 0; i < files.length; i++) {
            var fileType = files[i].type;
            var ValidImageTypes = ["image/jpeg", "application/pdf"];
            if ($.inArray(fileType, ValidImageTypes) < 0) {
                $(".filelabel").after('<div class="alert span-7">' + fileType + 'Bitte laden Sie nur .jpg- oder .pdf-Dateien hoch!<button class="alertclose">&times;</button></div>');
            }
            else {
                $("#files").append('<li class="m-6 span-4" data-path="'+ files[i].path +'">' + files[i].name + '</li>');  
            }
        }
    });

PHP:
try {
                //Attach multiple files one by one
                for ($i = 0; $i < count($_FILES['uploaded_files']['tmp_name']); $i++) {
                    if($_FILES['uploaded_files']['error'][0] !== 4){
                        if ($i == $maximumfiles) {
                            throw new RuntimeException('<div class="alert">Sie haben zuviele Dateien hochgeladen.</div>');
                        }
                        if (!isset($_FILES['uploaded_files']['error'][$i])) {
                            throw new RuntimeException('<div class="alert">Etwas mit Ihren Dateien stimmt nicht.</div>');
                        }
                        switch ($_FILES['uploaded_files']['error'][$i]) {
                            case UPLOAD_ERR_OK:
                                break;
                            // case UPLOAD_ERR_NO_FILE:
                            //     throw new RuntimeException('<div class="alert">Eine Ihrer Dateien scheint nicht verschickt worden zu sein.</div>');
                            case UPLOAD_ERR_INI_SIZE:
                            case UPLOAD_ERR_FORM_SIZE:
                                throw new RuntimeException('<div class="alert">Eine Ihrer Dateien scheint von der Datenmenge groß zu sein.</div>');
                            // default:
                            //     throw new RuntimeException('<div class="alert">Ein unbekannter Fehler ist aufgetreten.</div>');
                        }
                        if ($_FILES['uploaded_files']['size'][$i] > 5000000) {
                            throw new RuntimeException('<div class="alert">Die maximale Dateigröße ist überschritten.</div>');
                        }

                        $extension = strtolower(pathinfo($_FILES['uploaded_files']['name'][$i], PATHINFO_EXTENSION));
                        $allowed_extensions = array('jpg', 'jpeg', 'pdf');

                        if(!in_array($extension, $allowed_extensions)) {
                            throw new RuntimeException('<div class="alert">Nicht erlaubtes Dateiformat!</div>');
                        }

                        $allowed_types = array ('application/pdf', 'image/jpeg');
                        $fileInfo = finfo_open(FILEINFO_MIME_TYPE);
                        $detected_type = finfo_file( $fileInfo, $_FILES['uploaded_files']['tmp_name'][$i]);
                        if ( !in_array($detected_type, $allowed_types) ) {
                            throw new RuntimeException('<div class="alert">Nicht erlaubtes Dateiformat!</div>');
                        }
                        finfo_close( $fileInfo );

                        $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['uploaded_files']['name'][$i]));
                        $filename = $_FILES['uploaded_files']['name'][$i];

                        if (move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$i], $uploadfile)) {
                            $files = $mail->addAttachment($uploadfile, $filename);
                        } else {
                            throw new RuntimeException('Failed to move file to ' . $uploadfile);
                        }
                    }
                }
 
Hi,
Ja also ne Meldung bekomm ich nicht und die Mail geht ja raus aber eben fehlt dann ne Datei.
Wie komm ich jetzt dahinter warum diese Dateien verschwinden?

Grüße
 
Versuchen, durch Diagnoseausgaben den Fehler einzugrenzen? Z. B. var_dump auf das Mailerobjekt. Dann kann man prüfen, ob die Anhänge dort vorhanden sind.
Bei dem vorigen Problem war es ja so, dass eine Email verschwand, obwohl das PHP in Ordnung war. Vielleicht hier ein ähnliches Problem beim Sender oder Empfänger, z. B. Überschreiten der max. Größe für Anhänge?
 
Hi,
ich hab mir mal ein script erstellt wo der ganze restliche „Müll“ des Formulares und die Prüfungen so nicht drinnen sind.
Dort bekomm ich jetzt die Meldung:
1 Failed to move file to /tmp/Leistungen.jpgZlwN3N
die maximale Dateimenge (upload_max_filesize) liegt bei 64M und die sys_get_temp_dir is writable: bool(true) . Was kann noch dafür verantwortlich sein das diese Date nicht verschoben werden kann?
Manche Dateien gehen durch und manche nicht.

Grüße
 
Zuletzt bearbeitet:
Hi,
Nein hatte ich natürlich im komprimierten Script nicht getan.
Danke da hab ich dann die Meldung bekommen das die Dateigröße zu groß war. Was eigentlich nicht so ganz stimmte aber das ist jetzt nicht das wirkliche Problem.

Ich hab aus dem Script auch das try and catch gegen eine normale Else/if Ausgabe umgewandelt. Das hat wohl auch geholfen die Fehlerausgabe zu vereinfachen und besser zu funktionieren.

Grüße
 
Hi,
ich hab mir mal ein script erstellt wo der ganze restliche „Müll“ des Formulares und die Prüfungen so nicht drinnen sind.
Dort bekomm ich jetzt die Meldung:
1 Failed to move file to /tmp/Leistungen.jpgZlwN3N
die maximale Dateimenge (upload_max_filesize) liegt bei 64M und die sys_get_temp_dir is writable: bool(true) . Was kann noch dafür verantwortlich sein das diese Date nicht verschoben werden kann?
Manche Dateien gehen durch und manche nicht.

Grüße
Es gibt noch eine andere Größe, die die Uploadmenge reguliert. Welcher Webserver kommt bei Dir zum Einsatz? Sofern es Nginx ist überprüfe doch mal den Wert von client_max_body_size. Unter Apache oder lighttpd gibt es vielleicht ähnliche Parameter. Teste Dein Script unter verschiedenen Webservern( z.B unter XAMPP 127.0.0.1 und unter LINUX (sofern vorhanden, auf einem Pi)), um zu eruieren, ob's am Script, an der php.ini oder am Webserver liegt!
 
Zuletzt bearbeitet:
Zurück