загрузка всех файлов в каталог с помощью cURL
я использую cURL, чтобы попытаться загрузить все файлы в определенном каталоге.
вот как выглядит мой список файлов:
Я попытался сделать в сценарии 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= ? Для поддержки имен с пробелами