2011-02-09 21 views
5

Intenté descargar archivos en un directorio protegido htaccess usando php y curl. Este es mi código:Descargar archivos protegidos htaccess usando PHP y 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); 

Pero este código no hace nada ... ¿cómo puedo iniciar la descarga de file.pdf?

¡Gracias!

Además, si me echo $ salida, me sale esto:

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

¿Qué quiere decir "no hace nada"? ¿Cuál es el resultado y cuáles son los errores devueltos en '$ info'? –

+0

No devuelve ningún error, en $ info devuelve 200 OK, pero la descarga no inicia ... – nmarti

Respuesta

2

hay una opción de CURLOPT_BINARYTRANSFER que parece que falta. La salida que pegó es $info no $output por cierto. Muestra que la descarga ocurrió, download_content_length es 27369.

1

Si está intentando descargar un archivo, debe usar CURLOPT_FILE en lugar de hacer un RETURNTRANSFER = true. Eso escribirá los datos descargados en un archivo en su sistema directamente, sin inundar el espacio de memoria de PHP. Recuerde, PHP generalmente se ejecuta con un límite de memoria, y puede excederlo fácilmente descargando un archivo grande.

El uso de RETURNTRANSFER solo es útil si va a realizar un procesamiento en memoria de los datos transferidos, como cargar HTML en el sistema DOM para su análisis.

probar este lugar: trabaja

$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

Es bueno copiar el archivo en el servidor, pero quiero descargar el archivo en mi pc, o en el mi pc de usuarios – nmarti

+0

En ese caso, simplemente elimine completamente la transferencia de retorno. de forma predeterminada, Curl generará lo que descargue al cliente. –

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

Este código, simplemente tratado con Excel, Word y PDF.

Falta el código original curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);, los encabezados header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=file.pdf"); y el eco echo ($output);.

Gracias por sus respuestas, especialmente a chx por la opción CURLOPT_BINARYTRANSFER!

5

aquí es el código de trabajo, que cometió un error en la línea con: 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); 
Cuestiones relacionadas