Maison  >  Article  >  développement back-end  >  Le fichier de téléchargement Curl affiche une barre de progression en temps réel (avec code)

Le fichier de téléchargement Curl affiche une barre de progression en temps réel (avec code)

php中世界最好的语言
php中世界最好的语言original
2018-05-17 13:51:125932parcourir

Cette fois, je vais vous proposer un affichage de la barre de progression en temps réel pour les fichiers téléchargés Curl (avec code). Quelles sont les précautions pour que les fichiers téléchargés Curl affichent une barre de progression en temps réel. un cas pratique, jetons un coup d'oeil.

Préface

Récemment, j'ai bricolé la programmation en ligne de commande. Le téléchargement de fichiers est toujours un processus ardu. mieux s'il y avait une barre de progression. ! !

Tout d'abord, c'est bien d'obtenir un pack d'extension de barre de progression https://github.com/dariuszp/cli-progress-bar (téléchargement local)

Rendu :

C'est quand même plutôt beau !

A quoi sert curl ?

Utilisez php, curl récupère principalement des données, bien sûr nous pouvons utiliser d'autres méthodes pour les récupérer, Par exemple, fsockopen, file_get_contents, etc. Mais il ne peut capturer que les pages accessibles directement. Si vous souhaitez capturer des pages avec Contrôle d'accès, ou des pages après vous être connecté, ce sera plus difficile.

curl utilise

curl comme méthode de téléchargement très courante pour PHP, voici une façon simple de l'utiliser

// 初始化一个 curl
$ch = curl_init();
// 设置请求的 url
curl_setopt($ch, CURLOPT_URL, $url);
// 
curl_setopt($ch, CURLOPT_HEADER, 0);
// 不直接输出,而是通过 curl_exec 返回
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (false === ($stream = curl_exec($ch))) {
 throw new \Exception(curl_errno($ch));
}
curl_close($ch);
return $stream;
Ce qui précède est un exemple très simple. Si un fichier est volumineux, alors l'utilisateur devra attendre longtemps. À ce moment-là, nous devrions ajouter l'effet de la barre de progression :

.
class Request
{
 protected $bar;
 // 是否下载完成
 protected $downloaded = false;
 public function construct()
 {
 // 初始化一个进度条
 $this->bar = new CliProgressBar(100);
 $this->bar->display();
 $this->bar->setColorToRed();
 }
 
 function download($url)
 {
 $ch = curl_init();
 // 从配置文件中获取根路径
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
 // 开启进度条
 curl_setopt($ch, CURLOPT_NOPROGRESS, 0);
 // 进度条的触发函数
 curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress');
 // ps: 如果目标网页跳转,也跟着跳转
 // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 if (false === ($stream = curl_exec($ch))) {
  throw new \Exception(curl_errno($ch));
 }
 curl_close($ch);
 return $stream;
 }
 
 /**
 * 进度条下载.
 *
 * @param $ch
 * @param $countDownloadSize 总下载量
 * @param $currentDownloadSize 当前下载量
 * @param $countUploadSize 
 * @param $currentUploadSize
 */
 public function progress($ch, $countDownloadSize, $currentDownloadSize, $countUploadSize, $currentUploadSize)
 {
  // 等于 0 的时候,应该是预读资源不等于0的时候即开始下载
  // 这里的每一个判断都是坑,多试试就知道了
 if (0 === $countDownloadSize) {
  return false;
 }
 // 有时候会下载两次,第一次很小,应该是重定向下载
 if ($countDownloadSize > $currentDownloadSize) {
  $this->downloaded = false;
  // 继续显示进度条
 }
 // 已经下载完成还会再发三次请求
 elseif ($this->downloaded) {
  return false;
 }
 // 两边相等下载完成并不一定结束,
 elseif ($currentDownloadSize === $countDownloadSize) {
  return false;
 }
 
 // 开始计算
 $bar = $currentDownloadSize / $countDownloadSize * 100;
 $this->bar->progress($bar);
 }
}
(new Request)->download('http://www.shiguopeng.cn/database.sql');
Millions Faites attention aux pièges dans le jugement des rappels de téléchargement ! ! !

Il y a un autre problème : si vous passez au téléchargement et configurez curl pour sauter, le fichier renvoyé aura des problèmes

J'ai téléchargé un fichier zip, ce qui entraînera l'en-tête du fichier. le contenu de l'en-tête de réponse HTTP de la première requête,

, donc cela dépend de ce dont vous avez besoin

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour un contenu plus passionnant, veuillez prêter attention au site Web chinois php Autres articles connexes !

Lecture recommandée :

Explication détaillée des étapes pour ajouter dynamiquement des données XML avec PHP

CMSPRESS implémente une classification illimitée (avec code)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn