Maison > Article > développement back-end > Que dois-je faire si je ne parviens pas à envoyer un gros fichier php ?
Solution au problème selon lequel PHP ne peut pas envoyer de gros fichiers : 1. Définissez le paramètre Range avec une syntaxe telle que "Ranges:(unit=first byte pos)-[last byte pos]" 2. Définissez "Content-Range" ; 3. Transmettez la requête « GET /test.rar HTTP/1.1 Connection : close Host : 116.1.219.219 » pour télécharger l’intégralité du fichier.
L'environnement d'exploitation de ce tutoriel : système Windows 10, PHP version 8.1, ordinateur DELL G3
Que dois-je faire si php ne peut pas envoyer de gros fichiers ?
Solution PHP pour télécharger des fichiers très volumineux
1. Présentation
Le soi-disant téléchargement de reprise fait en fait simplement référence au téléchargement, c'est-à-dire à la poursuite du téléchargement à partir de l'endroit où le fichier a été téléchargé. Les points d'arrêt n'étaient pas pris en charge dans les versions précédentes du protocole HTTP, mais le sont depuis HTTP/1.1. Généralement, les en-têtes d'entité Range et Content-Range ne sont utilisés que pour les téléchargements de points d'arrêt. Le protocole HTTP lui-même ne prend pas en charge le téléchargement de points d'arrêt et doit être implémenté par vous-même.
2. Range
est utilisé dans l'en-tête de la requête pour spécifier la position du premier octet et la position du dernier octet. Le format général est :
Range : utilisé pour le client à-. requêtes du serveur, vous pouvez spécifier la taille d'un certain segment du fichier téléchargé et son unité en modifiant le champ. Le décalage d'octet commence à 0. Format typique :
Ranges: (unit=first byte pos)-[last byte pos] Ranges: bytes=4000- 下载从第4000字节开始到文件结束部分 Ranges: bytes=0~N 下载第0-N字节范围的内容 Ranges: bytes=M-N 下载第M-N字节范围的内容 Ranges: bytes=-N 下载最后N字节内容
1. Les points suivants doivent être notés :
(1) Cet intervalle de données est un intervalle fermé, et la valeur de départ est 0, donc une requête du type "Plage : octets=0". -1" est en fait Au-dessus se trouvent les 2 octets au début de la requête.
(2) "Plage : octets=-200", cela n'indique pas de demander 201 octets au début du fichier, mais indique de demander 200 octets à la fin du fichier.
(3) Si le dernier octet pos est inférieur au premier octet pos, alors cette requête Range est une requête invalide. Le serveur doit ignorer cette requête Range, puis répondre par un 200 et envoyer l'intégralité du fichier au client.
(4) Si le dernier octet pos est supérieur ou égal à la longueur du fichier, alors cette requête de plage est considérée comme insatisfaisante et le serveur doit répondre par un 416, Plage demandée non satisfiable.
2. Exemple d'explication :
représente les 500 premiers octets : octets=0-499
représente les 500 seconds octets : octets=500-999
représente les 500 derniers octets : octets=- 500
représente la plage après 500 octets : bytes=500-
Le premier et le dernier octets : bytes=0-0,-1
Spécifiez plusieurs plages en même temps : bytes=500-600,601-999
3. Contenu -Range
est utilisé dans l'en-tête de réponse pour spécifier la position d'insertion d'une partie de l'entité entière. Il indique également la longueur de l'entité entière. Avant que le serveur ne renvoie une réponse partielle au client, il doit décrire la plage couverte par la réponse et la longueur totale de l'entité. Format général :
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
IV. Exemple d'en-tête
Demande de téléchargement de l'intégralité du fichier :
GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219 Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
Réponse générale normale
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801:文件总大小
À propos de la mise en œuvre la plus simple de la reprise du point d'arrêt suit :
1. Le client télécharge un fichier de 1024 Ko, et 512 Ko de celui-ci ont été téléchargés
2 Le réseau est interrompu, et le client demande de reprendre la transmission, il faut donc déclarer dans l'en-tête HTTP le fragment. qui doit être repris cette fois :
Range:bytes=512000-
Cet en-tête informe le serveur de commencer le transfert à partir de la position 512K du fichier
3 Le serveur reçoit la demande de reprise du point d'arrêt, démarre le transfert à partir de la position 512K du fichier. , et ajoute :
Content-Range:bytes 512000-/1024000
à l'en-tête HTTP et à ce moment le serveur Le code d'état HTTP renvoyé doit être 206, et non 200.
Mais dans des scénarios réels, il y aura une situation, c'est-à-dire que lorsque le terminal initie une demande de reprise, le contenu du fichier correspondant à l'URL a changé côté serveur et les données de reprise doivent être erronées. Comment résoudre ce problème ? Évidemment, nous avons actuellement besoin d’une méthode pour identifier le caractère unique du fichier. Il existe également des définitions correspondantes dans la RFC2616, telles que l'implémentation de Last-Modified pour identifier l'heure de la dernière modification d'un fichier, afin que vous puissiez déterminer si des modifications ont eu lieu lors de la reprise du fichier. Dans le même temps, la RFC2616 définit également un en-tête ETag. Vous pouvez utiliser l'en-tête ETag pour placer l'identifiant unique du fichier, tel que la valeur MD5 du fichier.
Le terminal doit déclarer le champ If-Match ou If-Modified-Since dans l'en-tête HTTP lors du lancement d'une demande de reprise pour aider le serveur à identifier les modifications de fichier.
De plus, la RFC2616 définit également un en-tête If-Range. Le terminal utilise If-Range s'il reprend la transmission. Le contenu dans If-Range peut être l'en-tête ETag initialement reçu ou l'heure de la dernière modification dans Last-Modfied. Lorsque le serveur reçoit la demande de reprise, il vérifie le contenu dans If-Range. Si la vérification est cohérente, il renvoie une réponse de reprise 206. Si elle est incohérente, le serveur renvoie une réponse 200 et le contenu de la réponse est entièrement nouveau. fichier.
Apprentissage recommandé : "Tutoriel vidéo 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!