2012-04-25 33 views
10

Tôi cố gắng làm theo yêu cầu này trên php, để tải về các nguồn cuối cùng từ kho tin Bitbucket của tôi:yêu cầu Curl với tiêu hóa auth trong PHP để tải về Bitbucket kho tin

curl --digest --user user:pass https://bitbucket.org/user/repo/get/tip.zip -o test.zip 

trong dòng lệnh ok của nó, tải về tập tin hoàn hảo, nhưng trong php không làm việc, điều này mã php của tôi:

$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); 

Đây là phản ứng lại, đăng nhập không hợp lệ của nó và máy chủ chuyển hướng đến trang đăng nhập:

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] => 
) 

Bất cứ ai biết cách tôi có thể giải quyết vấn đề của mình? Cảm ơn bạn rất nhiều !!!

+0

có bạn đã cố gắng chỉ sử dụng xác thực BASIC từ cURL (trong PHP)? – ManseUK

+1

Xin chào, đừng làm việc với 'curl_setopt ($ ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);' và tôi đã thử mà không có tùy chọn 'CURLOPT_HTTPAUTH' và không phải –

+0

Xin chào, tôi vừa thử ví dụ của bạn và nó hoạt động ... Vì vậy, có thể bạn đã đánh máy tên tài khoản, mật khẩu hoặc repo của bạn? – Zombaya

Trả lời

1

Tôi đã đưa cho nó thông báo "20 phút tinker" và tôi sẽ bị nguyền rủa, làm việc với CURL và Máy khách HTTP OSX của tôi dường như không muốn nhúc nhích và tôi đã làm việc thành công với HTTP Digest và Curl trong quá khứ.

Một gợi ý: nếu dòng lệnh đang hoạt động thì tại sao không sử dụng lệnh? Máy chủ sản xuất của bạn có hỗ trợ exec() không?

+0

Tôi vừa kết thúc việc sử dụng 'exec()' vì tôi gặp vấn đề tương tự. Đó là khá bực bội, mặc dù, đặc biệt là nếu bạn không có quyền truy cập vào 'exec()'. Tôi đã xem xét tất cả và tôi không thể tìm thấy một giải pháp đáng tin cậy hoặc quan trọng hơn, lý do tại sao nó không hoạt động. – CWSpear

+0

Nếu bạn tìm thấy bình luận ở đây: -/ –

+0

Hah. Tôi đã có cùng một vấn đề, cho đến khi tôi nhận thấy rằng biến tên người dùng của tôi có chứa một dấu cách trước khi trích dẫn kết thúc, hoạt động tốt khi gọi qua exec() :) – demonkoryu

1

Tôi gặp vấn đề tương tự; đã xóa tất cả các ký tự không phải chữ và số khỏi mật khẩu và nó đã hoạt động! Không biết tại sao mặc dù.

Tôi hy vọng điều đó sẽ hữu ích.

6

Mã này đã làm việc tốt cho tôi:

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'); 
+0

Không có gì nhưng điều này làm việc cho tôi. Cảm ơn. –

+0

Tôi đã sử dụng tập lệnh này để tải xuống một tệp nhất định từ khu vực tải xuống. –

Các vấn đề liên quan