php - file_get_contents - загрузка файлов с пробелами в имени файла не работает - PullRequest
7 голосов
/ 24 ноября 2011

Я пытаюсь загрузить файлы, используя функцию file_get_contents().Однако, если местоположение файла - http://www.example.com/some name.jpg, функция не может его загрузить.

Но если URL указан как http://www.example.com/some%20name.jpg, загружается то же самое.

Я пытался rawurlencode() но это охватывает все символы в URL, и загрузка снова не удается.

Может кто-нибудь предложить решение для этого?

Ответы [ 5 ]

25 голосов
/ 24 ноября 2011

Я думаю, что это будет работать для вас:

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, который вы используете.

1 голос
/ 24 ноября 2011

Как вы, наверное, уже поняли, urlencode () следует использовать только для каждой части URL, требующей экранирования.

Из документов для urlencode () просто примените его кимя файла изображения, указывающее на проблему, и оставьте оставшуюся часть URL-адреса в покое.Из вашего примера вы можете безопасно кодировать все, что следует за последним символом "/"

0 голосов
/ 22 февраля 2016

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

private function update_url($url)
{
    $parts = explode('/', $url);

    $new_file = urlencode(end($parts));
    $parts[key($parts)] = $new_file;

    return implode("/", $parts);
}
0 голосов
/ 08 июня 2014

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

// www.example.com/path

До php 5.4.7 это не создавало бы элемент массива [схема], которыйскинул бы функцию мачека.Этот метод также может быть быстрее.

$url = '//www.example.com/path';

preg_match('/(https?:\/\/|\/\/)([^\/]+)(.*)/ism', $url, $result);

$url = $result[1].$result[2].urlencode(urldecode($result[3])); 
0 голосов
/ 24 ноября 2011

Это должно работать

$file = 'some file name';
urlencode($file);
file_get_contents($file);
...