2011-11-24 74 views
7

Estoy tratando de descargar archivos usando la función file_get_contents(). Sin embargo, si la ubicación del archivo es http://www.example.com/some name.jpg, la función no puede descargar esto.php - file_get_contents - Descargar archivos con espacios en el nombre de archivo no funciona

Pero si la URL se da como http://www.example.com/some%20name.jpg, la misma se descarga.

Intenté rawurlencode() pero esto oculta todos los caracteres en la URL y la descarga falla nuevamente.

¿Alguien puede sugerir una solución para esto?

+2

¿No te refieres a ['file_get_contents'] (http://php.net/file_get_contents)? –

+0

'some + name.jpg' debería funcionar. ¿Cómo falla la descarga? ¿error 404? ¿400 Petición Incorrecta? file_put_contents() es para guardar datos. Si proporciona una URL, efectivamente está tratando de hacer una carga http, que probablemente NO sea la que desea. –

+0

el problema que está teniendo es que 'rawurlencode' doblará una cadena si ya está codificada. Sin embargo, la simple decodificación de todas las cadenas antes de codificarlas tampoco parece funcionar. Necesita una función que funcione para todas las URL –

Respuesta

1

Como probablemente ya hayas averiguado, urlencode() solo debe usarse en cada parte de una URL que requiera el escape.

Desde el docs for urlencode() solo aplique al nombre de archivo de la imagen que le da el problema y deje el resto de la URL sola. De su ejemplo, usted puede codificar de forma segura todo lo que sigue al último carácter "/"

-1

Esto debería funcionar

$file = 'some file name'; 
urlencode($file); 
file_get_contents($file); 
+0

Como se señala en la pregunta, si '$ file = 'some% 20file% 20name'', esto fallará. Él necesita algo que funcione para ambos. –

+0

Entonces posiblemente 'escapeshellcmd()' funcionará – Kirill

22

Creo que esto va a funcionar para usted:

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"; 

salida

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 

Nota:

Probablemente usaría urldecode y urlencode para esto ya que la salida sería idéntica para cada url. rawurlencode conservará el + incluso cuando %20 sea adecuado para cualquier url que esté utilizando.

+1

Brillante respuesta - He estado buscando todo el día para esto ... Realmente genial –

0

Aquí hay una mejor solución. Si por alguna razón usted está usando una dirección URL relativa como:

//www.example.com/path

antes de PHP 5.4.7 esto no crearía la [esquema] elemento de la matriz que deshacerse de Maček función. Este método puede ser más rápido también.

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

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

$url = $result[1].$result[2].urlencode(urldecode($result[3])); 
0

Suponiendo que sólo el nombre de archivo tiene el problema, este es un mejor enfoque. solo urlencode la última sección, es decir. nombre del archivo.

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

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

    return implode("/", $parts); 
} 
Cuestiones relacionadas