2017-09-23 4 views
1

J'essaye de télécharger de "gros" fichiers dans mon application. Les utilisateurs doivent être en mesure de télécharger des fichiers vidéo de plus petite taille que 200 Mo mais il semble que le serveur abandonne les connexions après 4 Mo ou 30 secondes et le téléchargement échoue.Le téléchargement de Dropzone.js avec PHP a échoué après 30 secondes de téléchargement

Je l'ai déjà mis tous les paramètres dans mon dossier 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 quand je télécharger une fichier de 2 Mo @ 1Mbps/s (je ne sais pas si est un problème lié à la taille du fichier ou le temps de transfert)

fichier php_info en direct() peut être atteint à php_info

Bien que voici DropZone.js conf:

$("#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 télé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 être ok mais le serveur abandonner la connexion après quelque chose de mal (je ne pense pas que je s lié à PDO cause un fichier plus petit de 2 Mo fonctionnera).

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

EDIT Faire quelques tests que j'ai trouvé que le script tomber exactement à 30 secondes d'd'exécution, j'ai tryed ajouter set_time_limit(0); en haut du script mais rien n'a changé à nouveau

+0

Eh bien, certains de vos cas manquent des pauses pour eux. Cela peut ne pas corriger votre code, mais vous devez ajouter ceux-ci. –

+0

* "Je ne pense pas est lié à PDOquery" * - Il pourrait être, votre 'VALUES (NULL, '0', '0', '0', $ fileName)' ce nom de fichier est très probablement une chaîne et pourrait être défaillant, mais je pourrais avoir tort cependant. –

+0

pouvez-vous éditer votre message afin qu'il contienne le html pour ceci? Peut-être y a-t-il quelque chose qui contient une restriction. Si vous l'exécutez sur votre serveur local, assurez-vous de redémarrer tous les services après avoir effectué ces modifications, si vous avez apporté des modifications. Réglez le temps d'exécution maximum à 0 également. –

Répondre

9

problème était temps mort XHR référé à la configuration d'appel ajax.

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

$("#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 causera pas le délai d'attente 30 seconds lors du téléchargement du fichier avec DropZone.js.

MISE À JOUR

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

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

+0

Il existe également des paramètres au niveau du serveur Web qui peuvent affecter le comportement du délai d'expiration. Celui-ci m'a aidé: https://stackoverflow.com/questions/24127601/uwsgi-request-timeout-in-python –

+0

Vous pouvez également régler le délai à 0 pour désactiver le délai. Il est incorrectement signalé comme 0 par défaut dans la documentation mais est en réalité réglé à 30 secondes par défaut. –

+0

Merci pour votre suggestion @BrendonMuir, j'ai mis à jour ma réponse. – andreaem