Я пытаюсь загрузить файлы, используя функцию file_get_contents()
. Однако, если местоположение файла – http://www.example.com/some name.jpg
, функция не может загрузить это.
Но если URL-адрес указан как http://www.example.com/some%20name.jpg
, тот же загружается.
Я попробовал rawurlencode()
но это скрывает все символы в URL-адресе, и загрузка снова завершается.
Может кто-нибудь предложить решение для этого?
Я думаю, это сработает для вас:
function file_url($url){ $parts = parse_url($url); $path_parts = array_map('rawurldecode', explode('/', $parts['path'])); return $parts['scheme'] . '://' . $parts['host'] . implode('/', array_map('rawurlencode', $path_parts)) ; } echo file_url("http://example.com/foo/bar bof/some file.jpg") . "\n"; echo file_url("http://example.com/foo/bar+bof/some+file.jpg") . "\n"; echo file_url("http://example.com/foo/bar%20bof/some%20file.jpg") . "\n";
Вывод
http://example.com/foo/bar%20bof/some%20file.jpg http://example.com/foo/bar%2Bbof/some%2Bfile.jpg http://example.com/foo/bar%20bof/some%20file.jpg
Заметка:
Я бы, вероятно, использовал urldecode
и urlencode
для этого, так как выход был бы идентичен для каждого URL-адреса. rawurlencode
сохранит +
даже если %20
, вероятно, подходит для любого URL-адреса, который вы используете.
Как вы, вероятно, уже выяснили, urlencode () следует использовать только на каждой части URL-адреса, требующей экранирования.
Из документов для urlencode () просто примените его к имени файла изображения, что даст вам проблему и оставит остальную часть URL-адреса. Из вашего примера вы можете безопасно кодировать все, что следует за последним символом «/»
Возможно, это лучшее решение. Если по какой-либо причине вы используете относительный URL-адрес, например:
//www.example.com/path
До php 5.4.7 это не создало бы элемент массива [схема], который бы сбросил функцию maček. Этот метод может быть и быстрее.
$url = '//www.example.com/path';
preg_match('/(https?:\/\/|\/\/)([^\/]+)(.*)/ism', $url, $result); $url = $result[1].$result[2].urlencode(urldecode($result[3]));
Если предположить, что только имя файла имеет проблему, это лучший подход. только urlencode в последнем разделе, т.е. имя файла.
private function update_url($url) { $parts = explode('/', $url); $new_file = urlencode(end($parts)); $parts[key($parts)] = $new_file; return implode("/", $parts); }
Это должно работать
$file = 'some file name'; urlencode($file); file_get_contents($file);