IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

fseek sur fichiers distants


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut fseek sur fichiers distants
    Bonjour,

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

    May not be used on file pointers returned by fopen() if they use the "http://" or "ftp://" formats.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    tu as besoin de ça pour faire quoi ? donne nous plus de détails

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!feof($open))
    {
      echo fgets($open, 1204);
    }
    fclose($open);

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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é.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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
    ++

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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à

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    effectivement, c'est pas du bon côté.
    Je regarde les liens, merci

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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...

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    ++

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    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...

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Points : 303
    Points
    303
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] Tri sur fichier distant : Possible ou pas ?
    Par Rapheux dans le forum Excel
    Réponses: 0
    Dernier message: 27/03/2014, 12h37
  2. Réponses: 2
    Dernier message: 13/05/2009, 11h10
  3. [FTP] fopen sur fichier distant bloqué
    Par benton_fr dans le forum Langage
    Réponses: 2
    Dernier message: 23/04/2008, 13h33
  4. Tester et récupérer des infos sur fichier distant
    Par cybertj dans le forum Langage
    Réponses: 2
    Dernier message: 17/05/2006, 10h18
  5. existence d'un fichier sur serveur distant
    Par Fabouney dans le forum Programmation et administration système
    Réponses: 3
    Dernier message: 17/01/2006, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo