Télécharger la barre de progression en PHP
Est-ce que quelqu'un sait comment obtenir une barre de progression pour un téléchargement en php? J'essaie d'écrire du code pour un téléchargeur d'album photo. Je voudrais qu'une barre de progression s'affiche pendant le téléchargement des photos.
Je suis assez nouveau en php donc je ne sais pas tout à ce sujet.
12 réponses
C'est de loin (après des heures de googler et d'essayer des scripts) le plus simple à mettre en place et le plus beau uploader que j'ai trouvé
Https://github.com/FineUploader/fine-uploader
Il ne nécessite pas APC ou d'autres bibliothèques PHP externes, je peux obtenir des commentaires sur la progression du fichier sur un hôte partagé, et il prétend prendre en charge le glisser-déposer html5 (personnellement non testé) et les téléchargements de fichiers multiples.
Je suis désolé de dire que, à ma connaissance, une barre de progression de téléchargement PHP pure, ou même une barre de progression de téléchargement php/Javascript n'est pas possible en raison du fonctionnement de PHP. Votre meilleur pari est d'utiliser une certaine forme de Flash uploader.
AFAIK C'est parce que votre script n'est pas exécuté tant que tous les superglobals ne sont pas remplis, 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.
Si vous avezAPC installé, il a un crochet de rappel pour la progression du téléchargement.
Rasmus Lerdorf (le créateur de PHP) a un sample de ceci en utilisant YUI (oh, Et voici la source PHP ).
Voir la documentation ici.
Un PHP-ish (5.2+) & no-Flash way qui a bien fonctionné pour moi:
Tout d'abord, voir ce post expliquant comment obtenir l'extension "uploadprogress" en cours d'exécution.
Ensuite, dans la page contenant le formulaire à partir duquel vous téléchargez le ou les 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);"
Maintenant, vous avez un iframe caché dans votre formulaire qui sera visible et affichera le contenu de uploadprogress.php lorsque vous cliquez sur "Soumettre" pour commencer à télécharger des fichiers. $upload_id doit être le même que celui que vous utilisez comme valeur du champ caché "UPLOAD_IDENTIFIER" dans votre formulaire.
Le uploadprogress.php lui-même ressemble à ceci (corrigez et ajustez-vous à 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 c'est auto-rafraîchit chaque seconde. Vous pouvez sûrement ajouter une belle barre de progression visuelle ici (comme 2
L'implémentation de la barre de progression du téléchargement est facile et ne nécessite aucune extension PHP, JavaScript ou Flash supplémentaire. Mais Vous avez besoin de PHP 5.4 et plus récent.
Vous devez activer la collecte des informations de progression du téléchargement en définissant la directive session.upload_progress.enabled
à On
dans php.ini
.
Ensuite, ajoutez une entrée cachée au formulaire de téléchargement HTML juste 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
à partir de php.ini
(éventuellement précédé par 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 la structure superglobale $_SESSION
qui sera remplie avec les informations d'état de téléchargement. La clé est concaténée name
et value
de l'entrée cachée.
En PHP, vous pouvez jeter un oeil à peuplé télécharger des informations:
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, l'information combien d'octets va être transféré au total et combien d'octets a déjà été transféré.
Pour présenter la progression du téléchargement à l'utilisateur, écrivez un autre script PHP que celui du téléchargement, qui ne regardera que le téléchargement informations 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 pouvez même annuler le téléchargement en définissant $_SESSION[$key]['cancel_upload']
sur true
.
Pour obtenir des informations détaillées, des paramètres supplémentaires et commentaires de l'utilisateur voir manuel PHP.
Je viens de trouver 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 JS complet: http://developers.sirika.com/mfu/
- son libre (licence BSD)
- Internationalisable
- compatible avec les navigateurs croisés
- vous avez le choix d'installer APC ou non (barre de progression inférieure à la barre de progression déterminée)
- look personnalisable car il utilise le mécanisme de modèle dojo. Vous pouvez ajouter votre classe / ID dans les modèles te en fonction de votre css
Amusez-vous
HTML5 a introduit une api file upload {[2] } qui vous permet de surveiller la progression des téléchargements de fichiers, mais pour les navigateurs plus anciens, il existe plupload un framework 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
Gears et HTML5 ont un événement de progression 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 comme déjà répondu par d'autres sont:
- uploader basé sur Flash.
- uploader basé sur Java.
- une seconde Comet-style demande au serveur web ou un script pour signaler la taille des données reçues. Certains serveurs Web comme Lighttpd fournissent des modules à faites ceci en cours de processus pour économiser la surcharge d'appeler un script ou un processus externe.
Techniquement, il existe une option forth, similaire à YouTube upload, avec Gears ou HTML5, vous pouvez utiliser des blobs pour diviser un fichier en petits morceaux et télécharger individuellement chaque morceau. À la fin de chaque morceau, vous pouvez mettre à jour l'état d'avancement.
Vous devez utiliser Javascript pour créer une barre de progression. Une simple recherche Google m'a conduit à cet article: WebAppers barre de progression Javascript simple avec CSS .
Dojo File Upload Progress Bar Widget 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 publiiez dans votre script PHP, vous pouvez utiliser javascript pour lire les résultats du post et mettre à jour le barre de progression basée sur le nombre d'images téléchargées / nombre total d'images. Cela a pour effet secondaire de ne mettre à jour qu'après la fin de chaque publication. Consultez ici pour quelques informations sur la façon de poster avec JS.
Une barre de progression php/ajax peut être effectuée. (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 fichier a été téléchargé. Cependant, cet iframe caché peut être bloqué par certains addons de navigateurs car les iframes cachés sont souvent utilisés pour envoyer des données malveillantes à un ordinateur des utilisateurs.
Votre meilleur pari est d'utiliser une forme de barre de progression flash si vous ne le faites pas avoir le contrôle sur votre serveur.
Flash upload 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 de 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 fixe. J'ai besoin d'ajouter un ID utilisateur d'un nom de fichier et je ne vois aucun moyen de le faire.