2010-08-28 3 views
0

Im essayant de télécharger un fichier avec php qui se trouve sur un serveur distant, et n'ayant pas de chance. J'ai essayé d'utiliser fopen, get_file_contents, mais rien n'a fonctionné.php télécharger le fichier à partir du serveur distant, à partir de l'URL de téléchargement avec les en-têtes

Je passe dans une URL de téléchargement, ce qui n'est pas l'emplacement exact du fichier, c'est "l'URL de téléchargement" du fichier, qui oblige alors le navigateur à télécharger. Donc, en pensant que c'est pourquoi le fichier fopen et file_get_contents échoue, quelqu'un peut-il me dire ce que je dois faire pour télécharger un fichier à partir d'une URL avec des en-têtes définis pour forcer le téléchargement de fichiers.

Toute aide grandement appréciée!

+4

S'il vous plaît ne nous dites en aucun cas ce que "ne pas avoir de chance" et "ne fonctionne pas" signifie exactement. Cela nous enlèverait la joie de deviner! –

+0

haha ​​j'aime celui-là: D –

Répondre

3

Bien que techniquement pas un double, cela a été demandé sur le SO avant: How to get redirecting url link with php from bit.ly

Votre problème est que file_get_contents ne suit pas les redirections. Voir la réponse liée pour une solution.

+0

merci l'homme, vous venez de me sauver peut-être des heures plus de confusion et de frustration! est parfaitement logique maintenant. – thrice801

1

même si vous n'avez pas formulé votre question clairement, je pense que je sais ce que vous voulez dire. essayer cette fonction tirée de php.net commentaires

ne l'a pas testé mais il semble bon et semble suivre les redirections html en-tête ainsi que les redirections méta et javascript vers le fichier.

<?php 

/*================================== 
Get url content and response headers (given a url, follows all redirections on it and returned content and response headers of final url) 

@return array[0] content 
     array[1] array of response headers 
==================================*/ 
function get_url($url, $javascript_loop = 0, $timeout = 5) 
{ 
    $url = str_replace("&amp;", "&", urldecode(trim($url))); 

    $cookie = tempnam ("/tmp", "CURLCOOKIE"); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1"); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_ENCODING, ""); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); # required for https urls 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10); 
    $content = curl_exec($ch); 
    $response = curl_getinfo($ch); 
    curl_close ($ch); 

    if ($response['http_code'] == 301 || $response['http_code'] == 302) 
    { 
     ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1"); 

     if ($headers = get_headers($response['url'])) 
     { 
      foreach($headers as $value) 
      { 
       if (substr(strtolower($value), 0, 9) == "location:") 
        return get_url(trim(substr($value, 9, strlen($value)))); 
      } 
     } 
    } 

    if ( (preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value)) && 
      $javascript_loop < 5 
    ) 
    { 
     return get_url($value[1], $javascript_loop+1); 
    } 
    else 
    { 
     return array($content, $response); 
    } 
} 

?> 
Questions connexes