Urlencode и file_get_contents

У нас есть URL-адрес типа http://site.s3.amazonaws.com/images/some image @name.jpg внутри $string

Что я пытаюсь сделать (да, вокруг URL-адреса есть пробел):

$string = urlencode(trim($string));
$string_data = file_get_contents($string);

Что я получаю (@ тоже заменяется):

file_get_contents(http%3A%2F%2Fsite.s3.amazonaws.com%2Fimages%[email protected])[function.file-get-contents]: failed to open stream: No such file or directory

Если вы скопируете / вставите http://site.s3.amazonaws.com/images/some image @name.jpg в адресную строку браузера, откроется изображение.

Что плохого и как это исправить?


person James    schedule 17.06.2012    source источник
comment
Итак, вы превращаете URL-адрес в недействительный URL-адрес, а затем удивляетесь, что он не работает? Что это за вопрос? Пожалуйста, дополните.   -  person hakre    schedule 17.06.2012
comment
Я не могу осмыслить это. Можете ли вы предоставить мне / нам свой полный код?   -  person Funk Forty Niner    schedule 17.06.2012
comment
Это отличный ответ stackoverflow.com/questions/8260564/   -  person Pratik Bothra    schedule 01.10.2013


Ответы (2)


Указанный вами URL недействителен. file_get_contents ожидает действительный http URI (точнее, базовая оболочка http). Поскольку ваш недопустимый URI не является допустимым URI, file_get_contents завершается ошибкой.

Вы можете исправить это, превратив свой недопустимый URI в действительный URI. Информация о том, как написать действительный URI, доступна в RFC3986. Вам нужно позаботиться о том, чтобы все специальные символы были представлены правильно. например пробелы к знакам плюс, а рекламный ролик в знаке должен быть закодирован в URL. Также необходимо удалить лишние пробелы в начале и в конце.

Когда это будет сделано, веб-сервер сообщит вам, что доступ запрещен. Затем вам может потребоваться добавить дополнительные заголовки запроса через параметры контекста HTTP для оболочки файла HTTP, чтобы решить эту проблему. Вы найдете информацию в руководстве по PHP: http://php.net/manual/de/wrappers.http.php

person hakre    schedule 17.06.2012

Использование функции urlencode() для всего URL-адреса приведет к созданию недопустимого URL-адреса. Оставлять URL без изменений также неправильно, потому что в отличие от браузеров функция file_get_contents() не выполняет нормализацию URL. В вашем примере вам нужно заменить пробелы на %20:

$string = str_replace(' ', '%20', $string);
person Victor    schedule 17.06.2012
comment
Это отличный ответ -: stackoverflow.com/questions/8260564/ - person Pratik Bothra; 01.10.2013
comment
Как насчет RAWURLENCODE? - person Jack; 16.04.2014