在昨天做端口测试的基础上研究一下PHP上传与下载的代码,结果想起前段时间笔试题有一道题是在上传文件时显示文件内容,让我对PHP实现读取远程文件的功能很感兴趣,以下是代码:
01 | function urlfopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE , $ip = '', $timeout = 15, $block = TRUE, $encodetype = 'URLENCODE') { |
02 | $return = ''; |
03 | $matches = parse_url($url); |
04 | $host = $matches['host']; |
05 | $path = $matches['path'] ? $matches['path'].(isset($matches['query']) ? '?'.$matches['query'] : '') : '/'; |
06 | $port = !empty($matches['port']) ? $matches['port'] : 80; |
07 |
08 | if($post) { |
09 | $out = "POST $path HTTP/1.0\r\n"; |
10 | $out .= "Accept: */*\r\n"; |
11 | $out .= "Accept-Language: zh-cn\r\n"; |
12 | $boundary = $encodetype == 'URLENCODE' ? '' : ';'.substr($post, 0, trim(strpos($post, "\n"))); |
13 | $out .= $encodetype == 'URLENCODE' ? "Content-Type: application/x-www-form-urlencoded\r\n" : "Content-Type: multipart/form-data$boundary\r\n"; |
14 | $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; |
15 | $out .= "Host: $host\r\n"; |
16 | $out .= 'Content-Length: '.strlen($post)."\r\n"; |
17 | $out .= "Connection: Close\r\n"; |
18 | $out .= "Cache-Control: no-cache\r\n"; |
19 | $out .= "Cookie: $cookie\r\n\r\n"; |
20 | $out .= $post; |
21 | } else { |
22 | $out = "GET $path HTTP/1.0\r\n"; |
23 | $out .= "Accept: */*\r\n"; |
24 | $out .= "Accept-Language: zh-cn\r\n"; |
25 | $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; |
26 | $out .= "Host: $host\r\n"; |
27 | $out .= "Referer: \r\n"; |
28 | $out .= "Connection: Close\r\n"; |
29 | $out .= "Cookie: $cookie\r\n\r\n"; |
30 | } |
31 | $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr,$timeout); |
32 | if(!$fp) { |
33 | return ''; |
34 | } else { |
35 | stream_set_blocking($fp, $block); |
36 | stream_set_timeout($fp, $timeout); |
37 | @fwrite($fp, $out); |
38 | $status = stream_get_meta_data($fp); |
39 | if(!$status['timed_out']) { |
40 | while (!feof($fp)) { |
41 | if(($header = @fgets($fp)) && ($header == "\r\n" $header =="\n")) { |
42 | break; |
43 | } |
44 | } |
45 |
46 | $stop = false; |
47 | while(!feof($fp) && !$stop) { |
48 | $data = fread($fp, ($limit == 0 $limit > 8192 ? 8192 :$limit)); |
49 | $return .= $data; |
50 | if($limit) { |
51 | $limit -= strlen($data); |
52 | $stop = $limit |
53 | } |
54 | } |
55 | } |
56 | @fclose($fp); |
57 | return $return; |
58 | } |
59 | } |