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 18/12/2006, 15h37   #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 fseek sur fichiers distants

Bonjour,

Selon la doc, on ne peut pas utiliser fseek sur un fichier distant ouvert avec fopen :

Citation:
May not be used on file pointers returned by fopen() if they use the "http://" or "ftp://" formats.
Code :
fopen("http://www.monsite.com/monfichier.txt");

Y a-t-il une autre façon de procéder car je suis carrément bloqué.
Par avance, merci pour les réponses.

PS : j'ai tous les droits sur le serveur web hébergeant ces fichiers auxquels je veux accéder.

++
Xris
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 15h43   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
tu as besoin de ça pour faire quoi ? donne nous plus de détails
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 16h04   #3
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
Code :
$open = fopen("http://www.monsite.com/monfichier.txt", 'rb');
il faut ouvrir en lecture et le mieux c'est aussi en binary :p
ensuite tu le traite comme un fichier classique:
Code :
1
2
3
4
5
while (!feof($open))
{
  echo fgets($open, 1204);
}
fclose($open);
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 16h05   #4
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Salut,

J'en ai besoin pour me déplacer dans un fichier, en l'occurence, un fichier mp3, et ainsi, commencer directement la lecture à un timecode donné.
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 16h08   #5
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Citation:
Envoyé par juJuv51
il faut ouvrir en lecture et le mieux c'est aussi en binary :p
ensuite tu le traite comme un fichier classique
Merci pour la précision, mais dans le code que tu mentionnes, tu lis le fichier depuis le début, pas en partant d'un offset.
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 16h12   #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
le problème avec fseek sur un fichier distant, c'est qu'il faut le téléchargé avant de pouvoir le traité à un endroit donné, je te conseil plus d'utilisé les entêtes HTTP range qui permette si le serveur le permet,
le téléchargement à un endroit précis du fichier.

Pour ça il faut que tu fasses un script qui fait un echo des donnée reçu après avoir fait un range

merci flashget:


Voilà les informations que tu dois envoyé au serveur pour obtenir certaine zone du fichier distant

Alors il faut que tu utilise CURL ou alors fsockopen
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 16h58   #7
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
juJuv51,

Merci pour ta réponse.
http range semble être une très bonne approche, d'autant plus que le serveur est un serveur HTTP 1.1, et donc à priori compatible.

Je vais donc jeter un oeil à cette implémentation, si tu as des liens, je suis preneur.
Merci
++
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h05   #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
Sur Google:
range: byte php

Sinon, fait attention à ne pas confondre avec Content-Range qui lui permet l'envoye à des bytes précis.

Je n'ai pas de script ou de liens (sauf pour Content-Range qui remonte à l'époque ou je faisait un script qui permettait de limité les téléchargements mais aussi de reprendre les téléchargements)
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h12   #9
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Je prends d'autant plus que c'est sans doute content-range qui m'intéresse, dans la mesure où je veux atteindre un octet précis, et commencer la lecture à cette position.
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h15   #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
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
if(isset($_GET["file"])){$file = $_GET["file"]; }
 
function dl_file_resume($file){
 
  //First, see if the file exists
  if (!is_file($file)) { die("<b>404 File not found!</b>"); }
 
  //Gather relevent info about file
  $len = filesize($file);
  $filename = basename($file);
  $file_extension = strtolower(substr(strrchr($filename,"."),1));
  $ctype="application/force-download";
 
 
  //Begin writing headers
  header("Cache-Control:");
  header("Cache-Control: public");
 
//Use the switch-generated Content-Type
header("Content-Type: $ctype");
//if your filename contains underscores, you can replace them with spaces
header("Content-disposition: attachment; filename=$filename");
header($header );
header("Accept-Ranges: bytes");
header("Content-Transfer-Encoding: binary");
$size=filesize($file);
//check if http_range is sent by browser (or download manager)
if(isset($_SERVER['HTTP_RANGE'])) {
list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
//if yes, download missing part
 str_replace($range, "-", $range);
 $size2=$size-1;
 $new_length=$size2-$range;
 header("HTTP/1.1 206 Partial Content");
 header("Content-Length: $new_length");
 header("Content-Range: bytes $range$size2/$size");
}else{
$size2=$size-1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: ".$size2);
}
//open the file
$fp=fopen("$file","r");
//seek to start of missing part
fseek($fp,$range);
//start buffered download
while(!feof($fp)){
//reset time limit for big files
set_time_limit(0);
print(fread($fp,1024*8));
 flush();
}
fclose($fp);
  exit;
}
 
