01 |
#假设,服务器上面有一个文件:abc.jpg,通过http://filefs.domain.com/file/abc.jpg能够访问到原图。其#实一般的,我们在数据库里面也就保存了“/file/abc.jpg”这部分内容。 |
02 |
#现在,我们要实现通过http://filefs.domain.com/file/abc.jpg.w320.jpg由服务器自动产生#abc.jpg.w320.jpg(w320,320px的宽度)这个缩略图。并返回图片数据。 |
03 |
#要满足以下两个条件: |
04 |
# 1.如果abc.jpg.w320.jpg存在,则不重新产生图片 |
05 |
# 2.如果不存在,则在同一次的请求中,返回图片数据,和保存图片文件到服务器。 |
06 |
07 |
08 |
server { |
09 |
listen 80; |
10 |
server_name filefs.domain.com; |
11 |
|
12 |
root /var/www/http/filefs.domain.com; |
13 |
location / { |
14 |
index index.html index.htm; |
15 |
} |
16 |
|
17 |
location ~ \.(png|jpg|jpeg|gif)$ { |
18 |
#如果文件不存在,则rewrite到产生图片的脚本文件autoimg.php |
19 |
if (!-f $request_filename) { |
20 |
rewrite ^/.*$ /autoimg.php; |
21 |
expires max; |
22 |
} |
23 |
#如果文件存在,则设置过期时间,关闭访问日志 |
24 |
if ( -f $request_filename ) { |
25 |
expires max; |
26 |
access_log off; |
27 |
} |
28 |
} |
29 |
|
30 |
error_page 500 502 503 504 /50x.html; |
31 |
location = /50x.html { |
32 |
root /usr/share/nginx/html; |
33 |
} |
34 |
|
35 |
location ~ autoimg.php$ {#安全性考虑,文件服务器,只这个脚本文件的范围提交给php处理 |
36 |
fastcgi_pass 127.0.0.1:9000; |
37 |
fastcgi_index index.php; |
38 |
fastcgi_param SCRIPT_FILENAME /var/www/http/filefs.domain.com$fastcgi_script_name; |
39 |
include /usr/local/nginx/conf/fastcgi_params; |
40 |
} |
41 |
} |
01 |
|
02 |
$file = $_SERVER [ 'REQUEST_URI' ]; //请求字串 /file/abc.jpg.w320.jpg |
03 |
$desfile = $_SERVER [ 'DOCUMENT_ROOT' ] . $file ; //目标目标路径 /var/www/http/file/abc.jpg.w320.jpg |
04 |
$dirname = dirname ( $desfile ) . "/" ; |
05 |
$filename = basename ( $desfile ); |
06 |
if (preg_match ( "/([^\.]+\.(png|jpg|jpeg|gif))\.w([\d]+)\.(jpg)/i" , $filename , $m )) { |
07 |
$srcfile = $dirname . $m [1]; |
08 |
$width = $m [3]; //匹配出输出文件宽度 |
09 |
if (in_array ( $width , array ( //只产生202和320宽度的文件 |
10 |
202, |
11 |
320 |
12 |
) ) && file_exists ( $srcfile )) { //而且文件不存在 |
13 |
thumbnail ( $srcfile , $desfile , $width ); |
14 |
} |
15 |
} |
16 |
|
17 |
/** |
18 |
* 生成缩略图 |
19 |
* |
20 |
* @param 源 $src |
21 |
* @param 缩放后的宽带 $width |
22 |
* |
23 |
*/ |
24 |
function thumbnail( $src , $des , $width ) { |
25 |
ob_start (); //开始截获输出流 |
26 |
$imageinfos = getimagesize ( $src ); |
27 |
$ext = strtolower ( pathinfo ( $src , 4 ) ); |
28 |
if ( $imageinfos [2] == 1) { |
29 |
$im = imagecreatefromgif ( $src ); |
30 |
} elseif ( $imageinfos [2] == 2) { |
31 |
$im = imagecreatefromjpeg ( $src ); |
32 |
} elseif ( $imageinfos [2] == 3) { |
33 |
$im = imagecreatefrompng ( $src ); |
34 |
} |
35 |
|
36 |
if (isset ( $im )) { |
37 |
$height = $imageinfos [1] * $width / $imageinfos [0]; |
38 |
$dst_img = ImageCreateTrueColor ( $width , $height ); |
39 |
|
40 |
imagesavealpha ( $dst_img , true ); |
41 |
$trans_colour = imagecolorallocatealpha ( $dst_img , 0, 0, 0, 127 ); |
42 |
imagefill ( $dst_img , 0, 0, $trans_colour ); |
43 |
|
44 |
imagecopyresampled ( $dst_img , $im , 0, 0, 0, 0, $width , $height , $imageinfos [0], $imageinfos [1] ); |
45 |
|
46 |
header ( 'content-type:image/jpg' ); |
47 |
imagejpeg ( $dst_img , null, 90 ); //输出文件流,90--压缩质量,100表示最高质量。 |
48 |
|
49 |
@imagedestroy ( $im ); |
50 |
@imagedestroy ( $dst_img ); |
51 |
} else { |
52 |
echo @ file_get_contents ( $src ); |
53 |
} |
54 |
$content = ob_get_contents (); //获取输出流 |
55 |
ob_end_flush (); //输出流到网页,保证第一次请求也有图片数据放回 |
56 |
@ file_put_contents ( $des , $content ); //保存文件 |
57 |
} |
58 |
?> |