在前期的php教程就讲了php gd库可以实现远程图片的下载,但是那只是下载了一张图片,原理是一样的,要想下载一个网页的所有图片只要使用正则表达式进行判断,找出所有的图片url就可以进行循环下载了,我特地参照网络资源编写了gd库图片下载类!
php代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<?php header( "Content-type:text/html ; charset=utf-8" ); if (! empty ( $_POST [ 'submit' ])){ $url = $_POST [ 'url' ]; //为了获取相对路径的图片所做的操作 $url_fields = parse_url ( $url ); $main_url = $url_fields [ 'host' ]; $base_url = substr ( $url ,0, strrpos ( $url , '/' )+1); //获取网页内容 //设置代理服务器 $opts = array ( 'http' => array ( 'request_fulluri' =>true)); $context = stream_context_create( $opts ); $content = file_get_contents ( $url ,false, $context ); //匹配img标签,将所有匹配字符串保存到数组$matches $reg = "/<img.*?src=\"(.*?)\".*?>/i" ; preg_match_all( $reg , $content , $matches ); $count = count ( $matches [0]); for ( $i =0; $i < $count ; $i ++){ /*将所有图片的url转换为小写 *$matches[1][$i] = strtolower($matches[1][$i]); */ //如果图片为相对路径就转化为全路径 if (! strpos ( 'a' . $matches [1][ $i ], 'http' )){ //因为'/'是第0个位置 if ( strpos ( 'a' . $matches [1][ $i ], '/' )){ $matches [1][ $i ] = 'http://' . $main_url . $matches [1][ $i ]; } else { $matches [1][ $i ] = $base_url . $matches [1][ $i ]; } } } //过滤重复的图片 $img_arr = array_unique ( $matches [1]); //实例化图片下载类 $getImg = new DownImage(); $url_count = count ( $img_arr ); for ( $i =0; $i < $url_count ; $i ++){ $getImg ->source = $img_arr [ $i ]; $getImg ->save_address = './pic/' ; $file = $getImg ->download(); } echo "下载完成!哈哈,简单吧!" ; } class DownImage{ public $source ; //远程图片URL public $save_address ; //保存本地地址 public $set_extension ; //设置图片扩展名 public $quality ; //图片的质量(0~100,100最佳,默认75左右) //下载方法(选用GD库图片下载) public function download(){ //获取远程图片信息 $info = @ getimagesize ( $this ->source); //获取图片扩展名 $mime = $info [ 'mime' ]; $type = substr ( strrchr ( $mime , '/' ), 1); //不同的图片类型选择不同的图片生成和保存函数 switch ( $type ){ case 'jpeg' : $img_create_func = 'imagecreatefromjpeg' ; $img_save_func = 'imagejpeg' ; $new_img_ext = 'jpg' ; $image_quality = isset( $this ->quality) ? $this ->quality : 100; break ; case 'png' : $img_create_func = 'imagecreatefrompng' ; $img_save_func = 'imagepng' ; $new_img_ext = 'png' ; break ; case 'bmp' : $img_create_func = 'imagecreatefrombmp' ; $img_save_func = 'imagebmp' ; $new_img_ext = 'bmp' ; break ; case 'gif' : $img_create_func = 'imagecreatefromgif' ; $img_save_func = 'imagegif' ; $new_img_ext = 'gif' ; break ; case 'vnd.wap.wbmp' : $img_create_func = 'imagecreatefromwbmp' ; $img_save_func = 'imagewbmp' ; $new_img_ext = 'bmp' ; break ; case 'xbm' : $img_create_func = 'imagecreatefromxbm' ; $img_save_func = 'imagexbm' ; $new_img_ext = 'xbm' ; break ; default : $img_create_func = 'imagecreatefromjpeg' ; $img_save_func = 'imagejpeg' ; $new_img_ext = 'jpg' ; } //根据是否设置扩展名来合成本地文件名 if (isset( $this ->set_extension)){ $ext = strrchr ( $this ->source, "." ); $strlen = strlen ( $ext ); $newname = basename ( substr ( $this ->source,0,- $strlen )). '.' . $new_img_ext ; } else { $newname = basename ( $this ->source); } //生成本地文件路径 $save_address = $this ->save_address. $newname ; $img = @ $img_create_func ( $this ->source); if (isset( $image_quality )){ $save_img = @ $img_save_func ( $img , $save_address , $image_quality ); } else { $save_img = @ $img_save_func ( $img , $save_address ); } return $save_img ; } } ?> <form method= "POST" action= "" > 远程url地址:<input type= "text" name= "url" size=30 /> <input type= "submit" name= "submit" value= "下载该页面所有图片" /> </form> |
运行结果如图: