- 优化二级目录使用

master
icret 7 months ago
parent 9f512bcf2d
commit 0f89648b76

@ -124,7 +124,7 @@ if (isset($_POST['password']) and isset($_POST['user'])) {
<img src="<?php echo $config['login_bg']; ?>" alt="简单图床登陆界面背景图" />
</div>
<div class="formBx">
<form class="form-horizontal" action="/admin/index.php" method="post" onsubmit="return md5_post()">
<form class="form-horizontal" action="index.php" method="post" onsubmit="return md5_post()">
<h2>登录</h2>
<label for="account" class="col-sm-2"></label>
<input type="text" name="user" id="account" class="form-control" value="" placeholder="输入登录账号" autocomplete="off" required="required">

@ -1,6 +1,5 @@
<?php
namespace Verot\Upload;
require_once __DIR__ . '/../app/function.php';

@ -1,73 +1,114 @@
<?php
/**
* 图床公共信息查询APi
* 2022年2月22日11:41:38
* 图床公共信息查询API
* 2024年04月07日 08:00:00
* @author Icret
*/
// 定义常量以替换魔术字符串
const TIME_KEY = 'total_time';
const TODAY_UPLOAD_KEY = 'todayUpload';
const YESTERDAY_UPLOAD_KEY = 'yestUpload';
const USAGE_SPACE_KEY = 'usage_space';
const FILENUM_KEY = 'filenum';
const DIRNUM_KEY = 'dirnum';
require_once '../app/chart.php';
// 检查是否开启查询
if ($config['public'] === 0) die('开放数据接口已关闭!');
// 获得get值
$show = (empty($_GET['show'])) ? die('没有参数!') : htmlspecialchars($_GET['show']);
if ($config['public'] === 0) {
http_response_code(403); // 返回403 Forbidden
die('开放数据接口已关闭!');
}
// 检查是否在允许范围内
if (!in_array($show, $config['public_list'])) die('没有权限或参数错误!');
// 获取并验证GET参数
$show = isset($_GET['show']) ? trim($_GET['show']) : '';
if (!$show || !in_array($show, $config['public_list'])) {
http_response_code(400); // 返回400 Bad Request
die('没有权限或参数错误!');
}
// 根据请求返回值
switch ($show) {
try {
// 根据请求返回值
switch ($show) {
// 统计时间
case 'time':
echo read_total_json('total_time');
break;
case 'time':
echo read_total_json(TIME_KEY);
break;
// 今日上传
case 'today':
echo read_total_json('todayUpload');
break;
case 'today':
echo read_total_json(TODAY_UPLOAD_KEY);
break;
// 昨日上传
case 'yesterday':
echo read_total_json('yestUpload');
break;
case 'yesterday':
echo read_total_json(YESTERDAY_UPLOAD_KEY);
break;
// 总空间
case 'total_space':
echo getDistUsed(disk_total_space('.'));
break;
case 'total_space':
echo getDistUsed(disk_total_space('.'));
break;
// 已用空间
case 'used_space':
echo getDistUsed(disk_total_space('.') - disk_free_space('.'));
break;
case 'used_space':
$totalSpace = disk_total_space('.');
if ($totalSpace !== false && is_numeric($totalSpace)) {
$freeSpace = disk_free_space('.');
if ($freeSpace !== false && is_numeric($freeSpace)) {
echo getDistUsed($totalSpace - $freeSpace);
} else {
throw new Exception('无法获取磁盘剩余空间');
}
} else {
throw new Exception('无法获取磁盘总空间');
}
break;
// 剩余空间
case 'free_space':
echo getDistUsed(disk_free_space('/'));
break;
case 'free_space':
$freeSpace = disk_free_space('/');
if ($freeSpace !== false && is_numeric($freeSpace)) {
echo getDistUsed($freeSpace);
} else {
throw new Exception('无法获取磁盘剩余空间');
}
break;
// 图床使用空间
case 'image_used':
echo read_total_json('usage_space');
break;
case 'image_used':
echo read_total_json(USAGE_SPACE_KEY);
break;
// 文件数量
case 'file':
echo read_total_json('filenum');
break;
case 'file':
echo read_total_json(FILENUM_KEY);
break;
// 文件夹数量
case 'dir':
echo read_total_json('dirnum');
break;
case 'month':
foreach (read_chart_total()['number'] as $value)
echo $value;
break;
case 'dir':
echo read_total_json(DIRNUM_KEY);
break;
// 修复"month"分支的逻辑
case 'month':
$chartTotal = read_chart_total();
if (isset($chartTotal['number']) && is_array($chartTotal['number'])) {
foreach ($chartTotal['number'] as $value) {
echo $value;
}
} else {
throw new Exception('无法获取图表总数中的“number”数据');
}
break;
default:
return read_chart_total();
break;
}
default:
echo read_chart_total();
break;
}
} catch (Exception $e) {
http_response_code(500); // 返回500 Internal Server Error
die("发生错误: " . $e->getMessage());
}

@ -24,7 +24,7 @@
// 设置html为utf8
header('Content-Type:text/html;charset=utf-8');
// 定义根目录
define('APP_ROOT', str_replace('\\', '/', realpath(dirname(__FILE__) . '/../')));
define('APP_ROOT', str_replace(DIRECTORY_SEPARATOR, '/', realpath(dirname(__FILE__) . '/../')));
// 时区设置 https://www.php.net/manual/zh/timezones.php
require_once APP_ROOT . '/config/config.php';
empty($config['timezone']) ? date_default_timezone_set('Asia/Shanghai') : date_default_timezone_set($config['timezone']);

@ -586,7 +586,7 @@ function getDel($url, $type)
$url = urldecode(trim($url));
if ($type == 'url') {
$url = $_SERVER['DOCUMENT_ROOT'] . $url;
$url = APP_ROOT . $url;
}
if ($type == 'hash') {
$url = APP_ROOT . $url;
@ -643,7 +643,7 @@ function easyimage_delete($url, $type)
$url = urldecode(trim($url));
if ($type == 'url') {
$url = $_SERVER['DOCUMENT_ROOT'] . $url;
$url = APP_ROOT . $url;
}
if ($type == 'hash') {
$url = APP_ROOT . $url;
@ -1544,7 +1544,7 @@ function write_upload_logs($filePath, $sourceName, $absolutePath, $fileSize, $fr
// $name = trim(basename($filePath), " \t\n\r\0\x0B"); // 当前图片名称
$log = array(basename($filePath) => array( // 以上传图片名称为Array
'source' => htmlspecialchars($sourceName), // 原始文件名称
'source' => htmlspecialchars($sourceName), // 原始文件名称
'date' => date('Y-m-d H:i:s'), // 上传日期
'ip' => real_ip(), // 上传IP
'port' => $_SERVER['REMOTE_PORT'], // IP端口

@ -68,7 +68,7 @@ class Ip2Region
$geo = $this->memorySearch($ip);
$arr = explode('|', str_replace(['0|'], '|', isset($geo['region']) ? $geo['region'] : ''));
if (($last = array_pop($arr)) === '内网IP') $last = '';
return join('', $arr) . (empty($last) ? '' : "[{$last}]");
return join('', $arr) . (empty($last) ? '' : "【{$last}】");
}
/**

@ -126,7 +126,7 @@ class XdbSearcher
// read the vector index block
$buff = $this->read(self::HeaderInfoLength + $idx, 8);
if ($buff === null) {
throw new Exception("failed to read vector index at ${idx}");
throw new Exception("failed to read vector index at {$idx}");
}
$sPtr = self::getLong($buff, 0);
@ -147,7 +147,7 @@ class XdbSearcher
// read the segment index
$buff = $this->read($p, self::SegmentIndexSize);
if ($buff == null) {
throw new Exception("failed to read segment index at ${p}");
throw new Exception("failed to read segment index at {$p}");
}
$sip = self::getLong($buff, 0);

Binary file not shown.

@ -31,17 +31,17 @@ Thumb::show($src, $w, $h);
* 2022-1-30 06:35:08
*
* TimThumb参数指南
* 命令 作用 参数 描述
* src 源 图像URL 告诉TimThumb调整哪个图片
* w 宽度 宽度调整 调整输出图像的宽度
* h 高度 高度调整 调整输出图像的高度
* q 质量 0 - 100 压缩质量值越大质量越高。不建议高于95
* a 对齐 c, t, l, r, b, tl, tr, bl, br 图像对齐。 c = center, t = top, b = bottom, r = right, l = left。 可以创建对角位置
* zc 缩放/裁剪 0、1、2、3 0根据传入的值进行缩放不裁剪 1以最合适的比例裁剪和调整大小裁剪 2按比例调整大小并添加边框裁剪3按比例调整大小不添加边框裁剪
* f 过滤器 太多了 可以改变亮度/对比度;甚至模糊图像
* s 锐化 锐化 使得按比例缩小图片看起来有点;更清晰
* cc 画布上的颜色 十六进制的颜色值(# ffffff) 改变背景颜色。 大多数更改缩放和作物设置时使用,进而可以添加图像边界。
* ct 画布透明度 true (1) 使用透明而忽略背景颜色
* 命令 作用 参数 描述
* src 源文件 图像URL 告诉TimThumb调整哪个图片
* w 宽度 宽度调整 调整输出图像的宽度
* h 高度 高度调整 调整输出图像的高度
* q 质量 0-100 压缩质量值越大质量越高。不建议高于95
* a 对齐 c, t, l, r, b, tl, tr, bl, br 图像对齐。 c = center, t = top, b = bottom, r = right, l = left。 可以创建对角位置
* zc 缩放/裁剪 0、1、2、3 0 根据传入的值进行缩放(不裁剪), 1以最合适的比例裁剪和调整大小裁剪 2按比例调整大小并添加边框裁剪3按比例调整大小不添加边框裁剪
* f 过滤器 太多了 可以改变亮度/对比度;甚至模糊图像
* s 锐化 锐化 使得按比例缩小图片看起来有点;更清晰
* cc 画布颜色 #ffffff 改变背景颜色。 大多数更改缩放和作物设置时使用,进而可以添加图像边界。
* ct 画布透明度 true (1) 使用透明而忽略背景颜色
*/
require_once __DIR__ . '/function.php';
@ -74,7 +74,6 @@ $ALLOWED_SITES = array(
$config['imgurl'],
);
/**
* 修复无法生成生成webp动态图片的缩略图bug
*/

@ -42,7 +42,6 @@ try {
throw new Exception('<div class="alert alert-info">没有上传日志!<div>');
}
} catch (Exception $e) {
echo $e->getMessage();
require_once APP_ROOT . '/app/footer.php';
exit;
}
@ -176,7 +175,7 @@ try {
checkImg: '<?php echo strstr('OFF', $v['checkImg']) ? '否' : '是'; ?>',
from: '<?php echo is_string($v['from']) ? "网页" : 'API: ' . $v['from']; ?>',
manage: '<div class="btn-group"><a href="<?php echo rand_imgurl() . $v['path']; ?>" target="_blank" class="btn btn-mini btn-success">查看</a> <a href="/app/info.php?img=<?php echo $v['path']; ?>" target="_blank" class="btn btn-mini">信息</a><a href="#" onclick="ajax_post(\'<?php echo $v['path']; ?>\',\'recycle\')" class="btn btn-mini btn-info">回收</a> <a href="#" onclick="ajax_post(\'<?php echo $v['path']; ?>\',\'delete\')" class="btn btn-mini btn-danger">删除</a></div>',
},
},
<?php endforeach; ?>
]
},

@ -1,67 +1,94 @@
返回状态可以参考 [常见状态代码](./常见状态代码.md)
- 上传成功后返回JSON
### 上传成功后返回JSON示例
```json
{
"result":"success","code":200,
"result":"success",
"code":200,
"url":"https:\/\/i2.100024.xyz\/2023\/01\/24\/10gwv0y-0.webp",
"srcName":"195124",
"thumb":"https:\/\/png.cm\/application\/thumb.php?img=\/i\/2023\/01\/24\/10gwv0y-0.webp",
"del":"https:\/\/png.cm\/application\/del.php?hash=bW8vWG4vcG8yM2pLQzRJUGI0dHlTZkN4L2grVmtwUTFhd1A4czJsbHlMST0="
}
```
- 返回示例解释
`result` 返回状态
`code` 返回状态编号 参考[常见状态代码](./常见状态代码.md)
`url` 文件链接
`srcName` 原始名称
`thumb` 缩略图
`del` 文件删除链接
### 上传示例 仅供参考
- html示例
- html
```html
<form action="http://127.0.0.1/api/index.php" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*">
<input type="text" name="token" placeholder="在tokenList文件找到token并输入" /> <input type="submit" />
<input type="file" name="image" accept="image/*" required>
<input type="text" name="token" placeholder="在tokenList文件找到token并输入" required>
<input type="submit" value="上传">
</form>
```
- Python示例
- Python
```python
```Python
import requests
url = "https://png.cm/api/index.php"
# 本地图片文件路径
image_path = "/path/to/your/image.jpg"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n8337effca0ddfcd9c5899f3509b23657\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n195124.jpg\r\n-----011000010111000001101001--\r\n\r\n"
headers = {"content-type": "multipart/form-data; boundary=---011000010111000001101001"}
# token值需从实际来源获取例如读取tokenList文件
token = "your_token_value_here"
response = requests.request("POST", url, data=payload, headers=headers)
# 目标URL
url = "http://127.0.0.1/api/index.php"
print(response.text)
# 构建请求参数
files = {'image': open(image_path, 'rb')}
data = {'token': token}
# 发送POST请求
response = requests.post(url, files=files, data=data)
# 检查响应状态码
if response.status_code == 200:
print("Upload successful.")
else:
print(f"Upload failed with status code {response.status_code}.")
```
- curl示例
```curl
curl --request POST \
--url https://png.cm/api/index.php \
--header 'content-type: multipart/form-data' \
--form token=8337effca0ddfcd9c5899f3509b23657 \
--form image=@195124.jpg
- Curl
```CURL
curl -X POST http://127.0.0.1/api/index.php \
-F "image=@/path/to/your/file/example.jpg" \
-F "token=your_token"
```
- JQuery示例
```jQuery
const form = new FormData();
form.append("token", "8337effca0ddfcd9c5899f3509b23657");
form.append("image", "195124.jpg");
const settings = {
"async": true,
"crossDomain": true,
"url": "https://png.cm/api/index.php",
"method": "POST",
"headers": {},
"processData": false,
"contentType": false,
"mimeType": "multipart/form-data",
"data": form
};
$.ajax(settings).done(function (response) {
console.log(response);
- JQuery
```JAVASCRIPT
// 获取文件和token
var file = document.querySelector('input[type="file"]').files[0];
var token = $('input[name="token"]').val();
// 创建FormData对象
var formData = new FormData();
formData.append('image', file);
formData.append('token', token);
// 发起上传请求
$.ajax({
url: 'http://127.0.0.1/api/index.php',
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(response) {
console.log('文件上传成功');
},
error: function(xhr, status, error) {
console.error('文件上传失败: ' + error);
}
});
```

@ -1,5 +1,8 @@
* 2024-03-04 v2.8.5
- 返回状态统一
* 2024-04-08 v2.8.5
- 优化API示例
- 优化二级目录使用
- 修复对PHP8.2支持
- 上传返回状态统一
- 增加返回状态文档解释
- 增加通过文件md5禁止上传

Loading…
Cancel
Save