2012-06-17 14 views
7

Tenemos un URL como http://site.s3.amazonaws.com/images/some image @name.jpg dentro $stringurlencode y file_get_contents

Lo que estoy tratando de hacer (sí, hay un espacio en blanco alrededor de la url):

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

Lo que obtengo (@ es también sustituido):

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

Si copiar/pegar http://site.s3.amazonaws.com/images/some image @name.jpg en la barra de direcciones del navegador, la imagen se op es

¿Qué hay de malo y cómo solucionarlo?

+2

Así que convertir la URL en una URL no válida y luego se preguntan por que no funciona? ¿Qué es eso para una pregunta? Por favor elabora. – hakre

+1

¿Y quién le dijo que 'file_get_contents' en PHP o la envoltura de flujo http en PHP funciona exactamente como la barra de direcciones de su navegador? Es posible que desee leer acerca de las especificaciones técnicas antes de usar esa característica en PHP. Te sugiero que comiences leyendo el manual. – hakre

+0

No puedo entender esto. ¿Me puede suministrar/me su código completo? –

Respuesta

1

La URL que ha especificado no es válida. file_get_contents espera un URI http válido (más precisamente, el contenedor HTTP subyacente). Como su URI no válido no es un URI válido, file_get_contents falla.

Puede solucionar esto convirtiendo su URI no válido en un URI válido. La información sobre cómo escribir un URI válido está disponible en RFC3986. Debe tener cuidado de que todos los caracteres especiales estén representados correctamente. p.ej. espacios para plus-signs, y el comercial en el signo tiene que ser URL encoded. También se deben eliminar los espacios en blanco superfluos al comienzo y al final.

Cuando haya terminado, el servidor web le dirá que el acceso está prohibido. Es posible que deba agregar encabezados de solicitud adicionales a través de las opciones de contexto HTTP para que el contenedor de archivos HTTP resuelva eso. Puede encontrar la información en el manual de PHP: http:// -- https:// — Accessing HTTP(s) URLs

+0

Ejemplo de trabajo: http://codepad.viper-7.com/jkJjgW – hakre

9

Usando la función urlencode() para toda la URL, generará una URL no válida. Dejar la URL como está también no es correcto, porque a diferencia de los navegadores, la función file_get_contents() no realiza URL normalization. En su ejemplo, es necesario sustituir los espacios %20:

$string = str_replace(' ', '%20', $string); 
+0

funciona, pero es una solución muy sucia – s3v3n

+1

finalmente algo funciona, gracias – nowhere

+0

Esta es una gran respuesta -: http://stackoverflow.com/questions/8260564/php-file-get-contents-downloading-files-with-spaces-in-the-filename-not-work/8260942 # 8260942 –