Я пытаюсь выполнить этот запрос на php, чтобы загрузить последний источник из моего личного хранилища Bitbucket:
curl --digest --user user:pass https://bitbucket.org/user/repo/get/tip.zip -o test.zip
в командной строке это нормально, файл скачать идеально, но в php не работает, этот мой php-код:
$out = fopen('test.zip', 'w+'); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_setopt($ch, CURLOPT_USERPWD, 'user:pass'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FILE, $out); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_NOBODY, false); curl_setopt($ch, CURLOPT_URL, 'https://bitbucket.org/user/repo/get/tip.zip'); curl_exec($ch);
Это ответ, логин его недействителен и сервер перенаправляется на страницу входа:
Error CURL: '' Error number: 0 Array ( [url] => https://bitbucket.org/account/signin/?next=/user/repo/get/tip.tar.gz [content_type] => text/html; charset=utf-8 [http_code] => 200 [header_size] => 1099 [request_size] => 194 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 1 [total_time] => 1.055465 [namelookup_time] => 1.5E-5 [connect_time] => 0.102969 [pretransfer_time] => 0.216164 [size_upload] => 0 [size_download] => 10049 [speed_download] => 9520 [speed_upload] => 0 [download_content_length] => 10049 [upload_content_length] => 0 [starttransfer_time] => 0.527512 [redirect_time] => 0.527519 [redirect_url] => )
Кто-нибудь знает, как я могу решить свою проблему? Большое спасибо!!!
Этот код работал отлично для меня:
define('USERNAME','username'); define('PASSWORD','password'); function download($url, $destination) { try { $fp = fopen($destination, "w"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $resp = curl_exec($ch); // validate CURL status if(curl_errno($ch)) throw new Exception(curl_error($ch), 500); // validate HTTP status code (user/password credential issues) $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status_code != 200) throw new Exception("Response with Status Code [" . $status_code . "].", 500); } catch(Exception $ex) { if ($ch != null) curl_close($ch); if ($fp != null) fclose($fp); throw new Exception('Unable to properly download file from url=[' + $url + '] to path [' + $destination + '].', 500, $ex); } if ($ch != null) curl_close($ch); if ($fp != null) fclose($fp); } download('https://bitbucket.org/brunobraga/playground/get/tip.tar.gz', '/tmp/test.tar.gz');
Я дал ему обычную «20-минутную возиться», и я буду проклят, работая с CURL и моим клиентом OSX HTTP, это, похоже, не хочет сдвигаться с места, и я успешно работал с HTTP Digest и Curl в прошлом ,
Одно из предложений: если командная строка работает, то почему бы не использовать команду? Поддерживает ли ваш производственный сервер exec()
?
У меня была такая же проблема; удалил все буквы, отличные от буквенно-цифровых символов, из пароля, и это сработало! Не знаю, почему.
Я надеюсь, что это помогает.