Bonjour,
Je galère un peu pour télécharger un fichier binaire via une socket.
Premier problème: comment détecter la fin de fichier ? Tous les exemples de la FAQ donnent un code qui ressemble à ça:
sauf que pour un fichier binaire, il peut y avoir le code de fin de fichier avant la fin de fichier, et je sors donc de la boucle avant. J'ai essayé de tester la valeur de retour de fread, mais ça ne marche pas non plus (ça tourne en rond) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while (!feof($fichierouvert)) { $contenu .= fread($fichierouvert, 8192); }
Second problème: Comment tester la longueur de ma chaîne binaire ? supposons que j'ai lu 1024 octets. strlen donne la longueur jusqu'au premier '\0', pourtant je sais que ma chaîne est remplie après, puisque je peux lire la valeur $contenu[1023] . Par contre, si je lis $contenu[1024] j'ai une erreur (ce qui veut dire que la vraie longueur est bien mémorisée quelque part).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while (true) { $buf = fread($idSocket, 1024); if (false === $buf) break; $contenu .= $buf; }
Pour comprendre mon problème, il faut bien voir que je télécharge depuis une socket, donc il se peut que je lise moins que 1024 octets (parce que le buffer n'est pas encore rempli), mais ça ne signifie pas que le fichier soit fini.
PS: évitez les réponses du type "transforme ta chaîne en ASCII", c'est déjà ce que je fais actuellement, mais je voudrais éviter ça.
Partager