您的位置:首页 > 技术中心 > 运维 >

Nginx怎么配合php实现生成实时缩略图功能

时间:2023-05-16 07:26

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产生图片文件代码:

复制代码 代码如下:

<?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实现生成实时缩略图功能

以上就是Nginx怎么配合php实现生成实时缩略图功能的详细内容,更多请关注Gxl网其它相关文章!

热门排行

今日推荐

热门手游