Nginx怎么配合php實現生成實時縮略圖功能

nginx配置:

復制代碼?代碼如下:

#假設,服務器上面有一個文件: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;
??? }
}

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 );//保存文件
??? }
?>

效果圖:

Nginx怎么配合php實現生成實時縮略圖功能

Nginx怎么配合php實現生成實時縮略圖功能

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享