web-dev-qa-db-fra.com

télécharger tous les fichiers d'un répertoire avec cURL

J'utilise cURL pour essayer de télécharger tous les fichiers d'un certain répertoire.

voici à quoi ma liste de fichiers ressemble:

enter image description here

J'ai essayé de faire dans le script bash: iiumlabs.[].csv.pgp et iiumlabs* et je suppose que curl n'est pas très volumineux.

curl -u login:pass ftp.myftpsite.com/iiumlabs* -O

question: comment puis-je télécharger ce répertoire de fichiers en utilisant cURL?

OK, étant donné que vous utilisez Windows, le moyen le plus simple consiste à utiliser l'outil ftp standard fourni avec celui-ci. Je base la solution suivante sur Windows XP, en espérant que cela fonctionnera aussi bien (ou avec des modifications mineures) sur d’autres versions.

Tout d’abord, vous devez créer un fichier de commandes (script) pour le programme ftp, contenant les instructions correspondantes. Nommez-le comme vous voulez et mettez-le dedans:

curl -u login:pass ftp.myftpsite.com/iiumlabs* -O

open ftp.myftpsite.com
login
pass
mget *
quit

La première ligne ouvre une connexion au serveur FTP à ftp.myftpsite.com. Les deux lignes suivantes spécifient le login et le mot de passe que ftp demandera (remplacez login et pass par seulement le login et le mot de passe, sans mot-clé). Ensuite, vous utilisez mget * pour obtenir tous les fichiers. Au lieu du *, vous pouvez utiliser n'importe quel caractère générique. Enfin, vous utilisez quit pour fermer le programme ftp sans invite interactive.

Si vous devez d'abord entrer un répertoire, ajoutez une commande cd avant mget. Cela devrait être assez simple.

Enfin, écrivez ce fichier et exécutez ftp comme ceci:

ftp -i -s:yourscript

-i désactive l'interactivité (demander avant de télécharger des fichiers) et -s spécifie le chemin d'accès au script que vous avez créé.


Malheureusement, le transfert de fichiers sur SSH n'est pas pris en charge de manière native dans Windows. Mais dans ce cas, vous voudrez probablement utiliser PuTTY tools de toute façon. Celui qui présente un intérêt particulier pour ce cas serait pscp, qui est pratiquement le pendant PuTTY de la commande openssh scp.

La syntaxe est similaire à la commande copy et prend en charge les caractères génériques:

pscp -batch [email protected]:iiumlabs* .

Si vous vous authentifiez à l'aide d'un fichier de clé, vous devez le transmettre à l'aide de -i path-to-key-file. Si vous utilisez un mot de passe, -pw pass. Il peut également réutiliser des sessions enregistrées en utilisant PuTTY, en utilisant l'argument load -load your-session-name.

9
Michał Górny

Si vous n'êtes pas lié à curl, vous pouvez utiliser wget en mode récursif mais en le limitant à un niveau de récursivité, essayez ce qui suit:

wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
  • --no-parent: Ne montez jamais dans le répertoire parent lors de la récupération récursive.
  • --level=depth: spécifiez le niveau de profondeur maximum de la récursivité. La profondeur maximale par défaut est de cinq couches.
  • --no-directories: Ne créez pas de hiérarchie de répertoires lors de la récupération récursive.
32
kkeller

Qu'en est-il quelque chose comme ceci:

for /f %%f in ('curl -s -l -u user:pass ftp://ftp.myftpsite.com/') do curl -O -u user:pass ftp://ftp.myftpsite.com/%%f
2
Robi

Oh, j'ai juste ce dont tu as besoin!

$Host = "ftp://example.com/dir/";
$savePath = "downloadedFiles";
if($check = isFtpUp($Host)){

    echo $ip." -is alive<br />";

    $check = trim($check);
    $files = explode("\n",$check);

    foreach($files as $n=>$file){
        $file = trim($file);
        if($file !== "." || $file !== ".."){
            if(!saveFtpFile($file, $Host.$file, $savePath)){
                // downloading failed. possible reason: $file is a folder name.
                // echo "Error downloading file.<br />";
            }else{
                echo "File: ".$file." - saved!<br />";
            }
        }else{
            // do nothing
        }
    }
}else{
    echo $ip." - is down.<br />";
}

et les fonctions isFtpUp et saveFtpFile sont les suivantes:

function isFtpUp($Host){
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $Host);
curl_setopt($ch, CURLOPT_USERPWD, "anonymous:[email protected]");
curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);

$result = curl_exec($ch);

return $result;

}

function saveFtpFile( $targetFile = null, $sourceFile = null, $savePath){

// function settings
set_time_limit(60);
$timeout = 60;
$ftpuser = "anonymous";
$ftppassword = "[email protected]";
$savePath = "downloadedFiles"; // should exist!
$curl = curl_init();
$file = @fopen ($savePath.'/'.$targetFile, 'w');

if(!$file){
    return false;
}

curl_setopt($curl, CURLOPT_URL, $sourceFile);
curl_setopt($curl, CURLOPT_USERPWD, $ftpuser.':'.$ftppassword);

// curl settings

// curl_setopt($curl, CURLOPT_FAILONERROR, 1);
// curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_FILE, $file);

$result = curl_exec($curl);


if(!$result){
    return false;
}

curl_close($curl);
fclose($file);

return $result;
}

MODIFIER:

c'est un script php . enregistrez-le sous un fichier .php, mettez-le sur votre serveur web, remplacez $ ip par l'adresse (ne doit pas être ip) du serveur ftp à partir duquel vous souhaitez télécharger des fichiers, créez un répertoire nommé même répertoire que ce fichier.

1
Prasanth

Voici comment j'ai fait pour télécharger rapidement avec cURL (je ne sais pas combien de fichiers il peut télécharger):

setlocal EnableDelayedExpansion

cd where\to\download

set STR=
for /f "skip=2 delims=" %%F in ('P:\curl -l -u user:password ftp://ftp.example.com/directory/anotherone/') do set STR=-O "ftp://ftp.example.com/directory/anotherone/%%F" !STR!
path\to\curl.exe -v -u user:password !STR!

Pourquoi skip = 2 ? Pour piloter . et ..

Pourquoi delims = ? Prendre en charge les noms avec des espaces

1
kiwixz

Vous pouvez utiliser un script comme ceci pour mac:

for f in $(curl -s -l -u user:pass ftp://your_ftp_server_ip/folder/) 
 do curl -O -u user:pass ftp://your_ftp_server_ip/folder/$f 
done
0
M.Selman SEZGİN