загрузка всех файлов в каталог с помощью cURL

я использую cURL, чтобы попытаться загрузить все файлы в определенном каталоге.

вот как выглядит мой список файлов:

enter image description here

Я попытался сделать в сценарии bash:iiumlabs.[].csv.pgp и iiumlabs* и я думаю, что curl-это не Шаблоны.

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

вопрос: как загрузить этот каталог файлов с помощью cURL?

5 ответов


ОК, учитывая, что вы используете Windows, Самый простой способ сделать это-использовать стандартный в комплекте с ним. Я основываю следующее решение на Windows XP, надеясь, что оно также будет работать (или с небольшими изменениями) в других версиях.

прежде всего, вам нужно создать пакетный файл (скрипт) для ftp программа, содержащая инструкции для нее. Назовите его, как хотите, и положите в него:

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

open ftp.myftpsite.com
login
pass
mget *
quit

первая строка открывает соединение с ftp-сервер на ftp.myftpsite.com. В двух следующих строках указывается логин и пароль, который будет запрашивать ftp (replace login и pass только с логином и паролем, без каких-либо ключевых слов). Затем вы используете mget * чтобы получить все файлы. Вместо *, вы можете использовать любой шаблон. Наконец, вы используете quit закрыть ftp программа без интерактивной подсказки.

Если вам нужно сначала ввести какой-то каталог, добавьте до mget. Это должно быть довольно простой.

наконец, напишите этот файл и запустите ftp такой:

ftp -i -s:yourscript

здесь -i отключает интерактивность (запрашивает перед загрузкой файлов) и -s указывает путь к созданному скрипту.


к сожалению, передача файлов по SSH изначально не поддерживается в Windows. Но в этом случае вы, вероятно, захотите использовать шпаклевка в любом случае инструменты. Особый интерес в этом случае будет pscp который является практически шпаклевкой счетчик-часть openssh .

синтаксис похож на синтаксис copy команда, и она поддерживает подстановочные знаки:

pscp -batch login@mysshsite.com:iiumlabs* .

если вы аутентифицируетесь с помощью ключевого файла, вы должны передать его с помощью -i path-to-key-file. Если вы используете пароль, -pw pass. Он также может повторно использовать сеансы, сохраненные с помощью шпатлевки, используя load


если вы не обязаны завиваться, вы можете использовать команды wget в рекурсивном режиме, но ограничивая его одним уровнем рекурсии, попробуйте следующее;

wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
  • --no-parent: никогда не поднимайтесь в родительский каталог при рекурсивном извлечении.
  • --level=depth: укажите максимальную глубину рекурсии. Максимальная глубина по умолчанию-пять слоев.
  • --no-directories : не создавайте иерархию каталогов при получении рекурсивно.

О, у меня есть как раз то, что вам нужно!

$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 />";
}

и функции isFtpUp и saveFtpFile следующим образом:

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

curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_USERPWD, "anonymous:your@email.com");
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 = "your@email.com";
$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;
}

EDIT:

это PHP-скрипт. сохраните его в качестве .php-файл, поместите его на свой веб-сервер, измените $ip на адрес(не обязательно ip) ftp-сервера, с которого вы хотите загружать файлы, создайте каталог с именем downloadedFiles в том же каталоге, что и этот файл.


Как насчет чего-то вроде этого:

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

вот как я сделал, чтобы загрузить быстро с cURL (я не уверен, сколько файлов он может загрузить, хотя):

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!

почему пропустить=2 ? Чтобы получить поездку . и ..

почему delims= ? Для поддержки имен с пробелами