成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

nodejs和php實現圖片訪問實時處理

開發 前端 后端
我在訪問時光網、網易云音樂等網站時,發現將它們頁面中的一些圖片URL修改一下就可以得到不同尺寸的圖片,于是思考了其實現方案,我的思路是:URL Rewrite + 實時處理 + 緩存,對用戶請求的URL進行重寫,然后利用圖片處理類庫對圖片進行處理,接著緩存該尺寸圖片并輸出到瀏覽器。

[[210775]]

我在訪問時光網、網易云音樂等網站時,發現將它們頁面中的一些圖片URL修改一下就可以得到不同尺寸的圖片,于是思考了其實現方案,我的思路是:URL Rewrite + 實時處理 + 緩存,對用戶請求的URL進行重寫,然后利用圖片處理類庫對圖片進行處理,接著緩存該尺寸圖片并輸出到瀏覽器。使用PHP和Node.js實現了一遍,基本達到了需要的效果。

1、Nginx+Node.js(express)實現 

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

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

這里說明一下: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介紹。圖片處理的實現如下:

  1. app.get('/resize',function(req,res){ 
  2.   var src = req.query.src, 
  3.     width = req.query.w, 
  4.     height = req.query.h, 
  5.     type = req.query.type; 
  6.   var imgFile = uploadDir+src+'.'+type; 
  7.   var notFound = '不好意思,該圖片不存在或已被刪除!'
  8.   var thumb = getThumbImg(src,width,height,type); 
  9.   if(isFileExists(imgFile)){ 
  10.     if(isFileExists(thumb)){ 
  11.       res.type(type).sendFile(__dirname+'/'+thumb); 
  12.     }else
  13.       imgResize(imgFile,thumb,width,height,type,res); 
  14.     } 
  15.   }else
  16.     res.status(404).send(notFound); 
  17.   } 
  18. }); 
  19. function imgResize(f,th,w,h,t,r){ 
  20.   var imgSize = sizeOf(f); 
  21.   if(!w||!h||w>=imgSize.width||h>=imgSize.height){ 
  22.     r.type(t).sendFile(__dirname+'/'+f); 
  23.   }else
  24.     imageMagick(f) 
  25.       .resize(w,h,'!')  
  26.       .stream(function(err, stdout, stderr) { 
  27.         if (err) { 
  28.           console.log(err); 
  29.           res.end(); 
  30.         } 
  31.         var ws = fs.createWriteStream(th); 
  32.         stdout.pipe(ws); 
  33.         r.type(t); 
  34.         stdout.pipe(r); 
  35.       }); 
  36.   } 
  37. function isFileExists(filePath){ 
  38.   var bool = !0; 
  39.   try{ 
  40.     fs.accessSync(filePath,fs.constants.F_OK); 
  41.   }catch(err){ 
  42.     bool = !1; 
  43.   } 
  44.   return bool; 
  45.  

如上代碼所示,當用戶訪問http://127.0.0.1/upload/147332819224704_400x300.jpg時,如果147332819224704這張圖片存在,且400x300這個尺寸也存在,則直接輸出這張圖片,如不存在,則生成一張該尺寸的圖片保存并輸出到瀏覽器。如果提供的尺寸超出了圖片的原始尺寸,則直接輸出原圖。我們不僅可以修改尺寸,也可以進行模糊、打水印等操作,這里就不多介紹了。 如果不用Nginx反向代理也是可以的,使用express的正則路由實現,如下所示:

  1. app.get(/^\/upload\/(.+)_(\d+)x(\d+)\.(jpg|png|gif)$/,function(req,res){ 
  2.   var src = RegExp.$1, 
  3.     width = RegExp.$2, 
  4.     height = RegExp.$3, 
  5.     type = RegExp.$4; 
  6.   var imgFile = uploadDir+src+'.'+type; 
  7.   var notFound = '不好意思,該圖片不存在或已被刪除!'
  8.   var thumb = getThumbImg(src,width,height,type); 
  9.   if(isFileExists(imgFile)){ 
  10.     if(isFileExists(thumb)){ 
  11.       res.type(type).sendFile(__dirname+'/'+thumb); 
  12.     }else
  13.       imgResize(imgFile,thumb,width,height,type,res); 
  14.     } 
  15.   }else
  16.     res.status(404).send(notFound); 
  17.   } 
  18. });  

