web-dev-qa-db-fra.com

Charger la barre de progression dans PHP

Est-ce que quelqu'un sait comment obtenir une barre de progression pour un téléchargement en php? J'essaye d'écrire du code pour un uploader d'album photo. Je souhaite qu'une barre de progression s'affiche pendant le téléchargement des photos.

Je suis assez nouveau sur php, donc je ne sais pas tout à ce sujet.

79
Josh Curren

C'est de loin (après des heures passées à googler et à essayer des scripts) le plus simple à installer et le plus gentil uploader que j'ai trouvé

https://github.com/FineUploader/fine-uploader

Il ne nécessite ni APC ni aucune autre bibliothèque externe PHP, je peux obtenir un retour sur l'avancement des fichiers sur un hôte partagé. Il prétend prendre en charge le glisser-déposer html5 (personnellement non testé) et le téléchargement de fichiers multiples. .

70
Jesse

Je suis désolé de dire qu'au meilleur de ma connaissance, une barre de progression pure PHP, ou même une barre de progression de téléchargement PHP/Javascript n'est pas possible, car PHP fonctionne. Votre meilleur pari est d’utiliser une certaine forme de Flash Uploader.

Autant que je sache, c'est parce que votre script n'est pas exécuté tant que tous les superglobals ne sont pas renseignés, ce qui inclut $ _FILES. Au moment où votre script PHP est appelé, le fichier est entièrement téléchargé.

EDIT: Ce n'est plus vrai. C'était en 2010.

13
Macha

Si vous avez APC , il y a un point de rappel pour la progression du téléchargement.

Rasmus Lerdorf (créateur de PHP) a un exemple utilisant YUI (oh, et voici le source PHP ).

Voir la documentation ici .

13
Powerlord

Une manière PHP-ish (5.2+) & no-Flash qui a bien fonctionné pour moi:

Tout d’abord, voir this post expliquant comment obtenir une extension "uploadprogress" opérationnelle.

Ensuite, dans la page contenant le formulaire à partir duquel vous téléchargez des fichiers, créez l'iframe suivant:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

Ensuite, ajoutez ce code à votre bouton "Soumettre":

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"

Vous avez maintenant une iframe cachée dans votre formulaire qui deviendra visible et montrera le contenu de uploadprogress.php lorsque vous cliquerez sur "Soumettre" pour lancer le téléchargement de fichiers. $ upload_id doit être identique à celui que vous utilisez comme valeur du champ caché "UPLOAD_IDENTIFIER" dans votre formulaire.

Le fichier uploadprogress.php lui-même ressemble à ceci (corrige et s’adapte à tes besoins):

<html>
<head>
<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'>
</head>
<body>
Upload progress:<br />
<?php
    if(!$_GET['id']) die;
    $info = uploadprogress_get_info($_GET['id']);
    $kbytes_total = round($info['bytes_total'] / 1024);
    $kbytes_uploaded = round($info['bytes_uploaded'] / 1024);
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB';
?>
</body>
</html>

Notez que se rafraîchit automatiquement chaque seconde. Vous pouvez sûrement ajouter ici une jolie barre de progression visuelle (comme 2 <div> s imbriquées de couleurs différentes) si vous le souhaitez. L'iframe avec progression du téléchargement ne fonctionne naturellement que lorsque le téléchargement est en cours et prend fin de manière visible une fois le formulaire soumis et le navigateur rechargé à la page suivante.

8
IvarsK

La mise en œuvre de la barre de progression du téléchargement est facile et ne nécessite aucune PHP supplémentaire, JavaScript ou Flash.). Toutefois vous avez besoin PHP = 5.4 et plus récent .

Vous devez activer la collecte des informations sur la progression du téléchargement en définissant la directive session.upload_progress.enabled à On dans php.ini.

Ajoutez ensuite une entrée masquée au formulaire de téléchargement HTML avant toute autre entrée de fichier. L'attribut HTML name de cette entrée masquée doit être identique à la valeur de la directive session.upload_progress.name de php.ini (éventuellement précédé de session.upload_progress.prefix ). L'attribut value dépend de vous, il sera utilisé dans le cadre de la clé de session.

Le formulaire HTML pourrait ressembler à ceci:

<form action="upload.php" method="POST" enctype="multipart/form-data">
   <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" />
   <input type="file" name="file1" />
   <input type="submit" />
</form>

Lorsque vous envoyez ce formulaire, PHP doit créer une nouvelle clé dans le $_SESSION structure superglobal qui sera renseignée avec les informations d’état du téléchargement. La clé est concaténée name et value de l'entrée masquée.

Dans PHP, vous pouvez consulter les informations de téléchargement renseignées:

var_dump($_SESSION[
    ini_get('session.upload_progress.prefix')
   .ini_get('session.upload_progress.name')
   .'_myupload'
]);

La sortie ressemblera à ce qui suit:

