Maison  >  Article  >  développement back-end  >  Comment implémenter la reprise du point d'arrêt de téléchargement de fichiers en PHP

Comment implémenter la reprise du point d'arrêt de téléchargement de fichiers en PHP

小云云
小云云original
2018-03-27 13:45:262879parcourir


Cet article explique principalement avec vous comment implémenter la reprise du point d'arrêt de téléchargement de fichiers en PHP. J'espère qu'il pourra vous aider. Si notre site Web propose des services de téléchargement de fichiers, nous espérons généralement que le téléchargement pourra être repris (Resumable Download), ce qui signifie que l'utilisateur peut suspendre le téléchargement et continuer le téléchargement à partir du point de pause à un moment donné dans le futur sans avoir à redémarrer. Téléchargez l'intégralité du fichier.

Normalement, les serveurs Web (tels qu'Apache) activeront par défaut la prise en charge de la reprise des téléchargements. Par conséquent, si vous proposez des téléchargements de fichiers directement via le serveur Web, vous pouvez profiter des avantages de la reprise du téléchargement sans effectuer de configurations spéciales. Étant donné que ces fichiers sont fournis en téléchargement directement via le serveur Web, le script back-end ne peut pas contrôler le processus de téléchargement. Cela ne pose pas de problème pour les sites Web qui fournissent uniquement des fichiers publics statiques, mais pour les sites Web qui doivent fournir des fichiers privés et dynamiques, le fait de proposer des téléchargements directement via le serveur Web ne peut pas répondre aux besoins. À l'heure actuelle, vous devez ajouter la prise en charge du téléchargement de la reprise du point d'arrêt lors de l'écriture du programme de script en arrière-plan.

Cet article utilisera PHP comme exemple pour présenter brièvement la méthode de reprise des téléchargements de fichiers.

Principe

Le principe de reprise du téléchargement est relativement intuitif.

Le protocole HTTP précise comment transmettre une partie d'une ressource, pas la totalité. Par exemple, si la taille d'un fichier est de 1 000 octets, le navigateur ne peut demander que les 300 premiers octets du fichier, ou uniquement les 500e au 1 000e octets. De cette façon, au lieu de transmettre l’intégralité du contenu d’une ressource en une seule requête, vous pouvez effectuer plusieurs requêtes, chacune ne demandant qu’une partie du contenu. Une fois toutes ces requêtes renvoyées, le contenu obtenu est assemblé pièce par pièce pour obtenir la ressource complète.

Pour implémenter le téléchargement avec reprise du point d'arrêt, il faut utiliser les caractéristiques ci-dessus du protocole http. Lorsque l'utilisateur suspend le téléchargement, le navigateur enregistre l'emplacement téléchargé. Lorsque l'utilisateur reprend le téléchargement à un moment donné dans le futur, le téléchargement peut reprendre à partir du dernier emplacement interrompu sans avoir à recommencer depuis le début.

Mise en œuvre

Étant donné que la transmission partielle n'est pas obligatoire et que le serveur peut ou non la prendre en charge, nous devons indiquer au navigateur dans le programme si la ressource qu'il demande prend en charge la transmission partielle. Cela peut être accompli en définissant l'en-tête de réponse HTTP Accept-Ranges. Le code PHP est le suivant :

Le code est le suivant :

header('Accept-Ranges: bytes');

Accept-Ranges : bytes indique au navigateur que la ressource prend en charge la transmission partielle en octets. Cet en-tête de réponse doit être ajouté à toutes les ressources qui prennent en charge les transferts partiels.

Lors de la réception d'une demande, nous devons extraire de la demande du navigateur quelle partie de la ressource le navigateur demande. Ces informations sont transmises via l’en-tête de requête Range. En PHP, il est stocké dans $_SERVER['HTTP_RANGE']. Nous devons vérifier si cette variable est définie, si c'est le cas, utilisez la valeur, sinon, définissez la plage sur la ressource entière.

Le code est le suivant :

$range = "0-". ($content_length-1);
if(isset($_SERVER['HTTP_RANGE'])){
$range = $_SERVER['HTTP_RANGE'];
}

Ensuite, vous devez analyser la valeur de $range pour décider quelle partie de la ressource renvoyer. Exemples de valeurs possibles :

Le code est le suivant :

100-200 // 第100到第200字节
500-    // 第500字节到文件末尾
-1000   // 最后的1000个字节

Il convient de noter ici qu'après avoir obtenu une plage, vous devez vérifier sa valeur, notamment :

1. La position de départ est non négative

2. La position de fin doit être supérieure à la position de départ

3 La position de départ doit être inférieure à la longueur du fichier moins un. (car l'index de position ici commence à 0)

4. Si la position finale est supérieure à la longueur du fichier moins un, vous devez définir sa valeur sur la longueur du fichier moins un

如果Range的取值不合法,则需要终止程序并告知浏览器:

代码如下:

header('HTTP/1.1 416 Requested Range Not Satisfiable');

为了保持文章简洁,具体的校验代码这里就不提供了。下面假定你已经校验了Range的取值,并得到了 $start 和 $end 两个变量,分别表示开始位置和结束位置。

接下来要做的就是把文件的对应部分的内容发送给浏览器。不过要注意的是,这里涉及到需要发送多个HTTP响应头信息,具体如下:

代码如下:

header('HTTP/1.1 206 Partial Content');
header('Accept-Ranges: bytes');
header("Content-Range: bytes $start-$end/$filesize");
$length = $end - $start + 1;
header("Content-Length: $length");
/* 输出文件的指定部分 */

这里的$length需要注意一下,它的取值是本次传输的内容的长度,而不是整个文件的长度。另外需要注意的一点是,这里的HTTP状态码是206,不是200。

总结

文件下载的断点续传实际上是利用了HTTP协议中对传输部分文件的支持。而HTTP协议的这一特性不仅可以用于实现断点续传,客户端程序也可以利用它来实现多线程下载。

在实现断点续传的过程中,需要注意正确设置各种HTTP头信息。错误的头信息将导致用户下载到的文件损坏,无法使用。

相关推荐:

PHP下载断点续传

PHP实现文件下载断点续传

PHP实现下载断点续传的方法_PHP

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