dl_file_resume($file);
?>
Voilà
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h23   #11
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
super, merci !

Une question : je vois le test concernant l'existence de la variable $_SERVER['HTTP_RANGE'].

C'est donc à moi de la gérer, mais j'ai du mal à voir comment.
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h30   #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
elle est active si ton serveur reçoi une demande de rangeage, c'est à dire
si la personnes demande certaine zone du fichier.

mais toi, je pense qu'il te faut plutôt travaillé avec Range tout court :p
tu veux avoir accès à une certaine zone du fichier distant?
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h34   #13
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Citation:
Envoyé par juJuv51
mais toi, je pense qu'il te faut plutôt travaillé avec Range tout court :p
tu veux avoir accès à une certaine zone du fichier distant?
Oui, l'idée est effectivement de reproduire le comportement du fseek, mais avec un fichier distant.
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 17h38   #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
dans le script au dessus ne te seras pas utile (pas du bon coté ;p)

http://209.85.135.104/search?q=cache...r&ct=clnk&cd=2
http://209.85.135.104/search?q=cache...r&ct=clnk&cd=6
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 22h31   #15
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
effectivement, c'est pas du bon côté.
Je regarde les liens, merci
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2006, 22h34   #16
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
Franchement, je pense que tu as pas mal de boulot,
si tu peux être plus précis dans ce que tu veux faire exactement?
je pourrais peut être t'aider...
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 02h34   #17
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
hé ben écoute, avec grand plaisir, car comme tu le dis, c'est pas gagné.

L'idée est de pouvoir streamer des fichiers mp3 en php, avec la possibilité d'aller n'importe où dans le fichier (par exemple, sur une compile de 2 heures, je peux directement aller au morceau 33).
C'est moins lourd qu'un serveur de stream.

Si le fichier est local par rapport au serveur Web, le stream fonctionne impéccablement.

Pour cela, j'utilise une combinaison de fopen, fseek et fread :
Code :
1
2
3
4
5
6
7
$fh = fopen($file, "rb");
fseek($fh, $position);
 
while (!feof($fh)) {
	print (@fread($fh, 512));
}
fclose($fh);

Par extension, je souhaite maintenant pouvoir streamer un fichier mp3 distant en suivant la même logique.
Et là ... c'est pas gagné.

Un coup de main est donc plus que bienvenu.
++
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 11h05   #18
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
il faut établir directement l'endroit (en byte) ou tu veux allez dans le fichier,
pour que le téléchargement commence à l'endroit où tu veux commencé l'écoute.

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
25
<?php
if ($_POST)
{
  $header[] = "Range: bytes=".$_POST['byte']."-\r\n";
  $header[] = "Cache-Control: no-cache\r\n";
  $header[] = "Connection: close\r\n";
 
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $_POST['url']);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
  curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  echo curl_exec($ch);
}
else
{
?>
<form action="" method="post">
URL?  <input type="text" name="url" />
Bytes?  <input type="text" name="byte" />
  <input type="submit" value="Télécharger" />
</form>
<?php
}
?>
j'ai pas testé, mais je pense qu'un truc comme ça devrait te donner la base
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 15h26   #19
Invité régulier
 
Inscription : janvier 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 52
Points : 7
Points : 7
Merci.

ça fonctionne nickel, non pas avec le code que tu viens de poster, mais avec celui des liens.
Une légère adptation et ça roule.

Faut maintenant que je fasse un peu de ménage dans le code...
Xris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2006, 15h31   #20
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, celui que j'ai posté est avec cURL, mais le problème c'est que j'ai du oublier des trucs désolé

mais je suis ravis de voire que tu n'as plus à adapté du code
je pense que maintenant le boulot commence tu as tout dans les mains

je te souhaite une bonne chance
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 09h52.


 
 
 
 
Partenaires

Hébergement Web