Загрузите и сохраните удаленный файл, защищенный паролем, с помощью PHP

Когда я ввожу адресную строку любого браузера: https://username:[email protected]/Protected/Export/MyFile.zip файл загружается нормально.

Теперь я пытаюсь сделать то же самое с PHP: подключиться к удаленному защищенному паролем файлу и загрузить его в локальный каталог (например, ./downloads/).

Я пробовал несколько способов с PHP (ssh2_connect(), copy(), fopen(),...), но ни один из них не увенчался успехом.

$originalConnectionTimeout = ini_get('default_socket_timeout');
ini_set('default_socket_timeout', 3); // reduces waiting time

$connection = ssh2_connect("www.example.com");

// use $connection to download the file

ini_set('default_socket_timeout', $originalConnectionTimeout);
if($connection !== false) ssh2_disconnect($connection);

Вывод: «Предупреждение: ssh2_connect(): невозможно подключиться к www.example.com через порт 22 [..]»

Как я могу загрузить этот файл с помощью PHP и сохранить его в локальном каталоге?


person Community    schedule 16.08.2019    source источник


Ответы (2)


При доступе к URL-адресу, например

https://username:[email protected]/Protected/Export/MyFile.zip

вы используете базовую аутентификацию HTTP, которая отправляет HTTP-заголовок Authorization. Это не имеет ничего общего с ssh, поэтому вы не можете использовать ssh2_connect().

Чтобы получить доступ к этому с помощью php, вы можете использовать curl:

$user = 'username';
$password = 'password';
$url = 'https://www.example.com/Protected/Export/MyFile.zip';

$curl = curl_init();
// Define which url you want to access
curl_setopt($curl, CURLOPT_URL, $url);

// Add authorization header
curl_setopt($curl, CURLOPT_USERPWD, $user . ':' . $password);

// Allow curl to negotiate auth method (may be required, depending on server)
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

// Get response and possible errors
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);

// Save file
$file = fopen('/path/to/file.zip', "w+");
fputs($file, $reponse);
fclose($file);
person arkuuu    schedule 16.08.2019
comment
С правильными учетными данными и URL-адресом я получаю ошибку 401 Unauthorized: Unauthorized Этот сервер не может проверить, что вы авторизованы для доступа к запрошенному документу. Либо вы указали неверные учетные данные (например, неверный пароль), либо ваш браузер не понимает, как предоставить требуемые учетные данные. Сервер Apache/2.4.10 (Debian) на www.xxxxxx.tld Порт 80 - person ; 16.08.2019
comment
@ Frank1999 Не могли бы вы попробовать curl_setopt($ch, CURLOPT_USERPWD, "$user:$password"); вместо строки curl_setopt($curl, CURLOPT_HTTPHEADER ...)? Как и в этом ответе - person arkuuu; 16.08.2019
comment
И если это все еще не работает, попробуйте также добавить curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);. Это позволит curl договориться о том, какой способ аутентификации работает, а не просто использовать Basic Auth. - person arkuuu; 16.08.2019
comment
Только что попробовал CURLOPT_USERPWD, но все еще не авторизован. Также обратите внимание, что $ch должен быть $curl (небольшая проблема с копированием и вставкой). Я продолжу попытки со следующим предложением (curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);). - person ; 16.08.2019
comment
Добавление curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); казалось, решил проблему. - person ; 16.08.2019
comment
ошибка в curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $password); // МЕНЯЕМ ИМЯ ПЕРЕМЕННОЙ НА $curl - person Michal - wereda-net; 15.07.2021

Это не протокол SSH. Это может быть что-то вроде Аутентификация Apache HTTP. Вы можете следовать и попробовать это руководство: HTTP-аутентификация с PHP

person cosmos    schedule 16.08.2019