Curl возвращает 400 плохих запросов (url с пробелами)

Когда я использую библиотеку curl и пытаюсь получить изображение с url, я получаю 400 ошибок с ошибкой. Я основал эту проблему с кодировкой url. Но в моем случае это не работает, потому что мой url – это путь к изображению на стороне сервера – например,

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

Я понимаю, что пользовательские пространства в файлах имен – это плохая практика, но это не мой сервер, и я не создал эти файлы.

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

Когда я использую функцию urlencode – curl return http_code = 0

обновленный

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

не работает, ошибка возврата сервера 404.

Может ли это работать?

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

Вам нужно использовать функцию rawurlencode () :

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

Необязательно использовать rawurlencode () . urlencode () поддерживается только для использования устаревшим способом. Для более подробной информации смотрите этот ответ .

Вы не можете urlencode всю строку, потому что это будет кодировать косые черты и другие, которые вам нужно оставить незакодированными. Если пробелы являются вашей единственной проблемой, это будет делать:

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