2010-03-23 16 views
3

J'utilise wget dans un script php et j'ai besoin d'obtenir le nom du fichier téléchargé.wget retourner le nom de fichier téléchargé

Par exemple, si je tente

<?php 
    system('/usr/bin/wget -q --directory-prefix="./downloads/" http://www.google.com/'); 
?> 

je vais obtenir un fichier index.html dans le répertoire de téléchargement.

EDIT: La page ne sera pas toujours google cependant, la cible peut être une image ou une feuille de style, donc j'ai besoin de trouver le nom du fichier qui a été téléchargé.

Je voudrais avoir quelque chose comme ceci:

<?php 
    //Does not work: 
    $filename = system('/usr/bin/wget -q --directory-prefix="./downloads/" http://www.google.com/'); 
    //$filename should contain "index.html" 
?> 

Répondre

0

Je fini par utiliser php pour trouver le fichier le plus récemment mis à jour dans le répertoire en utilisant le code suivant:

<?php 
system('/usr/bin/wget -q --directory-prefix="./downloads/" http://www.google.com/'); 
$dir = "./downloads"; 

$newstamp = 0; 
$newname = ""; 
$dc = opendir($dir); 
while ($fn = readdir($dc)) { 
    # Eliminate current directory, parent directory 
    if (ereg('^\.{1,2}$',$fn)) continue; 
    $timedat = filemtime("$dir/$fn"); 
    if ($timedat > $newstamp) { 
    $newstamp = $timedat; 
    $newname = $fn; 
    } 
} 
// $newname contains the name of the most recently updated file 
// $newstamp contains the time of the update to $newname 
?> 
3

Peut-être que une sorte de tricherie, mais pourquoi pas:

  • vous décider le nom du fichier qui wget devrait créer
  • indiquer à wget que le téléchargement doit être effectué dans ce fichier
  • lorsque le téléchargement est terminé, utilisez ce fichier - comme vous connaissez déjà le nom.

Découvrez l'option -O de wget ;-)


Par exemple, l'exécution de cette commande à partir de la ligne:

wget 'http://www.google.com/' -O my-output-file.html 

crée un fichier appelé my-output-file.html.

+0

+1 - Résolution des problèmes entraîne souvent vous demander si vous résolvez le problème droit :) Bon –

+0

solution, mais j'aurais dû préciser que la cible de wget peut être une image ou une feuille de style, ou tout autre fichier. J'ai mis à jour la question pour refléter cela. – Matthew

1

si votre exigence est simple comme juste de google.com, puis le faire dans PHP

$data=file_get_contents('http://www.google.com/'); 
file_put_contents($data,"./downloads/output.html"); 
+0

Semble la meilleure réponse à moi - c'est-à-dire appeler le fichier ce que vous voulez, plutôt que d'avoir à obtenir le nom du fichier, et éviter d'exécuter des scripts shell à partir de PHP. Pour savoir si le fichier est css, html, etc., entrez la chaîne Content-Type automatiquement dans le tableau $ http_reponse_header. – fred2

0

Sur Linux comme les systèmes que vous pouvez faire:

system('/usr/bin/wget -q --directory-prefix="./downloads/" http://www.google.com/'); 
$filename = system('ls -tr ./downloads'); // $filename is now index.html 

Cela fonctionne s'il n'y a pas d'autre création de processus fichier dans le répertoire ./downloads.

+1

avez-vous vraiment besoin d'appeler le système 'ls' pour faire la liste des répertoires en PHP? :) Qu'en est-il de 'readdir()' ou 'glob()' propre à PHP ' – ghostdog74

+0

J'ai fini par faire quelque chose de similaire, mais j'ai évité l'appel système. Pour obtenir le dernier fichier mis à jour, j'ai utilisé ce code: 'code' $ dir ="./ téléchargements "; $ newstamp = 0; $ newname = ""; $ dc = opendir ($ dir); while ($ fn = readdir (dc $)) { # Éliminez le répertoire courant, répertoire parent if (ereg ('^ \. {1,2} $', $ fn)) continue; $ timedat = filemtime ("$ rep/$ fn"); if ($ timedat> $ newstamp) { $ newstamp = $ timedat; $ newname = $ fn; } } – Matthew

+0

Le code est sorti foiré, aurait dû être une réponse de toute façon, alors je l'ai ajouté comme réponse aussi. – Matthew