利用PHP搭建一个属于自己的随机图片API方便调用,同时可隐藏真实图片地址,注意:图片必须存储在PHP服务器上。
特性
- 完全隐藏图片文件的真实地址
- 支持调用域名白名单
- 支持多文件夹分类目录
- 前端调用支持使用随机数载入
部署
- 下载代码,解压至你域名文件夹根目录
- 开启 Apache 或者 Nginx 的伪静态功能
- 访问:你的域名/images
- 大功告成
配置
打开 images.php 文件,添加域名白名单与默认文件夹即可。 照葫芦画瓢,不用多说了吧。
<?php
error_reporting(E_ERROR);
require_once 'imgdata.php';
$karnc = new imgdata();
/**
* 遍历获取目录下的指定类型的文件
* @param $path
* @param array $files
* @return array
*/
function getfiles($path, $allowFiles, &$files = array()) {
if (!is_dir($path)) return null;
if (substr($path, strlen($path) - 1) != '/') $path .= '/';
$handle = opendir($path);
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..') {
$path2 = $path . $file;
if (is_dir($path2)) {
getfiles($path2, $allowFiles, $files);
} else {
if (preg_match("/\.(" . $allowFiles . ")$/i", $file)) {
$files[] = substr($path2, strlen($_SERVER['DOCUMENT_ROOT']));
}
}
}
}
return $files;
}
/**
* 域名白名单校验函数
* @param $domain_list
* @return true/false
*/
function checkReferer($domain_list = array(
'liitk.com',
'test.liitk.com'
)) {
$status = false;
$refer = $_SERVER['HTTP_REFERER']; //前一URL
if ($refer) {
$referhost = parse_url($refer);
/**来源地址主域名**/
$host = strtolower($referhost['host']);
if ($host == $_SERVER['HTTP_HOST'] || in_array($host, $domain_list)) {
$status = true;
}
}
return $status;
}
//列出指定目录下的图片
$CONFIG = array();
$CONFIG['imageManagerAllowFiles'] = array(".png", ".jpg", ".jpeg", ".gif", ".bmp");
$base_Path = '/picture/'; //默认主目录
$category = 'a'; //默认分类目录
if ($_GET['folder']) {
$folder = trim($_GET['folder']);
$CONFIG['imageManagerListPath'] = $base_Path . $folder . '/'; //有GET访问的分类目录
} else {
$CONFIG['imageManagerListPath'] = $base_Path . $category . '/'; //无GET访问的默认目录
}
$allowFiles = $CONFIG['imageManagerAllowFiles'];
$path = $CONFIG['imageManagerListPath'];
$allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);
//获取文件列表
$path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == "/" ? "" : "/") . $path;
$files = getfiles($path, $allowFiles);
if (!count($path)) {
return "抱歉,没有找到匹配的文件!";
}
//获取指定范围的列表
$len = count($files);
for ($i = 0, $list = array(); $i < $len; $i++) {
$list[] = $files[$i];
}
$rand = array_rand($list, 1);
$img = $list[$rand];
$imgFile = $_SERVER['DOCUMENT_ROOT'] . (substr($list[$rand], 0, 1) == "/" ? "" : "/") . $img;
$imgNot = $_SERVER['DOCUMENT_ROOT'] . '/' . 'nico.gif'; //无授权域名图片
$refer = $_SERVER['HTTP_REFERER']; //前一URL
//存在前一URL
if ($refer) {
if (!checkReferer()) {
$karnc->getdir($imgNot);
$karnc->img2data();
$karnc->data2img();
die;
} else {
$karnc->getdir($imgFile);
$karnc->img2data();
$karnc->data2img();
die;
}
} else {
//直接访问API地址
$imgWeb = file_get_contents('imgweb.html');
echo $imgWeb;
die;
}
?>
imgdata.php
<?php
class imgdata{
public $imgsrc;
public $imgdata;
public $imgform;
public function getdir($source){
$this->imgsrc = $source;
}
public function img2data(){
$this->_imgfrom($this->imgsrc);
return $this->imgdata=fread(fopen($this->imgsrc,'rb'),filesize($this->imgsrc));
}
public function data2img(){
header("content-type:$this->imgform");
echo $this->imgdata;
}
public function _imgfrom($imgsrc){
$info=getimagesize($imgsrc);
return $this->imgform = $info['mime'];
}
}
?>
多文件夹说明: 第二个文件夹无需配置,直接使用 URL 传递参数即可。
比如: 默认文件夹的分类,调用的域名是:“ 你的域名/images ”
其它文件夹的分类,调用是域名是:“ 你的域名/images/文件夹名 ”
注意! 若要使用随机数调用,必须启用 Apache 或者 Nginx 的伪静态功能,否则空白输出。
Nginx 用户需要手动添加 nginx.conf 文件里面的伪静态规则到你的域名配置中去……
Nginx 伪静态:
rewrite ^/images$ /images.php last;
rewrite ^/images/(.*?)$ /images.php?folder=$1 last;
#下面是子目录例子:
rewrite ^/api/images$ /api/images.php last;
rewrite ^/api/images/(.*?)$ /api/images.php?folder=$1 last;
Apache伪静态:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^images$ images.php [L,QSA]
RewriteRule ^images/(.*?)$ images.php?folder=$1 [L]
</IfModule>
使用随机数载入的情况通常在一个页面多次调用随机图的时候,比如首页文章列表,否则图片都是一样的。
随机数载入方式:“ 你的域名/images?随机数 ” ,就是原有 URL 上添加一个英文问号和任意随机数。
示例:
<img src="https://song.acg.sx/images">
<img src="https://song.acg.sx/images/acg">
<img src="https://song.acg.sx/images?d8c196951e5bbf3edd158de4">
<img src="https://song.acg.sx/images/acg?9f0d34f8ee6f96b56d8902d1">
声明:本站文章原创有部分资源来源于网络,如无特殊说明或标注。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系 admin@liitk.com 进行删除处理!。
评论(0)