全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

nodejs和php实现图片访问实时处理

我在访问时光网、网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的URL进行重写,然后利用图片处理类库对图片进行处理,接着缓存该尺寸图片并输出到浏览器。使用PHP和Node.js实现了一遍,基本达到了需要的效果。

1、Nginx+Node.js(express)实现

URL重写

这里Nginx主要是做一个URL重写和反向代理的功能,配置如下所示:

location ~ /upload/{
  if ($request_uri ~* ^/upload/(.+)_(\d+)x(\d+)\.(jpg|png|gif)$) {
    set $src $1;
    set $w $2;
    set $h $3;
    set $t $4;
    rewrite . /resize?src=$src&w=$w&h=$h&type=$t break;
  }
  proxy_pass    http://127.0.0.1:3000;
}

这里说明一下:Nginx监听本地的80端口,Node.js监听的是3000端口。当用户访问类似http://127.0.0.1/upload/147332819224704_400x300.jpg的地址时,便会被代理到http://127.0.0.1:3000/resize?src=147332819224704&w=400&h=300&type=jpg访问,看起来像是访问一张图片,其实不然。

图片实时处理

我们在Node.js中实时处理图片,进行缩放、模糊、水印等操作,之后将其缓存起来并输出到浏览器。Node.js自身API并不擅长图片的处理,我们可以借助第三方类库来实现,这里推荐GraphicsMagick或ImageMagick,使用它们之前先安装gm模块:

npm install gm --save
接着便可以使用GraphicsMagick了,该模块的API可以参考GM模块API介绍。图片处理的实现如下:

app.get('/resize',function(req,res){
  var src = req.query.src,
    width = req.query.w,
    height = req.query.h,
    type = req.query.type;
  var imgFile = uploadDir+src+'.'+type;
  var notFound = '不好意思,该图片不存在或已被删除!';
  var thumb = getThumbImg(src,width,height,type);
  if(isFileExists(imgFile)){
    if(isFileExists(thumb)){
      res.type(type).sendFile(__dirname+'/'+thumb);
    }else{
      imgResize(imgFile,thumb,width,height,type,res);
    }
  }else{
    res.status(404).send(notFound);
  }
});
function imgResize(f,th,w,h,t,r){
  var imgSize = sizeOf(f);
  if(!w||!h||w>=imgSize.width||h>=imgSize.height){
    r.type(t).sendFile(__dirname+'/'+f);
  }else{
    imageMagick(f)
      .resize(w,h,'!') 
      .stream(function(err, stdout, stderr) {
        if (err) {
          console.log(err);
          res.end();
        }
        var ws = fs.createWriteStream(th);
        stdout.pipe(ws);
        r.type(t);
        stdout.pipe(r);
      });
  }
}
function isFileExists(filePath){
  var bool = !0;
  try{
    fs.accessSync(filePath,fs.constants.F_OK);
  }catch(err){
    bool = !1;
  }
  return bool;
}

如上代码所示,当用户访问http://127.0.0.1/upload/147332819224704_400x300.jpg时,如果147332819224704这张图片存在,且400x300这个尺寸也存在,则直接输出这张图片,如不存在,则生成一张该尺寸的图片保存并输出到浏览器。如果提供的尺寸超出了图片的原始尺寸,则直接输出原图。我们不仅可以修改尺寸,也可以进行模糊、打水印等操作,这里就不多介绍了。

如果不用Nginx反向代理也是可以的,使用express的正则路由实现,如下所示:

app.get(/^\/upload\/(.+)_(\d+)x(\d+)\.(jpg|png|gif)$/,function(req,res){
  var src = RegExp.$1,
    width = RegExp.$2,
    height = RegExp.$3,
    type = RegExp.$4;
  var imgFile = uploadDir+src+'.'+type;
  var notFound = '不好意思,该图片不存在或已被删除!';
  var thumb = getThumbImg(src,width,height,type);
  if(isFileExists(imgFile)){
    if(isFileExists(thumb)){
      res.type(type).sendFile(__dirname+'/'+thumb);
    }else{
      imgResize(imgFile,thumb,width,height,type,res);
    }
  }else{
    res.status(404).send(notFound);
  }
});

2、Apache+PHP实现

首先得搭建windows下php开发环境,我本人用的是apache2+php5.6,具体的搭建步骤网上一大堆,便不再累述。

开启apache rewrite功能

首先我们得开启Apache rewrite模块功能,去掉配置文件http.conf中LoadModule rewrite_module modules/mod_rewrite.so前面的注释,然后设置Directory块下AllowOverride All,可能有多处,接着重启Apache服务。

配置.htaccess文件

在DocumentRoot目录下,新建.htaccess文件,如果创建不了,可以先创建一个文本,然后另存为,在弹出的对话框文件名处填写".htaccess"即可。之后,编写URL重写规则,如下所示:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^upload/(.+)_([0-9]+)x([0-9]+)\.(jpg|png|gif)$ resize.php?src=$1&w=$2&h=$3&type=$4 [L]

