如何为fopen转义网址

时间:2012-01-10 09:52:23

标签: php fopen

看起来fopen无法打开带空格的文件。 例如:

$url = 'http://gatewaypeople.com/images/articles/cntrbutnssttmnts12_main 616x200.jpg';
fopen($url, 'r'); 

返回false(请注意网址中的空格),但浏览器可以访问该文件。 我还试图通过urlencoderawurlencode来逃避网址,但没有运气。如何正确逃离空间?

4 个答案:

答案 0 :(得分:4)

rawurlencode是要走的路,但不能逃避完整的网址。只转义文件名。所以你最终会进入http://gatewaypeople.com/images/articles/cntrbutnssttmnts12_main%20616x200.jpg

答案 1 :(得分:4)

您可以使用此代码:

$arr = parse_url ( 'http://gatewaypeople.com/images/articles/cntrbutnssttmnts12_main 616x200.jpg' );
$parts = explode ( '/', $arr['path'] );
$fname = $parts[count($parts)-1];
unset($parts[count($parts)-1]);
$url = $arr['scheme'] . '://' . $arr['host'] . join('/', $parts) . '/' . urlencode ( $fname );
var_dump( $url );

替代&更短的答案(感谢@Dziamid)

$url = 'http://gatewaypeople.com/images/articles/cntrbutnssttmnts12_main 616x200.jpg';
$parts = pathinfo($url);
$url = $parts['dirname'] . '/' . urlencode($parts['basename']);
var_dump( $url );

<强>输出:

string(76) "http://gatewaypeople.com/images/articles/cntrbutnssttmnts12_main+616x200.jpg"

答案 2 :(得分:1)

此处提出的所有解决方案都是错误的,因为它们不会转义查询字符串部分和基本目录部分。此外,他们不会考虑用户,传递和片段网址部分。

要正确转义有效的URL,您必须单独转义路径部分和查询部分。 所以解决方案是提取url部分,转义每个部分并重建url。

这是一个简单的代码段:

function safeUrlEncode( $url ) {
    $urlParts = parse_url($url);
    $urlParts['path'] = safeUrlEncodePath( $urlParts['path'] );
    $urlParts['query'] = safeUrlEncodeQuery( $urlParts['query'] );
    return http_build_url($urlParts);
}

function safeUrlEncodePath( $path ) {
    if( strlen( $path ) == 0 || strpos($path, "/") === false ){
        return "";
    }
    $pathParts = explode( "/" , $path );
    return implode( "/", $pathParts );
}

function safeUrlEncodeQuery( $query ) {
    $queryParts = array();
    parse_str($query, $queryParts);
    $queryParts = urlEncodeArrayElementsRecursively( $queryParts );
    return http_build_query( $queryParts );
}

function urlEncodeArrayElementsRecursively( $array ){
    if( ! is_array( $array ) ) {
        return urlencode( $array );
    } else {
        foreach( $array as $arrayKey => $arrayValue ){
                $array[ $arrayKey ] = urlEncodeArrayElementsRecursively( $arrayValue );
        }
    }
    return $array;
}

用法只是:

$encodedUrl = safeUrlEncode( $originalUrl );

旁注 在我的代码片段中,我使用的是http://php.net/manual/it/function.http-build-url.php,它在PECL扩展下可用。如果您的服务器上没有PECL扩展,您只需包含纯PHP实现:http://fuelforthefire.ca/free/php/http_build_url/

干杯:)

答案 3 :(得分:0)

$url = 'http://gatewaypeople.com/images/articles/cntrbutnssttmnts12_main 616x200.jpg';
fopen(urlencode($url), 'r');