Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2006, 21h30   #1
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Par défaut header, range et location

Salut,

je suis peut être limite border line, mais je voulais savoir si les headers range et location sont compatibles :
Code :
1
2
3
4
5
6
$size2  = $filesize - 1;
$updated_length = $filesize - $pos;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $updated_length");
header("Content-Range: bytes $pos-$size2/$filesize");
header("Location: ".$filename);
Ce code, syntaxiquement correct, renvoit le fichier en entier.
Bref, l'idée étant de redirigée vers une partie d'un fichier, et non vers le fichier en entier.

Merci d'avance !
++
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 21h34   #2
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
Tu t'es tromper de coté

Code :
header("Location: http://www.google.fr/");
est utilisé lorsque le serveur veut renvoyé (à l'aide de Header Location) ailleurs.

----------------------------------OUUUUPPSSSSSS----------

OUPSS désolé, c'est moi qui me plante,

mais je ne pense pas que Location puisse être compatible avec Content-Range, tout simplement parce que Content Range stipule qu'elles sont les parties du fichier que tu demandes, alors que Location lui, te renvoie ailleurs.

D'ailleur HTTP/1.1 206 Partial Content pour Content-Range:
et HTTP/1.1 301 Moved pour Location

Deux Headers totalement différent...
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 21h49   #3
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Salut juJuv,

J'avais en tête ces mêmes commentaires, mais n'étant pas, j'ai sollicité un regard extérieur.
Dommage que ça ne puisse pas fonctionner .
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 21h52   #4
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
Tu veux faire quoi exactement?

si tu veux faire une sorte de substitue aux streaming, je te souhaite bonne chance.
(je pense que c'est tout de mêmes possible)

Il faut envoyer directement les requêtes HTTP aux serveur sur lequel tu veux prendre une parti du fichier...
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 21h59   #5
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Grâce à tes indications sur mon post précédent, je peux streamer un fichier distant : le serveur Web va chercher les parties distantes et les renvoie au client. Dans ce cas, c'est le serveur Web qui renvoie les données.

Pour aller plus loin, l'idéal serait que ce soit le serveur distant (celui qui héberge le fichier) qui renvoit directement les parties demandées au client.
Moins d'intermédaire et plus de SPOF (Single Point Of Failure) ou presque.

Tu vois ce que je veux dire ?
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 22h08   #6
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
ouais (enfin je crois)

c'est simple, tu récupères les partis et tu les affiches directement, comme si tu faisait un fopen classique, sauf qu'ici, tu n'as juste qu'à afficher les partis télécharger par ton intermédiaire.
Il faut juste que tu penses au header qui force le téléchargement.

Code :
1
2
3
4
header("Content-type: application/force-download;");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=\"monfichier.zip\"");
header("Cache-Control: no-cache, must-revalidate");
plus d'info
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 22h24   #7
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
oui, mais dans ce cas, c'est le serveur auquel accède le client qui renvoit le fichier, non ?

Imaginons : Client (C) -> Serveur 1 (S1) -> Serveur 2(S2).

C demande une partie à S1.
S1 transfert la demande à S2.
S2 renvoit la partie en question (S1 ne fait donc plus rien).

avec fopen, je retombe sur le problème du fseek sur fichier distant
(j'espère pas dire n'importe quoi)
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 22h40   #8
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
non

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
//tu dis que ce qui soit ce telecharge a ton navigateur web
 
header("Content-type: application/force-download;");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=\"monfichier.zip\"");
header("Cache-Control: no-cache, must-revalidate");
 
// tu récupères les partis du fichiers distant
 
$fp = fsockopen("http://".$url["host"], 80);
fwrite($fp, "GET ".$url[query]." HTTP/1.1\r\n");
fwrite($fp, "Host: ".$url[host]."\r\n");
fwrite($fp, "Range: bytes=".$byte."-\r\n");
fwrite($fp, "\r\n");
 
// et la tu affiches les partis que le script est entrain de télécharger
 
while (!feof($fp))
  echo fgets($fp, 4096);
 
fclose($fp);
?>
Voilà, avec quelque chose comme ça (pense aux header que retourne le serveur distant qui sont à supprimer pour avoir un fichier correcte)
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 23h09   #9
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Alors effectivement, plus de problème de seek (well done), mais c'est bien S1 qui renvoit le fichier, pas S2.
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 23h36   #10
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
C'est le client qui demande à S1 de prendre sur S2
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 23h43   #11
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
oui, on est d'accord

mais comme tu le disais plus bas, je ne suis pas sur qu'il y ait de solution.
++
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 23h45   #12
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
tu veux que le client demande a S1 d'envoyé sur S2? je comprend plus tellement ce que tu veux?

tu peux faire un court descriptif de ton projet ou de l'objectif final du script que tu voudrais?
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 00h20   #13
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Les hypothèses sont les suivantes :
C est un client (navigateur Web)
S1 est un serveur HTTP + PHP (je suis admin dessus)
S2 est un serveur HTTP 1.1 (j'ai juste les droits de déposer des fichiers dessus).

- C se connect à S1 qui gère la couche applicative
- S1 sait que le fichier demandé est sur S2.
- A ce niveau, l'idéal serait que S2 réponde directement à C en renvoyant la partie du fichier concerné. Autrement dit, plus de trafic entre C et S1 (qui a joué un rôle d'intermédiaire)
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 00h29   #14
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
à non, ça c'est pas possible,
si tu veux télécharger des partis directement sur le S2, le client peut utilisé un programme tel que FlashGet, ou alors installé EasyPHP pour y installé le script directement...

Je pense que c'est les seuls moyen pour ne plus à avoir à passé par S1.
(ou alors un truc plus complexe, mais je sais pas si c'est possible, d'usurper plus ou moins les requêtes de C et de S2 pour les mettre en synchronisation, mais ça, c'est pure théorie je pense et probablement impossible (non, c'est pas possible, en faite...))

Je pense que l'intermédiaire est pas forcement un mauvaise chose (proxy)
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 00h36   #15
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
oauip, je partage ton point de vue.
ç
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 00h38   #16
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
oauip, je partage ton point de vue.
Dom, ça aurait été la cerise sur le gâteau.

Encore merci !
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2006, 10h24   #17
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
de rien
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h49.


 
 
 
 
Partenaires

Hébergement Web