代碼片段(4)[全屏查看所有代碼]
1. [代碼]Nginx
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
|
#假設,服務器上面有一個文件:abc.jpg,通過http://filefs.domain.com/file/abc.jpg能夠訪問到原圖。其#實一般的,我們在數據庫裏面也就保存了“/file/abc.jpg”這部分內容。 #現在,我們要實現通過http://filefs.domain.com/file/abc.jpg.w320.jpg由服務器自動產生#abc.jpg.w320.jpg(w320,320px的寬度)這個縮略圖。並返回圖片數據。 #要滿足以下兩個條件: #
1.如果abc.jpg.w320.jpg存在,則不重新產生圖片 #
2.如果不存在,則在同一次的請求中,返回圖片數據,和保存圖片文件到服務器。 server
{ listen
80; server_name
filefs.domain.com; root
/var/www/http/filefs.domain.com; location
/ { index
index.html index.htm; } location
~ \.(png|jpg|jpeg|gif)$ { #如果文件不存在,則rewrite到產生圖片的腳本文件autoimg.php if
(!-f $request_filename) { rewrite
^/.*$ /autoimg.php; expires
max; } #如果文件存在,則設置過期時間,關閉訪問日誌 if
( -f $request_filename ) { expires
max; access_log
off; } } error_page
500 502 503 504 /50x.html; location
= /50x.html { root
/usr/share/nginx/html; } location
~ autoimg.php$ {#安全性考慮,文件服務器,只這個腳本文件的範圍提交給php處理 fastcgi_pass
127.0.0.1:9000; fastcgi_index
index.php; fastcgi_param
SCRIPT_FILENAME /var/www/http/filefs.domain.com$fastcgi_script_name; include
/usr/local/nginx/conf/fastcgi_params; } } |
2. [代碼]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
|
<?php $file
= $_SERVER
[ 'REQUEST_URI' ]; //請求字串
/file/abc.jpg.w320.jpg $desfile
= $_SERVER
[ 'DOCUMENT_ROOT' ]
. $file ;
//目標目標路徑
/var/www/http/file/abc.jpg.w320.jpg $dirname
= dirname ( $desfile
) . "/" ; $filename
= basename
( $desfile
); if
(preg_match ( "/([^\.]+\.(png|jpg|jpeg|gif))\.w([\d]+)\.(jpg)/i" ,
$filename ,
$m
)) { $srcfile
= $dirname
. $m
[1]; $width
= $m
[3]; //匹配出輸出文件寬度 if
(in_array ( $width ,
array
( //只產生202和320寬度的文件 202, 320
)
) && file_exists
( $srcfile
)) { //而且文件不存在 thumbnail
( $srcfile ,
$desfile ,
$width
); } } /** *
生成縮略圖 * *
@param 源 $src *
@param 縮放後的寬帶 $width * */ function
thumbnail( $src ,
$des ,
$width )
{ ob_start
(); //開始截獲輸出流 $imageinfos
= getimagesize
( $src
); $ext
= strtolower
( pathinfo
( $src ,
4 ) ); if
( $imageinfos
[2] == 1) { $im
= imagecreatefromgif ( $src
); }
elseif
( $imageinfos
[2] == 2) { $im
= imagecreatefromjpeg ( $src
); }
elseif
( $imageinfos
[2] == 3) { $im
= imagecreatefrompng ( $src
); } if
(isset ( $im
)) { $height
= $imageinfos
[1] * $width
/ $imageinfos
[0]; $dst_img
= ImageCreateTrueColor ( $width ,
$height
); imagesavealpha
( $dst_img ,
true ); $trans_colour
= imagecolorallocatealpha ( $dst_img ,
0, 0, 0, 127 ); imagefill
( $dst_img ,
0, 0, $trans_colour
); imagecopyresampled
( $dst_img ,
$im ,
0, 0, 0, 0, $width ,
$height ,
$imageinfos
[0], $imageinfos
[1] ); header
( 'content-type:image/jpg'
); imagejpeg
( $dst_img ,
null, 90 ); //輸出文件流,90--壓縮質量,100表示最高質量。 @imagedestroy
( $im
); @imagedestroy
( $dst_img
); }
else
{ echo
@ file_get_contents
( $src
); } $content
= ob_get_contents (); //獲取輸出流 ob_end_flush
(); //輸出流到網頁,保證第一次請求也有圖片數據放回 @ file_put_contents
( $des ,
$content
); //保存文件 } ?> |