随机图,其工作原理和之前的hitokoto的工作原理并没有太大的区别,只不过一个返回的是字符串,另一个返回的是图片的url。
最简易的随机图方法不过是在一个文件夹中有序地编号一群图片,然后通过php随机函数走一个header链接即可。这种方法应该是最简单的方法,实现办法也很简单,大概如下即可
$target=mt_rand(1,$maxid);//随机一个图片的编号
$target_url="Location:....../".$target.".png/jpg/..../webp";//跳转到该图片
但是这样的方法局限性也显而易见,那就是无法灵活的添加内容或者以制定类型获取,如果要进行,那就必须要修改好几处位置。显然这不是一个好方法。
那么这里提供一个简单的思路,大概如下
- 可以随意上传各种类型的图片
- 可以指定图片的类型获取
- 上传图片需要进行身份认证
大概如上即可。下面给出代码。
首先是上传部分的代码。
<?php
session_start();
//检测是否登录,若没登录则转向登录界面
if(!isset($_SESSION['userid'])){
echo("此项操作需要登陆后进行,即将为您跳转到登陆界面");
header("Refresh:5;url=login.html");
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>上传</title>
</head>
<body align = "center">
<h4>随机图上传API</h4>
<br />
<form enctype="multipart/form-data" method="post">
<label for="img">请选择上传的文件</label><br />
<input type="file" name="img" size="40" />
<input type="submit" name="submit" value="确定" />
</form><br />
</body>
<?php
function filerename($type,$ext){
include("./connect/mysql.php");//存放MySQL服务器连接信息,注意文件的权限
switch ($type){
case 1:
$table="vertical";
$prefix="v";//前缀
break;
case 2:
$table="horizontal";
$prefix="h";
break;
case 3:
$table="square";
$prefix="s";
break;
}
$dbname="imgapi";
$conn=mysqli_connect($servername,$username,$password,$dbname);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
mysqli_query($conn , "set names utf8");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$sql = mysqli_query($conn,"SELECT max(id) FROM $table;");
if($result = mysqli_fetch_array($sql)) {
$max=$result["max(id)"]+1;
}
$new_name = $prefix.$max.".".$ext;//新文件名
mysqli_query($conn,"INSERT INTO $table (id,ext) VALUES ('$max','$ext');");//储存到数据库,包含其编号和文件类型
return $new_name;
}
?>
<?php
if (!empty($_FILES)) {
if($_FILES['img']['size'] > 10485760) {
exit("对不起,您上传的照片超过了2M=10,485,760");
}
if($_FILES["img"]["error"] > 0){
switch ($_FILES["img"]["error"]){
case 1:
exit("文件大小超过了upload_max_filesize的值");
case 2:
exit("上传文件的大小超过了MAX_FILE_SIZE的值");
case 3:
exit("文件部分上传");
case 4:
exit("文件全部上传");
}
}
//获取文件后缀并检查
$rawname=$_FILES["img"]["name"];
$ext=explode(".", $rawname);
$ext=array_pop($ext);
$ext=strtolower($ext);
//指定的文件类型
$valid_ext=array("jpg","png","webp","bmp","gif","tif");
if(!in_array($ext,$valid_ext)) exit("文件格式错误");
//获取长宽比
list($width,$height)=getimagesize($_FILES["img"]["tmp_name"]);
if($height/$width>1.3)
{
$type=1;//垂直图片
}elseif ($width/$height>1.3){
$type=2;//水平图片
}else{
$type=3;//方形图片
}
$path="imgapi/";//存储路径
move_uploaded_file($_FILES["img"]["tmp_name"],$path.filerename($type,$ext));
echo "\n文件上传成功!","<br /> \n";
}
之后是api的代码
<?php
function geturl($type){
include("./connect/mysql.php");
$dbname="imgapi";
$conn=mysqli_connect($servername,$username,$password,$dbname);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
mysqli_query($conn , "set names utf8");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
switch ($type){
case "v":
$table="vertical";
$prefix="v";
break;
case "h":
$table="horizontal";
$prefix="h";
break;
case "s":
$table="square";
$prefix="s";
break;
}
$sql = mysqli_query($conn,"SELECT max(id) FROM $table;");
if($result = mysqli_fetch_array($sql)) {
$max=$result["max(id)"];
}
$target_id=mt_rand(1,$max);
$sql2 = mysqli_query($conn,"SELECT id,ext FROM $table WHERE id='$target_id';");
if($result = mysqli_fetch_array($sql2)) {
//从数据库中获取指定编号的后缀
$filename=$result['id'];
$file_ext=$result['ext'];
}
$target_url="Location:/imgapi/".$prefix.$filename.".".$file_ext;
header($target_url);//链接跳转
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>随机图片API接口</title>
</head>
<body align = "center">
<h4>类型选择</h4>
<p>当您以没有任何参数的条件下访问本接口时,会停留在并页面</p>
<p>本页面会提供几种API的访问参数形式</p>
<br />
<form action="imgapi.php" method="get">
<p><input type="radio" value="h" name="type"/>水平图片,即?type=h</p>
<p><input type="radio" value="v" name="type"/>垂直图片,即?type=v</p>
<p><input type="radio" value="s" name="type"/>方形图片,即?type=s</p>
<input type="submit" name="submit" value="确定" />
</form>
</body>
<?php
if(!empty($_GET)){
$type=$_GET["type"];
geturl($type);
}
简易随机图API的制作
https://Mundnaity.moe/post/Make-Your-Own-RandomImg