2、Apache+PHP實現 首先得搭建windows下php開發環境,我本人用的是apache2+php5.6,具體的搭建步驟網上一大堆,便不再累述。 開啟apache rewrite功能 首先我們得開啟Apache rewrite模塊功能,去掉配置文件http.conf中LoadModule rewritemodule modules/modrewrite.so前面的注釋,然后設置Directory塊下AllowOverride All,可能有多處,接著重啟Apache服務。 配置.htaccess文件 在DocumentRoot目錄下,新建.htaccess文件,如果創建不了,可以先創建一個文本,然后另存為,在彈出的對話框文件名處填寫".htaccess"即可。之后,編寫URL重寫規則,如下所示:

  1. RewriteEngine on 
  2. RewriteCond %{REQUEST_FILENAME} !-f 
  3. 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版邏輯一致,代碼如下:

  1. function getThumbImg($src,$w,$h,$type) 
  2.   global $thumbs; 
  3.   return $_SERVER['DOCUMENT_ROOT'].$thumbs.$src.'_'.$w.'_'.$h.'.'.$type; 
  4. function imgResize($f,$th,$w,$h,$t) 
  5.   $imagick = new Imagick(); 
  6.   $imagick->readImage($_SERVER['DOCUMENT_ROOT'].'\\'.$f); 
  7.   $width = $imagick->getImageWidth(); 
  8.   $height = $imagick->getImageHeight(); 
  9.   if(!$w||!$h||$w>=$width||$h>=$height){ 
  10.     header('Content-Type:image/'.$t); 
  11.     echo file_get_contents($_SERVER['DOCUMENT_ROOT'].'\\'.$f); 
  12.   }else
  13.     $imagick->stripImage(); 
  14.     $imagick->cropThumbnailImage($w, $h); 
  15.     $imagick->writeImage($th); 
  16.     header('Content-Type:image/'.$t); 
  17.     echo $imagick->getImageBlob(); 
  18.     $imagick->clear(); 
  19.     $imagick->destroy(); 
  20.   } 
  21. $uploadDir = "uploads/images/"
  22. $thumbs = "uploads/thumbs/"
  23. $src = $_GET['src']; 
  24. $width = $_GET['w']; 
  25. $height = $_GET['h']; 
  26. $type = $_GET['type']; 
  27. $imgFile = $uploadDir.$src.'.'.$type; 
  28. $notFound = '不好意思,該圖片不存在或已被刪除!'
  29. $thumb = getThumbImg($src,$width,$height,$type); 
  30. if(file_exists($imgFile)){ 
  31.   if(file_exists($thumb)){ 
  32.     header('Content-Type:image/'.$type); 
  33.     echo file_get_contents($thumb); 
  34.   }else
  35.     imgResize($imgFile,$thumb,$width,$height,$type); 
  36.   } 
  37. }else
  38.   header("HTTP/1.0 404 Not Found"); 
  39.   header("status: 404"); 
  40.   echo $notFound; 
  41.  

至此,圖片訪問實時處理也就完成了。其實大部分圖片服務器都需要這樣的功能,而不是事先生成好幾套尺寸的圖片。 

責任編輯:龐桂玉 來源: PHP技術大全
相關推薦

2025-03-04 08:00:00

JavaiTextPDFPDF

2011-12-30 13:50:21

流式計算Hadoop

2017-08-09 13:30:21

大數據Apache Kafk實時處理

2023-10-26 07:36:02

分布式架構

2019-09-04 09:31:40

日志Flink監控

2014-12-15 09:32:17

StormSpark

2017-08-31 16:36:26

2017-02-14 15:37:32

KappaLambda

2021-07-21 10:22:02

數據存儲

2013-04-27 12:18:58

大數據全球技術峰會京東

2017-11-03 15:05:56

Storm數據處理服務器

2016-11-08 12:49:27

大數據分布式系統Druid-IO

2015-07-14 10:53:28

2018-06-11 17:37:23

高并發與實時處理技術

2009-12-07 17:05:36

PHP函數imaget

2020-10-20 11:12:11

Nodejs

2015-12-10 21:31:19

七牛數據處理架構變遷

2019-12-18 10:48:52

運維架構技術

2016-11-10 11:55:29

圖像分割圖像處理php

2009-07-09 10:15:23

PHP DOM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线观看av | 国产精品免费观看 | 国产精品a一区二区三区网址 | 国产精品日本一区二区在线播放 | 免费av观看 | 特a毛片| 中国大陆高清aⅴ毛片 | 91看片在线 | 国产精品揄拍一区二区久久国内亚洲精 | 欧美激情精品久久久久 | 精品国产亚洲一区二区三区大结局 | 欧美日韩视频在线播放 | 成人一区精品 | 国产欧美精品一区 | 免费视频一区二区 | 色婷婷精品久久二区二区蜜臂av | 欧美黄页 | 日韩精品在线观看视频 | 一区在线播放 | 免费观看一级毛片 | 黄色大片在线免费观看 | 亚洲精品一区二区三区 | 国产美女精品视频免费观看 | 欧美日韩国产三级 | 黄色大片在线免费观看 | 欧美精品一区二区三 | 午夜理伦三级理论三级在线观看 | 亚洲乱码一区二区三区在线观看 | 日本高清在线一区 | 福利网站导航 | 欧美在线一区视频 | 成人欧美一区二区三区1314 | 中文字幕亚洲一区二区三区 | 99自拍视频| 欧美中文字幕一区二区三区 | 久久精品网 | av一区二区三区四区 | av在线免费播放 | 国内精品久久久久久 | 亚洲在线一区二区三区 | 日韩国产一区二区三区 |