web-dev-qa-db-fra.com

Téléchargement Dropzone.js avec PHP a échoué après 30 secondes de téléchargement

J'essaie de télécharger des "gros" fichiers dans mon application. Les utilisateurs doivent pouvoir télécharger des fichiers vidéo d'une taille inférieure à 200 Mo, mais il semble que le serveur abandonne les connexions après 4 Mo ou 30 secondes et le téléchargement échoue.

J'ai déjà défini tous les paramètres dans mon fichier php.ini Comme ceci:

max_input_time = 320
max_execution_time = 320
max_file_uploads = 20
memory_limit = 512M
post_max_size = 201M
upload_max_filesize = 200M

Tout fonctionne lorsque je télécharge un fichier de 2 Mo à 1 Mbps/s (je ne sais pas si c'est un problème de taille de fichier ou de temps de transfert)

Le fichier php_info () en direct est accessible à php_info

Bien que voici la conf DropZone.js:

$("#dZUpload").dropzone({
     url: "/ajax/admin/admin.acceptVideo.php",
     maxFilesize: 209715200,
     acceptedFiles: "video/*",
     addRemoveLinks: true,
     dataType: "HTML",
     data: { id: '' },
     success: function (file, response, data) {
         var imgName = response;
         file.previewElement.classList.add("dz-success");
         $('#form_video').val(imgName);
     },
     error: function (file, response) {
     file.previewElement.classList.add("dz-error");
     }
});
Dropzone.autoDiscover = false;
Dropzone.prototype.defaultOptions.dictRemoveFile = "Rimuovi file";
Dropzone.prototype.defaultOptions.dictCancelUpload = "Annulla";

Et voici le script PHP qui gère les chargements:

<?php
require_once '../db.config.php';

header('Content-Type: text/plain; charset=utf-8');

ini_set('upload_max_filesize', '200M');
ini_set('post_max_size', '201M');
ini_set('max_input_time', 320);
ini_set('memory_limit', '256M'); 


try {
    if (
        !isset($_FILES['file']['error']) ||
        is_array($_FILES['file']['error'])
    ) {
        throw new RuntimeException('Invalid parameters.');
    }

    switch ($_FILES['file']['error']) {
    case UPLOAD_ERR_OK:
        break;
    case UPLOAD_ERR_NO_FILE:
        throw new RuntimeException('No file sent.');
        break;
    case UPLOAD_ERR_INI_SIZE:
        break;
    case UPLOAD_ERR_FORM_SIZE:
        throw new RuntimeException('Exceeded filesize limit.');
        break;
    default:
        throw new RuntimeException('Unknown errors.');
        break;
}

    // check filesize. 
    if ($_FILES['file']['size'] > 209715200) {
        throw new RuntimeException('Exceeded filesize limit.');
    }

    // Check MIME Type.
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    if (false === $ext = array_search(
            $finfo->file($_FILES['file']['tmp_name']),
            array(
                'mp4' => 'video/mp4',
                'mov' => 'video/mov',
                'avi' => 'video/avi',
            ),
            true
        )) {
        throw new RuntimeException('Invalid file format.');
    }

    // name uniquely.
    $fileName = sha1_file($_FILES['file']['tmp_name']);
    if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('/var/www/html/beta.vedocompro.it/web/webtemp/%s.%s', $fileName, $ext ))) {
        throw new RuntimeException('Failed to move uploaded file.');
    }

    try {

        $PDO = new PDO('mysql:Host=' . $DB_Host . ';dbname=' . $DB_NAME,$DB_USER,$DB_PASS);
        $insert = $PDO->prepare("INSERT INTO `videos` (`id`, `aid`, `accepted`, `uid`, `dir`) VALUES (NULL, '0', '0', '0', $fileName);");
        $insert->execute();

        echo $fileName;

    } catch(PDOException $exception) {
        echo $exception;
    }



} catch (RuntimeException $e) {

    echo $e->getMessage();

}

Donc tout semble aller bien mais le serveur abandonne la connexion après quelque chose de mal (je ne pense pas que ce soit lié à PDOquery car un fichier plus petit de 2 Mo fonctionnera).

Pourriez-vous s'il vous plaît aider à identifier le problème?

EDIT En faisant des tests, j'ai trouvé que le script tombait exactement à 30 secondes d'exécution, j'ai essayé d'ajouter set_time_limit(0); dans haut du script mais rien n'a encore changé

10
andreaem

Le problème était dans le délai d'attente XHR référé à la configuration d'appel ajax.

Pour éviter cela, il faut mettre timeout: 180000 (ou ce que vous voulez en ms) dans le DropZone.js paramètres init.

$("#dZUpload").dropzone({
     url: "/ajax/admin/admin.acceptVideo.php",
     maxFilesize: 209715200,
     acceptedFiles: "video/*",
     addRemoveLinks: true,
     dataType: "HTML",
     timeout: 180000,
     success: function (file, response, data) {
         // Do things on Success
     },
     error: function (file, response) {
     file.previewElement.classList.add("dz-error");
     }
});

Cela ne provoquera pas le 30 seconds timeout lors du téléchargement d'un fichier avec DropZone.js.

MISE À JOUR

Comme l'a signalé @Brendon Muir, vous pouvez également insérer 0 as timeout pour désactiver le délai d'attente.

La documentation DropZone.js signale que le délai d'expiration par défaut est 0, c'est incorrect, le délai d'expiration par défaut est de 30 secondes. ne valeur de 0 désactivera le délai d'attente.

50
andreaem

Je me rends compte que cette question est un peu ancienne mais j'ai eu des problèmes avec la capture du comportement de délai d'attente et j'ai découvert cette solution à la place où le délai d'attente est intercepté sur la fonction d'envoi, comme indiqué ci-dessous:

$("#dZUpload").dropzone({
     url: "/ajax/admin/admin.acceptVideo.php",
     maxFilesize: 209715200,
     acceptedFiles: "video/*",
     addRemoveLinks: true,
     dataType: "HTML",
     data: { id: '' },
     success: function (file, response, data) {
         var imgName = response;
         file.previewElement.classList.add("dz-success");
         $('#form_video').val(imgName);
     },
     error: function (file, response) {
         file.previewElement.classList.add("dz-error");
     },
     //Called just before each file is sent
     sending: function(file, xhr, formData) {
         //Execute on case of timeout only
         xhr.ontimeout = function(e) {
             //Output timeout error message here
             console.log('Server Timeout');

         };
     }
});
1
karen