随机图,其工作原理和之前的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
作者
Mundanity Fan
发布于
2021-01-14
许可协议