2016-08-26 8 views
0

J'essaye d'utiliser XMLHttpRequest pour télécharger un fichier, mais je ne peux pas obtenir le rappel de progression (req.upload.onprogress ci-dessous) pour fonctionner correctement. Il signale toujours que evt.lengthComputable est false. Cependant, le serveur php rapporte correctement les attributs du fichier (voir la liste log.txt ci-dessous), et le fichier est correctement enregistré dans le répertoire des fichiers.La progression du téléchargement XMLHttpRequest est non-computable

Le rappel ne connaît pas la longueur du contenu? Si oui, javascript le mettre non de partager, donc mon suivi question serait comment définir que js ...

<!DOCTYPE HTML> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 
    <title>Test</title> 
</head> 
<body> 
    <p>Click to select a file</p> 
    <form method="post" action="" id="test_form" role="form" 
     enctype="multipart/form-data"> 
     <input type="file" id="test_file" required><br/><br/> 
     <button type="submit" id="test_button">Upload</button> 
    </form> 

    <script src="js/jquery.js"></script> 
    <script> 
    $(document).ready(function() 
    { 
     $("#test_form").on('submit', function(evt) 
     { 
      var fileElement = $('#test_file'); 
      var formData = new FormData(); 
      formData.append("file", fileElement[0].files[0]); 

      var req = new XMLHttpRequest(); 
      req.open("POST", document.URL); 
      req.upload.onprogress = function (evt) 
      { 
       if (evt.lengthComputable) 
       { 
        console.log("loaded " + evt.loaded + " total " + evt.total); 
       } 
       else 
       { 
        console.log("progress not computable"); 
       } 
      } 
      req.send(formData); 
     }); 
    }); 
    </script> 
</body> 
</html> 

    <?php 
    $log_path = "log.txt"; 
    file_put_contents($log_path, "_FILES:\n" . print_r($_FILES, true) . "\n"); 
    foreach ($_FILES as $key => $file) 
    { 
     $src_path = $file["tmp_name"]; 
     $dst_path = "./files/" . $file["name"]; 
     file_put_contents($log_path, "save $src_path to $dst_path\n", 
      FILE_APPEND); 
     rename($src_path, $dst_path); 
    } 
    ?> 

Les rapports de serveur dans ce log.txt:

_FILES: 
Array 
(
    [file] => Array 
     (
      [name] => 10.m4v 
      [type] => video/mp4 
      [tmp_name] => /tmp/phpkooBwd 
      [error] => 0 
      [size] => 3297694 
     ) 

) 

Répondre

0

Vous avez pour ajouter evt.preventDefault() à votre gestionnaire submit. Votre script html réinitialisera automatiquement la page après l'envoi du formulaire et vous devrez l'arrêter.