Curl devuelve 400 mal pedido (url con espacios)

Cuando uso la biblioteca de curl y trato de obtener una imagen de url obtengo 400 errores de solicitud errónea. Fundé que el problema es con la encoding de url. Pero en mi caso no funciona, porque mi url, es la ruta a la imagen en el lado del servidor, como

http://example.com/images/products/product 1.jpg 

Entiendo que los espacios de usuario en los archivos de nombres son una mala práctica, pero no es mi servidor y no creé esos archivos.

 $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, urlencode($url)); echo $ret = curl_exec($ch); 

Cuando uso la función urlencode – curl return http_code = 0

Actualizado

 $url = str_replace(' ', '+', $url); 

no funciona, el servidor devuelve un error 404

¿Tal vez esto funcione?

 $url = 'http://host/a b.img'; $url = str_replace(" ", '%20', $url); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); echo $ret = curl_exec($ch); 

Necesitas usar la función rawurlencode () :

 $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, rawurlencode($url)); echo $ret = curl_exec($ch); 

rawurlencode () debe ser siempre preferido. urlencode () solo se conserva para uso heredado. Para más detalles mira esta respuesta SO .

No puede urlencodificar toda la cadena porque eso codificará las barras diagonales y otras que necesita para permanecer sin codificar. Si los espacios son tu único problema, esto hará:

 str_replace(' ', '+', $url);