2010-04-25 7 views
1

J'ai une fonction qui sera transmise dans un lien. Le lien est à une image distante. J'ai pensé que je pourrais simplement utiliser l'extension du fichier dans l'URL pour déterminer le type d'image mais certaines URL n'auront pas d'extensions dans l'URL. Ils ont probablement juste pousser les en-têtes vers le navigateur et par conséquent je n'ai pas d'extension à analyser à partir de l'URL.Télécharger le fichier distant

Comment puis-je tester si l'URL a une extension et si non, puis lire les en-têtes pour déterminer le type de fichier? Est-ce que je complique les choses ici? Y a-t-il un moyen plus facile de faire cela? Je me sers de Codeigniter peut-être qu'il y a quelque chose de déjà construit pour le faire?

Tout ce que je veux vraiment faire est de télécharger une image à partir d'une URL avec l'extension correcte.

C'est ce que j'ai jusqu'à présent.

function get_image($image_link){ 

    $remoteFile = $image_link; 

    $ext = ''; //some URLs might not have an extension 

    $file = fopen($remoteFile, "r"); 


    if (!$file) { 

     return false; 

    }else{ 

     $line = ''; 

     while (!feof ($file)) { 

      $line .= fgets ($file, 4096); 

     } 

     $file_name = time().$ext; 

     file_put_contents($file_name, $line); 

    } 

    fclose($file); 

} 

Merci à tous pour toute aide

Répondre

3

Vous ne voulez jamais activer l'extension de fichier. Par exemple, tous les fichiers texte ASCII n'auront pas ".txt", et il y aura toujours le ".jpg" amusant et le ".jpeg". Au lieu de cela, activez l'en-tête Content-Type avec lequel le serveur Web répond. (Voir http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17).

Certains serveurs Web respecteront également l'en-tête Accept (voir http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1). Donc, si vous savez que vous voulez seulement des fichiers image PNG, alors envoyez Accept: image/png. Si le serveur le respecte, alors sa réponse sera beaucoup plus petite que l'envoi de l'ensemble du fichier non désiré sur la connexion réseau. Cependant, étant donné que tous les serveurs Web ne le font pas correctement (le cas échéant), assurez-vous de toujours activer l'en-tête de réponse Content-Type. C'est juste une chose économisant la bande passante.

Vous pouvez également envoyer Accept: image/* pour obtenir n'importe quel type d'image.

Cheers.

0

Vous devez toujours utiliser l'en-tête de réponse Content-Type pour déterminer le type de données reçues. De cela, vous pouvez définir l'extension correcte. Les URL n'ont pas d'extensions, et vous ne devriez pas compter sur quoi que ce soit après une période en cours.

0

Vous ne pourrez pas lire les en-têtes à l'aide de fsock/fread ou même de file_get_contents. Tout cela est caché en arrière-plan et mis au rebut lorsque la récupération se termine. Vous devrez utiliser les fonctions CURL et configurer une session HTTP GET appropriée en utilisant celle-ci, à partir de laquelle vous pourrez récupérer tous les détails du transfert.

Questions connexes