2011-02-09 9 views
5

Próbowałem pobrać pliki w katalogu chronionym hasłem za pomocą php i curl. To jest mój kod:Pobierz pliki chronione htaccess przy użyciu PHP i CURL

$username = "MyUsername"; 
$password = "MyPassword"; 
$url = "http://www.example.com/private/file.pdf"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
$output = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

Ale ten kod nic nie robi ... jak mogę rozpocząć pobieranie pliku.pdf?

Dziękujemy!

Ponadto, jeśli echo $ wyjście, ja się tak:

Array ([url] => http://www.example.com/private/file.pdf [content_type] => application/pdf [http_code] => 200 [header_size] => 264 [request_size] => 116 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.007898 [namelookup_time] => 0.006777 [connect_time] => 0.006858 [pretransfer_time] => 0.006922 [size_upload] => 0 [size_download] => 27369 [speed_download] => 3465307 [speed_upload] => 0 [download_content_length] => 27369 [upload_content_length] => 0 [starttransfer_time] => 0.007839 [redirect_time] => 0) 
+1

Co to znaczy „nic nie robi”? Jakie są dane wyjściowe i jakie są błędy zwracane w '$ info'? –

+0

Nie zwraca żadnego błędu, w $ info zwraca 200 OK, ale pobieranie nie inicjuje ... – nmarti

Odpowiedz

2

Jest CURLOPT_BINARYTRANSFER opcja, która wydaje brakuje. Wklejone dane wyjściowe to $info, a nie $output. To pokazuje, pobieranie stało, download_content_length jest 27369.

1

Jeśli próbujesz pobrać plik, należy użyć CURLOPT_FILE zamiast robić RETURNTRANSFER = true. To zapisze pobrane dane do pliku bezpośrednio w systemie, bez powodzi pamięci PHP. Pamiętaj, że PHP zazwyczaj działa z limitem pamięci i możesz go łatwo przekroczyć, pobierając duży plik.

Używanie jest przydatne tylko wtedy, gdy zamierzasz przetwarzać przesyłane dane w pamięci, na przykład ładowanie HTML do systemu DOM w celu analizy składniowej.

Spróbuj to zamiast:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_FILE, "/name/of/file/to/write/to/on/your/machine"); 
$output = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 
+0

Dobrze jest skopiować plik na serwerze, ale chcę pobrać plik na moim komputerze lub w mój komputer użytkowników. – nmarti

+0

W takim przypadku po prostu całkowicie zrezygnuj z ponownego przesyłania. domyślnie curl wypisze wszystko, co pobiera do klienta. –

0
$username = "MyUsername"; 
$password = "MyPassword"; 
$url = "http://www.example.com/private/file.pdf"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
$output = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=file.pdf"); 
echo ($output); 

Ten kod działa, po prostu próbowałem z Excel, Word i dokument pdf.

Brakuje w oryginalnym kodzie curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);, nagłówków header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=file.pdf"); i echa echo ($output);.

Dzięki za odpowiedzi, specjalnie dla chx dla opcji CURLOPT_BINARYTRANSFER!

5

tutaj jest kod roboczych, popełnił błąd na linii z: curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);

$username = "MyUsername"; 
$password = "MyPassword"; 
$url = "http://www.example.com/private/file.pdf"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
$output = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=file.pdf"); 
echo ($output); 
Powiązane problemy