$_SESSION["upload_progress_myupload"] = array(
  "start_time" => 1234567890,   // The request time
  "content_length" => 57343257, // POST content length
  "bytes_processed" => 54321,   // Amount of bytes received and processed
  "done" => false,              // true when the POST handler has finished, successfully or not
  "files" => array(
    0 => array(
      "field_name" => "file1",    // Name of the <input /> field
      // The following 3 elements equals those in $_FILES
      "name" => "filename.ext",
      "tmp_name" => "/tmp/phpxxxxxx",
      "error" => 0,
      "done" => false,            // True when the POST handler has finished handling this file
      "start_time" => 1234567890, // When this file has started to be processed
      "bytes_processed" => 54321, // Number of bytes received and processed for this file
    )
  )
);

Il y a toutes les informations nécessaires pour créer une barre de progression: vous avez les informations si le téléchargement est toujours en cours, le nombre total d'octets transférés et le nombre d'octets déjà transférés.

Pour présenter la progression du téléchargement à l'utilisateur, écrivez un autre script PHP), qui examinera uniquement les informations de téléchargement de la session et les renverra au format JSON, par exemple. Ce script peut être appelé périodiquement, par exemple toutes les secondes, à l'aide de AJAX et des informations présentées à l'utilisateur.

Vous pouvez même annuler le téléchargement en réglant la $_SESSION[$key]['cancel_upload'] à true.

Pour des informations détaillées, des paramètres supplémentaires et les commentaires de l'utilisateur, voir Manuel PHP .

Un autre uploader complet JS: http://developers.sirika.com/mfu/

  • Son libre (licence BSD)
  • Internationalisable
  • compatible avec tous les navigateurs
  • vous avez le choix d'installer ou non APC (barre de progression inférieure à la barre de progression déterminée)
  • Apparence personnalisable lorsqu’il utilise le mécanisme de gabarit de dojo. Vous pouvez ajouter votre classe/vos identifiants dans les modèles en fonction de votre css

s'amuser

2
Valdelievre

Je viens de trouver Mega Upload ( http://www.raditha.com/php/progress.php ) qui utilise Perl pour le téléchargement et affiche une barre de progression.

2
Josh Curren

Gears et HTML5 ont un événement progress dans l'objet HttpRequest pour soumettre un téléchargement de fichier via AJAX.

http://developer.mozilla.org/en/Using_files_from_web_applications

Vos autres options auxquelles d'autres ont déjà répondu sont les suivantes:

  1. Téléchargeur basé sur Flash.
  2. Téléchargeur basé sur Java.
  3. Une seconde demande style comète au serveur Web ou à un script pour signaler la taille des données reçues. Certains serveurs Web, tels que Lighttpd, fournissent des modules pour effectuer cette opération en cours de processus, afin d’éviter les frais généraux liés à l’appel d’un script ou d’un processus externe.

Techniquement, il existe une quatrième option, similaire au téléchargement sur YouTube. Avec Gears ou HTML5, vous pouvez utiliser des gouttes pour diviser un fichier en petits morceaux et télécharger individuellement chaque morceau. À la fin de chaque morceau, vous pouvez mettre à jour le statut de progression.

2
Steve-o

HTML5 a introduit une api de téléchargement de fichier qui vous permet de surveiller la progression des téléchargements de fichiers, mais pour les navigateurs plus anciens, il existe plupload un cadre spécialement conçu pour surveiller les téléchargements de fichiers et donner des informations à leur sujet. . De plus, il a beaucoup de rappels afin qu'il puisse fonctionner sur tous les navigateurs

2
the master

Vous devez utiliser Javascript pour créer une barre de progression. Une simple recherche sur Google m'a conduit à cet article: Barre de progression Javascript simple de WebAppers avec CSS .

Widget de la barre de progression de téléchargement de fichier Dojo est une autre option utilisant le framework Javascript Dojo.

EDIT: En supposant que vous téléchargiez un grand nombre d’images (comme un album photo) et que vous les postez sur votre script PHP, vous pouvez utiliser javascript pour lire les résultats de la publication et mettre à jour le barre de progression basée sur le nombre d'images téléchargées/le nombre total d'images. Ceci a pour effet secondaire de ne mettre à jour que chaque publication terminée. Découvrez ici pour obtenir des informations sur la manière de publier avec JS.

1
Joey Robert

Une barre de progression php/ajax peut être faite. (Consultez la bibliothèque Html_Ajax dans pear). Cependant, cela nécessite l'installation d'un module personnalisé dans php.

D'autres méthodes nécessitent l'utilisation d'un iframe, à travers lequel php cherche à voir combien de fichiers ont été téléchargés. Toutefois, cette iframe masquée peut être bloquée par certains addons de navigateurs, car les iframes masqués sont souvent utilisés pour envoyer des données malveillantes à un ordinateur d'utilisateur.

Votre meilleur pari est d’utiliser une forme de barre de progression flash si vous n’avez pas le contrôle de votre serveur.

1
Ali Lown

le téléchargement flash fera le travail. il va télécharger le fichier où vous voulez. Mais il y a plus de demandes que cela pour moi. Je dois changer le nom du fichier avant que le téléchargement ne soit terminé. Ceci est également possible avec la solution flash MAIS SEULEMENT si vous ajoutez une variable FIXED. J'ai besoin d'ajouter un nom d'utilisateur à un nom de fichier et je ne vois aucun moyen de le faire.

0
nibuster