Question

Quelqu'un sait comment obtenir une barre de progression pour un téléchargement en php? Je suis en train d'écrire du code pour un album photo Uploader. Je voudrais une barre de progression pour afficher des photos tandis que les téléchargez.

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

Était-ce utile?

La solution

est de loin (après les heures de googler et d'essayer des scripts) le plus simple à mettre en place et Uploader plus beaux que j'ai trouvé

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

Il ne nécessite pas d'APC ou d'autres bibliothèques PHP externes, je peux obtenir des commentaires de progression de fichiers sur un serveur mutualisé, et il prétend soutenir le glisser-déposer html5 (personnellement non testé) et plusieurs téléchargements de fichiers.

Autres conseils

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

Rasmus Lerdorf (créateur de PHP) a un de ce en utilisant YUI (oh, et voici la source PHP ).

Voir la documentation .

Je suis désolé de dire que le meilleur de ma connaissance pure barre de progression de téléchargement de PHP, ou même PHP / Javascript télécharger la barre de progression est impossible en raison de la façon dont fonctionne PHP. Votre meilleur pari est d'utiliser une certaine forme de Flash Uploader.

AFAIK C'est parce que votre script ne sera exécuté que tous les superglobales sont peuplés, qui comprend _FILES $. Au moment où votre script PHP est appelé, le fichier est entièrement téléchargé.

EDIT: Ce ne l'est plus. Il était en 2010.

Un PHP-ish (5.2+) et No-Flash façon qui fonctionne bien pour moi:

Tout d'abord, voir cette poster expliquant comment pour obtenir l'extension "Uploadprogress" et en cours d'exécution.

Ensuite, dans la page contenant le formulaire que vous téléchargez un fichier (s) à partir, créez le 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);"

Maintenant vous avez une iframe cachée dans votre formulaire qui viendra visible et afficher le contenu de uploadprogress.php lorsque vous cliquez sur « envoyer » pour lancer le téléchargement de fichiers. $ Upload_id doit être le même que vous utilisez comme la valeur du champ caché « UPLOAD_IDENTIFIER » dans votre formulaire.

Le uploadprogress.php se regarde autour comme celui-ci (fixer et adapter à vos 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 est auto-rafraîchit chaque seconde. Vous pouvez certainement ajouter un peu de barre de progression visuel agréable ici (comme 2 niché

s avec des couleurs différentes) si vous le souhaitez. Le iframe avec la progression du téléchargement fonctionne naturellement que lorsque le téléchargement est en cours, et termine sa vie visible une fois le formulaire est soumis et navigateur à la page recharge suivante.

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

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

Ensuite, ajoutez une entrée cachée à la forme de téléchargement HTML juste avant toute autre entrées de fichiers. attribut HTML de cette entrée name caché doit être la même que la valeur de la directive session.upload_progress.name de session.upload_progress.prefix (éventuellement précédé par value ). L'attribut est $_SESSION à vous, il sera utilisé dans le cadre de la clé de session.

formulaire HTML pourrait ressemble à 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 devrait créer une nouvelle clé dans la structure de superglobale qui $_SESSION[$key]['cancel_upload'] sera rempli avec les informations d'état de téléchargement. La clé est concaténée et true de l'entrée <=> cachée.

En PHP, vous pouvez jeter un oeil à l'information de téléchargement renseignés:

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

La sortie se penchera de façon similaire à 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 en cours, les informations combien d'octets va être transféré au total et le nombre d'octets a été déjà transféré

Pour présenter les progrès de téléchargement à l'utilisateur, écrire un autre script PHP que le téléchargement d'un, qui ne regarde les informations de téléchargement dans la session et le retourner au format JSON, par exemple. Ce script peut être appelé périodiquement, par exemple chaque seconde, en utilisant AJAX et les informations présentées à l'utilisateur.

Vous êtes même en mesure d'annuler le téléchargement en réglant le à <=> <=>.

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

Je viens de découvrir Mega Upload ( http://www.raditha.com/php/progress .php ) qui utilise perl faire le téléchargement et afficher une barre de progression.

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

  • Son libre (licence BSD)
  • internationalisable
  • croix navigateur compatible
  • vous avez le choix d'installer APC ou non (underterminate barre de progression déterminée VS barre de progression)
  • Apparence personnalisable car il utilise le mécanisme de modèle de dojo. Vous pouvez ajouter votre classe / Ids dans les modèles de te selon votre css

vous amuser

HTML5 introduit un télécharger api qui vous permet de surveiller la progression des téléchargements de fichiers, mais pour les anciens navigateurs il y a plupload un cadre spécialement conçu pour surveiller le téléchargement de fichiers et donner des informations à leur sujet. plus il a beaucoup de callbacks il peut fonctionner dans tous les navigateurs

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

Dojo Progress Télécharger fichier barre Widget est une autre option en utilisant le framework Dojo Javascript.

EDIT: En supposant que votre téléchargement d'un grand nombre d'images (comme un album photo), et de les afficher à votre script PHP, vous pouvez utiliser javascript pour lire les résultats de retour du poste et mettre à jour la barre de progression en fonction du nombre d'images téléchargées / nombre total d'images. Cela a pour effet secondaire de la mise à jour seulement après chaque poste est terminée. Consultez pour quelques informations sur la façon de poster avec JS.

php / ajax barre de progression peut être fait. (Checkout la bibliothèque Html_Ajax en poire). Cependant, cela nécessite l'installation d'un module personnalisé en php.

D'autres méthodes nécessitent l'utilisation d'un iframe, à travers lequel php semble voir à quel point le fichier a été téléchargé. Cependant, cette iframe cachée, peut être bloquée par certains addons navigateurs, car les iframes cachés sont souvent utilisés pour envoyer des données illicites à un ordinateur de l'utilisateur.

Votre meilleur pari est d'utiliser une certaine forme de barre de progression flash si vous ne disposez pas de contrôle sur votre serveur.

téléchargement flash fera le travail. il télécharger le fichier où vous voulez. Mais il y a plus de demandes que pour moi. Je dois changer le nom de fichier avant le téléchargement est terminé. ceci est également possible avec une solution flash, mais seulement si vous ajoutez fixe ou variable. Je dois ajouter l'ID utilisateur à un nom de fichier et je ne vois aucune façon de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top