将类似http://127.0.0.1/upload/147332819224704_400x300.jpg地址重写为http://127.0.0.1/resize.php/src=147332819224704&w=400&h=300&type=jpg

功能实现

接下来便是功能的实现,逻辑和nodejs版逻辑一致,代码如下:

function getThumbImg($src,$w,$h,$type)
{
  global $thumbs;
  return $_SERVER['DOCUMENT_ROOT'].$thumbs.$src.'_'.$w.'_'.$h.'.'.$type;
}
function imgResize($f,$th,$w,$h,$t)
{
  $imagick = new Imagick();
  $imagick->readImage($_SERVER['DOCUMENT_ROOT'].'\\'.$f);
  $width = $imagick->getImageWidth();
  $height = $imagick->getImageHeight();
  if(!$w||!$h||$w>=$width||$h>=$height){
    header('Content-Type:image/'.$t);
    echo file_get_contents($_SERVER['DOCUMENT_ROOT'].'\\'.$f);
  }else{
    $imagick->stripImage();
    $imagick->cropThumbnailImage($w, $h);
    $imagick->writeImage($th);
    header('Content-Type:image/'.$t);
    echo $imagick->getImageBlob();
    $imagick->clear();
    $imagick->destroy();
  }
}

$uploadDir = "uploads/images/";
$thumbs = "uploads/thumbs/";
$src = $_GET['src'];
$width = $_GET['w'];
$height = $_GET['h'];
$type = $_GET['type'];
$imgFile = $uploadDir.$src.'.'.$type;
$notFound = '不好意思,该图片不存在或已被删除!';
$thumb = getThumbImg($src,$width,$height,$type);
if(file_exists($imgFile)){
  if(file_exists($thumb)){
    header('Content-Type:image/'.$type);
    echo file_get_contents($thumb);
  }else{
    imgResize($imgFile,$thumb,$width,$height,$type);
  }
}else{
  header("HTTP/1.0 404 Not Found");
  header("status: 404");
  echo $notFound;
}

至此,图片访问实时处理也就完成了。其实大部分图片服务器都需要这样的功能,而不是事先生成好几套尺寸的图片。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# nodejs图片访问实时处理  # php图片访问实时处理  # php图片访问处理  # nginx配置访问图片路径以及html静态页面的调取方法  # php如何控制用户对图片的访问 PHP禁止图片盗链  # SpringMVC上传图片与访问  # Android互联网访问图片并在客户端显示的方法  # PHP在Windows IIS上传的图片无法访问的解决方法  # 使用AngularJS 应用访问 Android 手机的图片库  # 解决jsp页面使用网络路径访问图片的乱码问题  # js 利用image对象实现图片的预加载提高访问速度  # Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制  # 轻松创建nodejs服务器(10):处理上传图片  # 重写  # 所示  # 已被  # 不存在  # 的是  # 这张  # 不好意思  # 类库  # 图片处理  # 我在  # 也就  # 不多  # 将其  # 一遍  # 我们可以  # 达到了  # 便可  # 做一个  # 网易  # 便会 


相关文章: 网站制作软件免费下载安装,有哪些免费下载的软件网站?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  家庭服务器如何搭建个人网站?  怎么将XML数据可视化 D3.js加载XML  如何在云指建站中生成FTP站点?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  制作农业网站的软件,比较好的农业网站推荐一下?  建站主机选虚拟主机还是云服务器更好?  建站之星导航配置指南:自助建站与SEO优化全解析  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何通过商城免费建站系统源码自定义网站主题?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何用VPS主机快速搭建个人网站?  建站之星在线客服如何快速接入解答?  ,在苏州找工作,上哪个网站比较好?  定制建站是什么?如何实现个性化需求?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  已有域名和空间如何搭建网站?  建站主机如何选?高性价比方案全解析  如何在万网ECS上快速搭建专属网站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何在阿里云虚拟主机上快速搭建个人网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  兔展官网 在线制作,怎样制作微信请帖?  香港服务器选型指南:免备案配置与高效建站方案解析  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  建站主机是否属于云主机类型?  如何通过主机屋免费建站教程十分钟搭建网站?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  购物网站制作公司有哪些,哪个购物网站比较好?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  深圳网站制作的公司有哪些,dido官方网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星代理商如何保障技术支持与售后服务?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  如何快速配置高效服务器建站软件?  如何实现建站之星域名转发设置?  如何配置支付宝与微信支付功能?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  建站之星安装后界面空白如何解决?  如何通过免费商城建站系统源码自定义网站主题与功能?  利用JavaScript实现拖拽改变元素大小  建站之星备案流程有哪些注意事项? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。