v2.8.4
|
@ -10,7 +10,7 @@ require_once APP_ROOT . '/config/config.guest.php';
|
|||
|
||||
// 是否关闭图床设置
|
||||
if ($config['show_admin_inc'] === 0) {
|
||||
echo '<h2 class="alert alert-danger">已关闭图床设置~~ <br><small>再次开启请修改config.php文件: <code>\'show_admin_inc\' => 0</code></small></h2>';
|
||||
echo '<h2 class="alert alert-danger">已关闭图床设置~~ <br><small>再次开启请修改config.php文件: <code>\'show_admin_inc\' => 1,</code></small></h2>';
|
||||
exit(require_once APP_ROOT . '/app/footer.php');
|
||||
}
|
||||
|
||||
|
@ -247,80 +247,6 @@ if (isset($_REQUEST['delDir'])) {
|
|||
header("refresh:1;url=/admin/admin.inc.php");
|
||||
}
|
||||
|
||||
// 监黄恢复图片
|
||||
if (isset($_GET['suspic_reimg'])) {
|
||||
$name = $_GET['suspic_reimg'];
|
||||
if (re_checkImg($name)) {
|
||||
echo "
|
||||
<script>
|
||||
new $.zui.Messager('恢复成功', {
|
||||
type: 'success', // 定义颜色主题
|
||||
icon: 'ok'
|
||||
}).show();
|
||||
</script>
|
||||
";
|
||||
} else {
|
||||
echo "
|
||||
<script>
|
||||
new $.zui.Messager('文件不存在!', {
|
||||
type: 'danger', // 定义颜色主题
|
||||
icon: 'warning-sign'
|
||||
}).show();
|
||||
</script>
|
||||
";
|
||||
}
|
||||
header("refresh:1;url=/admin/admin.inc.php");
|
||||
}
|
||||
|
||||
// 回收站恢复图片
|
||||
if (isset($_GET['recycle_reimg'])) {
|
||||
$name = $_GET['recycle_reimg'];
|
||||
if (re_checkImg($name, 'recycle/')) {
|
||||
echo "
|
||||
<script>
|
||||
new $.zui.Messager('恢复成功', {
|
||||
type: 'success', // 定义颜色主题
|
||||
icon: 'ok'
|
||||
}).show();
|
||||
</script>
|
||||
";
|
||||
} else {
|
||||
echo "
|
||||
<script>
|
||||
new $.zui.Messager('文件不存在!', {
|
||||
type: 'danger', // 定义颜色主题
|
||||
icon: 'warning-sign'
|
||||
}).show();
|
||||
</script>
|
||||
";
|
||||
}
|
||||
|
||||
header("refresh:1;url=/admin/admin.inc.php");
|
||||
}
|
||||
|
||||
// 删除版本信息文件
|
||||
if (isset($_POST['del_version_file'])) {
|
||||
try {
|
||||
unlink(APP_ROOT . $_POST['del_version_file']);
|
||||
echo "
|
||||
<script>
|
||||
new $.zui.Messager('更新版本号成功', {
|
||||
type: 'success', // 定义颜色主题
|
||||
icon: 'ok'
|
||||
}).show();
|
||||
</script>
|
||||
";
|
||||
} catch (Exception $e) {
|
||||
echo "
|
||||
<script>
|
||||
new $.zui.Messager('更新版本号失败', {
|
||||
type: 'danger', // 定义颜色主题
|
||||
icon: 'ok'
|
||||
}).show();
|
||||
</script>
|
||||
";
|
||||
}
|
||||
}
|
||||
auto_delete(); //定时删除
|
||||
?>
|
||||
<div class="row">
|
||||
|
@ -331,6 +257,7 @@ auto_delete(); //定时删除
|
|||
<li><a data-tab href="#Content9">界面设置</a></li>
|
||||
<li><a data-tab href="#Content2">上传设置</a></li>
|
||||
<li><a data-tab href="#Content12">水印设置</a></li>
|
||||
<li><a data-tab href="#Content15">远程附件</a></li>
|
||||
<li><a data-tab href="#Content5">API 设置</a></li>
|
||||
<li><a data-tab href="#Content13">上传压缩</a></li>
|
||||
<li><a data-tab href="#Content4">压缩图片</a></li>
|
||||
|
@ -400,7 +327,7 @@ auto_delete(); //定时删除
|
|||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<div class="form-group col-md-12">
|
||||
<div class="form-group col-md-1">
|
||||
<label data-toggle="tooltip" title="前后需加'/' 例: /i/">存储目录</label>
|
||||
<label data-toggle="tooltip" title="前后需加'/'">存储目录</label>
|
||||
<input type="text" class="form-control" name="path" required="required" value="<?php echo $config['path']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')" title="可根据Apache/Nginx配置安全,参考: https://blog.png.cm/981.html 或 README.md">
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
|
@ -411,12 +338,12 @@ auto_delete(); //定时删除
|
|||
<label data-toggle="tooltip" title="不懂就不要改本图床仅针对图片上传,如果想上传其他类型文件请更改此出,不同mime请以英文,分割">允许的MIME类型</label>
|
||||
<input type="text" class="form-control" name="mime" required="required" value="php echo $config['mime'];" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div> -->
|
||||
<div class="form-group col-md-4">
|
||||
<label data-toggle="tooltip" title="请以英文 , 分割 最后一个不加 , <br/>想上传图片以外的格式?请关闭图床安全->图床模式">允许的扩展名</label>
|
||||
<div class="form-group col-md-3">
|
||||
<label data-toggle="tooltip" title="请以英文 , 分割 最后一个不加 , <br/>非图片格式需在图床安全中关闭图床模式">允许的扩展名 | 非图片格式?</label>
|
||||
<input type="text" class="form-control" name="extensions" required="required" value="<?php echo $config['extensions']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label>已上传文件的命名方式</label>
|
||||
<div class="form-group col-md-2">
|
||||
<label>上传文件的命名方式</label>
|
||||
<select class="chosen-select form-control" name="imgName">
|
||||
<option value="default" <?php if ($config['imgName'] == 'default') echo 'selected'; ?>>默认 - 36进制时间+随机数 >> vx77yu</option>
|
||||
<option value="date" <?php if ($config['imgName'] == 'date') echo 'selected'; ?>>时间 >> 192704</option>
|
||||
|
@ -442,37 +369,44 @@ auto_delete(); //定时删除
|
|||
<option value="bmp" <?php if ($config['imgConvert'] == 'bmp') echo 'selected'; ?>>BMP</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label for="chunks" data-toggle="tooltip" title="开启分片后粘贴上传失效<br/>可能使部分文件上传失败<br/>建议最小1Mb(1048576字节)">分片上传 | 设置<code>0</code>关闭</label>
|
||||
<div class="input-group">
|
||||
<input type="number" min="0" class="form-control" id="chunks" name="chunks" required="required" value="<?php echo !empty($config['chunks']) ? $config['chunks'] : 0; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
<span class="input-group-addon">byte</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-12">
|
||||
<div class="form-group">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-6">
|
||||
<label>单次最多上传 | 当前: </label><label id="maxUploadFiles"><?php echo $config['maxUploadFiles']; ?></label><label>张</label>
|
||||
<input type="range" class="form-control" name="maxUploadFiles" value="<?php echo $config['maxUploadFiles']; ?>" min="1" max="200" step="1" onchange="document.getElementById('maxUploadFiles').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-6">
|
||||
<label>最大上传宽度 | 当前: </label><label id="maxWidth"><?php echo $config['maxWidth']; ?></label><label>px</label>
|
||||
<input type="range" class="form-control" name="maxWidth" value="<?php echo $config['maxWidth']; ?>" min="1024" max="51200" step="1024" onchange="document.getElementById('maxWidth').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-6">
|
||||
<label>最大上传高度 | 当前: </label><label id="maxHeight"><?php echo $config['maxHeight']; ?></label><label>px</label>
|
||||
<input type="range" class="form-control" name="maxHeight" value="<?php echo $config['maxHeight']; ?>" min="1024" max="51200" step="1024" onchange="document.getElementById('maxHeight').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-6">
|
||||
<label>单文件最大上传(1-100MB) | 当前: </label><label id="maxSize"><?php echo $config['maxSize'] / 1024 / 1024; ?></label><label>MB</label>
|
||||
<input type="range" class="form-control" name="maxSize" value="<?php echo $config['maxSize']; ?>" min="1048576" max="104857600" step="1048576" onchange="document.getElementById('maxSize').innerHTML=value/1024/1024">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-6">
|
||||
<label>最小上传宽度 | 当前: </label><label id="minWidth"><?php echo $config['minWidth']; ?></label><label>px</label>
|
||||
<input type="range" class="form-control" name="minWidth" value="<?php echo $config['minWidth']; ?>" min="5" max="1024" step="10" onchange="document.getElementById('minWidth').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-6">
|
||||
<label>最小上传高度 | 当前: </label><label id="minHeight"><?php echo $config['minHeight']; ?></label><label>px</label>
|
||||
<input type="range" class="form-control" name="minHeight" value="<?php echo $config['minHeight']; ?>" min="5" max="1024" step="10" onchange="document.getElementById('minHeight').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-6">
|
||||
<input type="hidden" class="form-control" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">保存</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">保存</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="Content3">
|
||||
|
@ -584,12 +518,8 @@ auto_delete(); //定时删除
|
|||
<button type="submit" class="btn btn-primary">查看</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<h5 class="header-dividing">登录日志 <small>仅显示当月</small></h5>
|
||||
<button type="button" class="btn btn-primary" data-toggle="modal" data-title="登录日志 - 仅显示当月" data-icon="book" data-moveable="true" data-width="60%" data-type="ajax" data-url="../app/viewlog.php?login_log&sign=<?php echo md5($config['password'] . date('ymdh')); ?>">查看</button>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h5 class="header-dividing" data-toggle="tooltip" title="仅限存储分类路径为 Y/m/d/ 格式<br/>且每天需要访问一次后台才执行<br/>先重命名要删除文件夹作为备份<br/>超过定时日期的2倍后再彻底删除重命名的文件夹<br/>超过定时日期前和开启分离的文件夹不删除">定时删除 <small>数值为<code>0</code>时关闭</small></h5>
|
||||
<h5 class="header-dividing" data-toggle="tooltip" title="仅限存储分类路径为 Y/m/d/ 格式<br/>且每天需要访问一次后台才执行<br/>先重命名要删除文件夹作为备份<br/>超过定时日期的2倍时间后再删除重命名的文件夹<br/>超过定时日期前和开启分离的文件夹不删除">定时删除 <small>设置<code>0</code>关闭</small></h5>
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">天数</span>
|
||||
|
@ -600,18 +530,24 @@ auto_delete(); //定时删除
|
|||
</form>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h5 class="header-dividing">清理缓存 <small>已缓存: <?php echo getFileNumber(APP_ROOT . $config['path'] . 'cache/') . '个 | 占 ' . getDistUsed(getDirectorySize(APP_ROOT . $config['path'] . 'cache/')); ?></small></h5>
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<button type="submit" class="btn btn-success" name="delDir" value="cache/" onClick="return confirm('确认要清理缓存?\n* 删除文件夹后将无法恢复! ');"><i class="icon icon-trash"> 清理缓存</i></button>
|
||||
</form>
|
||||
<h5 class="header-dividing">缩略图缓存 <small><?php echo getFileNumber(APP_ROOT . $config['path'] . 'cache/') . '个 | 占 ' . getDistUsed(getDirectorySize(APP_ROOT . $config['path'] . 'cache/')); ?></small></h5>
|
||||
<button type="button" class="btn btn-primary" onclick="ajax_post('cache/','delDir')"><i class="icon icon-trash"> 清理缓存</i></button>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<h5 class="header-dividing" data-toggle="tooltip" title="如果开启OPcache 点击重置缓存">OPcache</h5>
|
||||
<button type="button" class="btn btn-primary" onclick="ajax_post('OPcache','OPcache')">重置</button>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<h5 class="header-dividing" data-toggle="tooltip" title="仅显示当月">登录日志</h5>
|
||||
<button type="button" class="btn btn-primary" data-toggle="modal" data-title="登录日志 - 仅显示当月" data-icon="book" data-moveable="true" data-width="60%" data-type="ajax" data-url="../app/viewlog.php?login_log&sign=<?php echo md5($config['password'] . date('ymdh')); ?>">查看</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<h5 class="header-dividing">缩略图</h5>
|
||||
<h5 class="header-dividing"></h5>
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<div class="form-group col-md-12">
|
||||
<div class="form-group col-md-6 col-xs-12">
|
||||
<label data-toggle="tooltip" title="请选择合适的缩略图生成方式">生成方式</label>
|
||||
<label data-toggle="tooltip" title="请选择合适的缩略图生成方式">缩略图生成方式</label>
|
||||
<div class="input-group" data-toggle="tooltip" title="原图 | 直接输出上传链接,会导致流量增加<br/>TimThumb (推荐) | 优点: 带缓存周期 | 缺点: cdn无法缓存<br/>上传生成 | 优点: 缩略图直链,缓存不失效 | 低配vps负载较大,影响前端上传速度">
|
||||
<span class="input-group-addon">生成模式</span>
|
||||
<select class="form-control" name="thumbnail">
|
||||
|
@ -622,7 +558,7 @@ auto_delete(); //定时删除
|
|||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-6 col-xs-12">
|
||||
<label data-toggle="tooltip" title="已生成的缩略图不会失效 需清理缓存">生成大小</label>
|
||||
<label data-toggle="tooltip" title="已生成的缩略图不会失效 需清理缓存">缩略图生成大小</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">宽</span>
|
||||
<input type="number" name="thumbnail_w" class="form-control" min="5" placeholder="258" value="<?php echo $config['thumbnail_w']; ?>" required="required">
|
||||
|
@ -633,27 +569,33 @@ auto_delete(); //定时删除
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="report" data-toggle="tooltip" title="举报地址支持Zoho表单、金数据、表单大师等<br/>(推荐ZOHO)留空则不显示">举报地址 <a href="https://store.zoho.com.cn/referral.do?servicename=ZohoForms&category=ZohoForms&ref=52f8a4e98a7a7d4c2475713784605af0dc842f6cc9732dd77f37b87f2959149e212e550f50a869f70360f15b80a4abc6" target="_blank"><i class="icon icon-external-link"></i></a></label>
|
||||
<input type="text" class="form-control" id="report" name="report" value="<?php echo $config['report']; ?>" placeholder="可以是网址或邮箱地址" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="static_cdn" value="0">
|
||||
<input type="checkbox" name="static_cdn" value="1" <?php if ($config['static_cdn']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">静态文件CDN地址 | 末尾不加'/'</label>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="report" data-toggle="tooltip" title="举报地址支持Zoho表单、金数据、表单大师等<br/>(推荐ZOHO)留空则不显示">举报地址 <a href="https://store.zoho.com.cn/referral.do?servicename=ZohoForms&category=ZohoForms&ref=52f8a4e98a7a7d4c2475713784605af0dc842f6cc9732dd77f37b87f2959149e212e550f50a869f70360f15b80a4abc6" target="_blank"><i class="icon icon-external-link"></i></a></label>
|
||||
<input type="text" class="form-control" id="report" name="report" value="<?php echo $config['report']; ?>" placeholder="可以是网址或邮箱地址" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="static_cdn" value="0">
|
||||
<input type="checkbox" name="static_cdn" value="1" <?php if ($config['static_cdn']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">静态文件CDN地址 | 末尾不加'/'</label>
|
||||
</div>
|
||||
<input type="url" class="form-control" name="static_cdn_url" value="<?php echo $config['static_cdn_url']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')" data-toggle="tooltip" title="jsdelivr可在后边添加版本号 例:@2.5.6">
|
||||
</div>
|
||||
</div>
|
||||
<input type="url" class="form-control" name="static_cdn_url" value="<?php echo $config['static_cdn_url']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')" data-toggle="tooltip" title="jsdelivr可在后边添加版本号 例:@2.5.6">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="check_ip" value="0">
|
||||
<input type="checkbox" name="check_ip" value="1" <?php if ($config['check_ip']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">黑/白IP名单上传</label>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="check_ip" value="0">
|
||||
<input type="checkbox" name="check_ip" value="1" <?php if ($config['check_ip']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">黑/白IP名单上传</label>
|
||||
</div>
|
||||
<textarea class="form-control" rows="4" name="check_ip_list" data-toggle="tooltip" title="每个IP以英文,结尾 支持IP段 例:123.23.23.44,193.134.*.*" placeholder=" 每个IP以英文,结尾 支持IP段 例:192.168.1.13,123.23.23.44,193.134.*.*" onkeyup="this.value=this.value.replace(/\s/g,'')"><?php echo $config['check_ip_list']; ?></textarea>
|
||||
<label class="radio-inline"><input type="radio" name="check_ip_model" value="0" <?php if ($config['check_ip_model'] == 0) echo 'checked'; ?>> 黑名单模式</label>
|
||||
<label class="radio-inline"><input type="radio" name="check_ip_model" value="1" <?php if ($config['check_ip_model'] == 1) echo 'checked'; ?>> 白名单模式</label>
|
||||
</div>
|
||||
</div>
|
||||
<textarea class="form-control" rows="3" name="check_ip_list" data-toggle="tooltip" title="每个IP以英文,结尾 支持IP段 例:123.23.23.44,193.134.*.*" placeholder=" 每个IP以英文,结尾 支持IP段 例:192.168.1.13,123.23.23.44,193.134.*.*"><?php echo $config['check_ip_list']; ?></textarea>
|
||||
<label class="radio-inline"><input type="radio" name="check_ip_model" value="0" <?php if ($config['check_ip_model'] == 0) echo 'checked'; ?>> 黑名单模式</label>
|
||||
<label class="radio-inline"><input type="radio" name="check_ip_model" value="1" <?php if ($config['check_ip_model'] == 1) echo 'checked'; ?>> 白名单模式</label>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<h5 class="header-dividing">高级设置 <?php if ($config['domain'] == $config['imgurl']) echo '<small> 网站域名与图片域名相同,锁定隐藏' . $config['path'] . '目录开关</small>'; ?></h5>
|
||||
|
@ -735,10 +677,10 @@ auto_delete(); //定时删除
|
|||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="关闭后将不能进入后台设置<br/>再次开启需修改config.php: <code>'show_admin_inc'=>0</code>">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="关闭后将不能进入后台设置<br/>再次开启需修改config.php: <code>'show_admin_inc'=>1,</code>">
|
||||
<input type="hidden" name="show_admin_inc" value="0">
|
||||
<input type="checkbox" name="show_admin_inc" value="1" <?php if ($config['show_admin_inc']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">显示设置</label>
|
||||
<label style="font-weight: bold">后台设置</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
|
@ -847,7 +789,16 @@ auto_delete(); //定时删除
|
|||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon" data-toggle="tooltip" title="点击查看所支持的时区列表">自定义时区 <a href="https://www.php.net/manual/zh/timezones.php" target="_blank"><i class="icon icon-external-link"></i></a>
|
||||
</span>
|
||||
<input class="form-control" type="text" name="timezone" value="<?php echo isset($config['timezone']) ? $config['timezone'] : 'Asia/Shanghai'; ?>" data-toggle="tooltip" title="默认时区(中国·上海) Asia/Shanghai" required="required" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<div class="input-group" data-toggle="tooltip" title="请输入限制数量 | 0 为不限制<br /> 开启监黄,水印等受网络波动和机器性能,执行完毕前限制不生效!">
|
||||
<span class="input-group-addon">游客上传限制</span>
|
||||
|
@ -856,7 +807,7 @@ auto_delete(); //定时删除
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<div class="input-group" data-toggle="tooltip" title="使用nsfwjs方式需要自行搭建或使用开源接口 据说准确率能达到93%">
|
||||
<span class="input-group-addon">图片鉴黄</span>
|
||||
|
@ -904,7 +855,7 @@ auto_delete(); //定时删除
|
|||
$file_size = getDistUsed(filesize($file_cache_path)); // 大小
|
||||
$filen_name = $cache_file[$i]; // 名称
|
||||
$url = $config['domain'] . $file_path; // 网络连接
|
||||
$unlink_img = $config['domain'] . '/app/del.php?url=' . $file_path; // 删除连接
|
||||
$unlink_img = $config['domain'] . '/app/del.php?url=' . $file_path; // 删除连接
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo $i; ?></td>
|
||||
|
@ -914,28 +865,25 @@ auto_delete(); //定时删除
|
|||
<td>
|
||||
<a class="btn btn-mini" href="<?php echo $url; ?>" target="_blank">查看</a>
|
||||
<a class="btn btn-mini" href="/app/info.php?img=<?php echo $file_path; ?>" target="_blank">信息</a>
|
||||
<a class="btn btn-mini btn-success" href="?suspic_reimg=<?php echo $filen_name; ?>">恢复</a>
|
||||
<a class="btn btn-mini btn-danger" href="<?php echo $unlink_img; ?>" target="_blank">删除</a>
|
||||
<a class="btn btn-mini btn-success" href="#" onclick="ajax_post('<?php echo $filen_name; ?>','suspic_reimg')">恢复</a>
|
||||
<a class="btn btn-mini btn-danger" href="#" onclick="ajax_post('<?php echo $file_path; ?>','delete')">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<form class="form-inline" action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<input class="form-control" type="hidden" name="delDir" value="/suspic/" readonly="">
|
||||
<a class="btn btn-mini btn-primary" href="filer.php?path=<?php echo $config['path']; ?>suspic" target="_blank">管理可疑</a>
|
||||
<button class="btn btn-mini btn-danger"><?php echo $cache_num; ?>张 | 删除全部</button>
|
||||
</form>
|
||||
<a class="btn btn-mini btn-primary" href="filer.php?path=<?php echo $config['path']; ?>suspic" target="_blank">管理可疑</a>
|
||||
<button class="btn btn-mini btn-danger" onclick="ajax_post('/suspic/','delDir')"><?php echo $cache_num; ?>张 | 删除全部</button>
|
||||
</div>
|
||||
<div class=" tab-pane fade" id="Content8">
|
||||
<div class="alert alert-primary">
|
||||
<h5>系统信息</h5>
|
||||
<hr />
|
||||
<p class="text-ellipsis">服务系统: <?PHP echo php_uname('s') . ' <small class="text-muted">' . php_uname() . '</small>'; ?></p>
|
||||
<p class="text-ellipsis">服务系统: <?PHP echo php_uname('s'); ?> <small class="text-muted text-ellipsis"><?PHP echo php_uname(); ?></small></p>
|
||||
<p class="text-ellipsis">Web服务: <?PHP echo $_SERVER['SERVER_SOFTWARE']; ?></p>
|
||||
<p class="text-ellipsis">服务器IP: <?PHP echo $_SERVER["SERVER_ADDR"] ?></p>
|
||||
<p class="text-ellipsis">系统时间: <?PHP echo date("Y-m-d H:i:s"); ?></p>
|
||||
<p class="text-ellipsis">服务器IP: <?PHP echo $_SERVER["SERVER_ADDR"] . ip2region($_SERVER["SERVER_ADDR"]) ?></p>
|
||||
<p class="text-ellipsis">图床时间: <?PHP echo date("Y-m-d H:i:s"); ?></p>
|
||||
<p class="text-ellipsis"><span class="label label-dot label-success" data-toggle="tooltip" title="当前页面占用内存"></span> 页面占用: <?php echo getDistUsed(memory_get_usage()); ?></p>
|
||||
<p class="text-ellipsis"><span class="label label-dot label-danger" data-toggle="tooltip" title="本页面占用内存最高峰"></span> 占用峰值: <?php echo getDistUsed(memory_get_peak_usage()); ?></p>
|
||||
<p class="text-ellipsis">占用磁盘: <?php echo getDistUsed(disk_total_space(__DIR__) - disk_free_space(__DIR__)) ?></p>
|
||||
|
@ -948,11 +896,10 @@ auto_delete(); //定时删除
|
|||
<p class="text-ellipsis">运行时间限制: <?PHP echo get_cfg_var("max_execution_time") . "s"; ?></p>
|
||||
<p class="text-ellipsis">最大占用内存: <?PHP echo get_cfg_var("memory_limit"); ?></p>
|
||||
<p class="text-ellipsis">POST上传限制: <?php echo ini_get('post_max_size'); ?></p>
|
||||
<p class="text-ellipsis">GD版本: <?php echo (gd_info()["GD Version"]); ?>
|
||||
</p>
|
||||
<p class="text-ellipsis">GD版本: <?php echo (gd_info()["GD Version"]); ?></p>
|
||||
<h5>我的信息</h5>
|
||||
<hr />
|
||||
<p class="text-ellipsis">IP: <?php echo real_ip(); ?></p>
|
||||
<p class="text-ellipsis">IP: <?php echo real_ip() . ip2region(real_ip()); ?></p>
|
||||
<p class="text-ellipsis">Browser: <?php echo $_SERVER['HTTP_USER_AGENT']; ?></p>
|
||||
<h5>图床信息</h5>
|
||||
<hr />
|
||||
|
@ -1007,20 +954,17 @@ auto_delete(); //定时删除
|
|||
<h5 class="header-dividing"><span class="label label-success">New</span> <?php echo getVersion('name'); ?></h5>
|
||||
<pre style="background-color: rgba(0, 0, 0, 0);border-color:rgba(0, 0, 0, 0);">更新内容: <br /><?php echo getVersion('body'); ?></pre>
|
||||
<h6>* 更新日期: <?php echo getVersion('created_at'); ?> 下载新版本上传至网站升级 <a href="<?php echo is_file(APP_ROOT . '/docs/index.html') ? '../docs' : 'https://icret.github.io/EasyImages2.0/#/'; ?>" target="_blank" data-toggle="tooltip" title="升级方法"><i class="icon icon-question"></i></a> 然后点击更新版本号。</h6>
|
||||
<form action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<input class="form-control" type="hidden" name="del_version_file" value="/admin/logs/version/version.json" readonly>
|
||||
<div class="btn-group">
|
||||
<a class="btn btn-mini btn-primary" href="https://github.com/icret/EasyImages2.0/releases" target="_blank" data-toggle="tooltip" title="Releases Info">Github</a>
|
||||
<a class="btn btn-mini btn-primary" href="<?php echo getVersion('zipball_url'); ?>" target="_blank" data-toggle="tooltip" title="① 下载后上传至网站更新">下载新版本</a>
|
||||
<button class="btn btn-mini btn-danger" data-toggle="tooltip" title="② 升级后获取新的版本信息">更新版本号</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="btn-group">
|
||||
<a class="btn btn-mini btn-primary" href="https://github.com/icret/EasyImages2.0/releases" target="_blank" data-toggle="tooltip" title="Releases Info">Github</a>
|
||||
<a class="btn btn-mini btn-primary" href="<?php echo getVersion('zipball_url'); ?>" target="_blank" data-toggle="tooltip" title="① 下载后上传至网站更新">下载新版本</a>
|
||||
<a class="btn btn-mini btn-danger" href="#" id="post" onclick="ajax_post('/admin/logs/version/version.json','del_version_file')" data-toggle="tooltip" title="② 升级后获取新的版本信息">更新版本号</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="Content9">
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-12">
|
||||
<h5>上传后首选显示</h5>
|
||||
<label class="radio-inline">
|
||||
<input type="radio" name="upload_first_show" value="1" data-toggle="tooltip" title="图片直链" <?php if ($config['upload_first_show'] == 1) echo 'checked'; ?>>
|
||||
|
@ -1047,7 +991,7 @@ auto_delete(); //定时删除
|
|||
<i class="icon icon-trash"></i>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group col-md-12">
|
||||
<label data-toggle="tooltip" title="选择网站对外展示的一些功能和页面">对外功能页面展示</label><br />
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="暗黑模式切换">
|
||||
<input type="hidden" name="dark-mode" value="0">
|
||||
|
@ -1075,47 +1019,55 @@ auto_delete(); //定时删除
|
|||
<label style="font-weight: bold">随机图片</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label data-toggle="tooltip" title="暂支持中文简繁体转换">界面语言</label>
|
||||
<select class="chosen-select form-control" name="language">
|
||||
<option value="0" <?php if ($config['language'] == '0') echo 'selected'; ?>>简体中文</option>
|
||||
<option value="1" <?php if ($config['language'] == '1') echo 'selected'; ?>>繁體中文</option>
|
||||
</select>
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-2">
|
||||
<label data-toggle="tooltip" title="暂支持中文简繁体转换">界面语言</label>
|
||||
<select class="chosen-select form-control" name="language">
|
||||
<option value="0" <?php if ($config['language'] == '0') echo 'selected'; ?>>简体中文</option>
|
||||
<option value="1" <?php if ($config['language'] == '1') echo 'selected'; ?>>繁體中文</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label data-toggle="tooltip" title="配色样式文件夹位置: /public/static/zui/theme/">网站配色</label>
|
||||
<select class="chosen-select form-control" name="theme">
|
||||
<option value="default" style="background: #3280fc;" <?php if ($config['theme'] == 'default') echo 'selected'; ?>>默认配色</option>
|
||||
<option value="red" style="background: #d9534f;" <?php if ($config['theme'] == 'red') echo 'selected'; ?>>红色</option>
|
||||
<option value="green" style="background: #4caf50;" <?php if ($config['theme'] == 'green') echo 'selected'; ?>>绿色</option>
|
||||
<option value="blue" style="background: #039be5;" <?php if ($config['theme'] == 'blue') echo 'selected'; ?>>蓝色</option>
|
||||
<option value="bluegrey" style="background: #607D8B;" <?php if ($config['theme'] == 'bluegrey') echo 'selected'; ?>>蓝灰</option>
|
||||
<option value="indigo" style="background: #3F51B5;" <?php if ($config['theme'] == 'indigo') echo 'selected'; ?>>靛青</option>
|
||||
<option value="brown" style="background: #8D6E63;" <?php if ($config['theme'] == 'brown') echo 'selected'; ?>>棕色</option>
|
||||
<option value="yellow" style="background: #d0884d;" <?php if ($config['theme'] == 'yellow') echo 'selected'; ?>>黄色</option>
|
||||
<option value="purple" style="background: #8666b8;" <?php if ($config['theme'] == 'purple') echo 'selected'; ?>>紫色</option>
|
||||
<option value="black" style="background: #333;" <?php if ($config['theme'] == 'black') echo 'selected'; ?>>黑色</option>
|
||||
<option value="grey" style="background: grey;" <?php if ($config['theme'] == 'grey') echo 'selected'; ?>>纪念灰</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label for="login_bg" data-toggle="tooltip" title="图片地址可以是相对路径或网址">登录背景</label>
|
||||
<input type="text" class="form-control" id="login_bg" name="login_bg" value="<?php if ($config['login_bg']) echo $config['login_bg']; ?>" required="required" placeholder="图片地址可以是相对路径或网址" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label data-toggle="tooltip" title="默认进度条颜色 RGB|HSL|HEX">默认进度条颜色</label>
|
||||
<input type="color" class="form-control" name="NProgress_default" value="<?php echo $config['NProgress_default']; ?>">
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label data-toggle="tooltip" title="上传过程中进度条颜色 RGB|HSL|HEX">上传过程进度条颜色</label>
|
||||
<input type="color" class="form-control" name="NProgress_Progress" value="<?php echo $config['NProgress_Progress']; ?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label data-toggle="tooltip" title="配色样式文件夹位置: /public/static/zui/theme/">网站配色</label>
|
||||
<select class="chosen-select form-control" name="theme">
|
||||
<option value="default" style="background: #3280fc;" <?php if ($config['theme'] == 'default') echo 'selected'; ?>>默认配色</option>
|
||||
<option value="red" style="background: #d9534f;" <?php if ($config['theme'] == 'red') echo 'selected'; ?>>红色</option>
|
||||
<option value="green" style="background: #4caf50;" <?php if ($config['theme'] == 'green') echo 'selected'; ?>>绿色</option>
|
||||
<option value="blue" style="background: #039be5;" <?php if ($config['theme'] == 'blue') echo 'selected'; ?>>蓝色</option>
|
||||
<option value="bluegrey" style="background: #607D8B;" <?php if ($config['theme'] == 'bluegrey') echo 'selected'; ?>>蓝灰</option>
|
||||
<option value="indigo" style="background: #3F51B5;" <?php if ($config['theme'] == 'indigo') echo 'selected'; ?>>靛青</option>
|
||||
<option value="brown" style="background: #8D6E63;" <?php if ($config['theme'] == 'brown') echo 'selected'; ?>>棕色</option>
|
||||
<option value="yellow" style="background: #d0884d;" <?php if ($config['theme'] == 'yellow') echo 'selected'; ?>>黄色</option>
|
||||
<option value="purple" style="background: #8666b8;" <?php if ($config['theme'] == 'purple') echo 'selected'; ?>>紫色</option>
|
||||
<option value="black" style="background: #333;" <?php if ($config['theme'] == 'black') echo 'selected'; ?>>黑色</option>
|
||||
<option value="grey" style="background: grey;" <?php if ($config['theme'] == 'grey') echo 'selected'; ?>>纪念灰</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-6">
|
||||
<label for="login_bg" data-toggle="tooltip" title="图片地址可以是相对路径或网址">登录背景</label>
|
||||
<input type="text" class="form-control" id="login_bg" name="login_bg" value="<?php if ($config['login_bg']) echo $config['login_bg']; ?>" required="required" placeholder="图片地址可以是相对路径或网址" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-9">
|
||||
<label data-toggle="tooltip" title="可在网址后填写参数更改预览数量 eg: /list.php?num=3">广场默认浏览数量 | 当前: </label>
|
||||
<label id="listNumber"><?php echo $config['listNumber']; ?>张</label>
|
||||
<input type="range" class="form-control" name="listNumber" value="<?php echo $config['listNumber']; ?>" min="10" max="100" step="10" onchange="document.getElementById('listNumber').innerHTML=value">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label id="listDate" data-toggle="tooltip" title="广场往日浏览限制<br />有助于防爬虫抓取<br />建议不超10天,否则页面导致排版混乱">广场限制 | 当前: <?php echo $config['listDate']; ?>天</label>
|
||||
<label id="listDate" data-toggle="tooltip" title="广场往日浏览限制<br />有助于防爬虫抓取<br />建议不超10天,否则页面导致排版混乱">广场浏览历史限制 | 当前: <?php echo $config['listDate']; ?>天</label>
|
||||
<input type="number" class="form-control" id="listDate" name="listDate" value="<?php if ($config['listDate']) echo $config['listDate']; ?>" min="1" max="100" required="required" placeholder="有助于防爬虫抓取 建议不超10天" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-12">
|
||||
<input type="hidden" class="form-control" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
|
||||
</div>
|
||||
<input type="hidden" class="form-control" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
|
||||
<button type="submit" class="btn btn-primary">保存</button>
|
||||
</form>
|
||||
</div>
|
||||
|
@ -1142,19 +1094,19 @@ auto_delete(); //定时删除
|
|||
<button type="submit" class="btn btn-primary">更改管理员 账号|密码</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert alert-primary with-icon col-xs-8">
|
||||
<i class="icon-info-sign"></i>
|
||||
<div class="content">
|
||||
<ul>
|
||||
<li>管理员账号不能与上传者账号相同</li>
|
||||
<li>直接输入账号和密码即可完成修改</li>
|
||||
<li>更改后会立即生效并重新登录,请务必牢记账号和密码! </li>
|
||||
<li>如果忘记账号可以打开-><code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'user'=><strong>admin</strong>'">user</code>对应的键值->填入</li>
|
||||
<li>如果忘记密码请将密码->转换成SHA256-><a href="<?php echo $config['domain'] . '/app/reset_password.php'; ?>" target="_blank" class="text-purple">转换网址</a>->打开<code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'password'=>'<strong>e6e0612609</strong>'">password</code>对应的键值->填入</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="alert alert-primary with-icon col-xs-8">
|
||||
<i class="icon-info-sign"></i>
|
||||
<div class="content">
|
||||
<ul>
|
||||
<li>管理员账号不能与上传者账号相同</li>
|
||||
<li>直接输入账号和密码即可完成修改</li>
|
||||
<li>更改后会立即生效并重新登录,请务必牢记账号和密码! </li>
|
||||
<li>如果忘记账号可以打开-><code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'user'=><strong>admin</strong>'">user</code>对应的键值->填入</li>
|
||||
<li>如果忘记密码请将密码->转换成SHA256-><a href="<?php echo $config['domain'] . '/app/reset_password.php'; ?>" target="_blank" class="text-purple">转换网址</a>->打开<code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'password'=>'<strong>e6e0612609</strong>'">password</code>对应的键值->填入</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 上传用户管理 start-->
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post" onsubmit="return uploader_md5_post()">
|
||||
<h5 class="header-dividing">上传者账号<small> 账户只能用于上传</small></h5>
|
||||
|
@ -1184,19 +1136,19 @@ auto_delete(); //定时删除
|
|||
<button type="submit" class="btn btn-danger">添加|更改 上传者 账号|密码</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert alert-primary with-icon col-xs-8">
|
||||
<i class="icon-info-sign"></i>
|
||||
<div class="content">
|
||||
<ul>
|
||||
<li>上传用户账号不能与管理员账号相同</li>
|
||||
<li>上传用户的配置文件在<code>config.guest.php</code></li>
|
||||
<li>开启登录上传后,可以添加一些只能上传的账号</li>
|
||||
<li>更改后会立即生效并重新登录,请将账号和密码发给使用者</li>
|
||||
<li>如果忘记密码请填入账号并填写新的密码即可更正密码 | <b class="text-success">与更改管理 账号/密码不同!</b></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="alert alert-primary with-icon col-xs-8">
|
||||
<i class="icon-info-sign"></i>
|
||||
<div class="content">
|
||||
<ul>
|
||||
<li>上传用户账号不能与管理员账号相同</li>
|
||||
<li>上传用户的配置文件在<code>config.guest.php</code></li>
|
||||
<li>开启登录上传后,可以添加一些只能上传的账号</li>
|
||||
<li>更改后会立即生效并重新登录,请将账号和密码发给使用者</li>
|
||||
<li>如果忘记密码请填入账号并填写新的密码即可更正密码 | <b class="text-success">与更改管理 账号/密码不同!</b></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<h5>* 开启用户分离后删除上传按钮激活, 删除后不可恢复</h5>
|
||||
<div id="guest" class="datagrid table-bordered">
|
||||
<div class="input-control search-box search-box-circle has-icon-left has-icon-right" id="searchboxExample2" style="margin-bottom: 10px;">
|
||||
|
@ -1247,7 +1199,7 @@ auto_delete(); //定时删除
|
|||
$file_size = getDistUsed(filesize($file_cache_path)); // 大小
|
||||
$filen_name = $cache_file[$i]; // 名称
|
||||
$url = $config['domain'] . $file_path; // 网络连接
|
||||
$unlink_img = $config['domain'] . '/app/del.php?url=' . $file_path; // 删除连接
|
||||
// $unlink_img = $config['domain'] . '/app/del.php?url=' . $file_path; // 删除连接
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo $i; ?></td>
|
||||
|
@ -1257,19 +1209,16 @@ auto_delete(); //定时删除
|
|||
<td>
|
||||
<a class="btn btn-mini" href="<?php echo $url; ?>" target="_blank">查看</a>
|
||||
<a class="btn btn-mini" href="/app/info.php?img=<?php echo $file_path; ?>" target="_blank">信息</a>
|
||||
<a class="btn btn-mini btn-success" href="?recycle_reimg=<?php echo $filen_name; ?>">恢复</a>
|
||||
<a class="btn btn-mini btn-danger" href="<?php echo $unlink_img; ?>" target="_blank">删除</a>
|
||||
<a class="btn btn-mini btn-success" href="#" onclick="ajax_post('<?php echo $filen_name; ?>','recycle_reimg')">恢复</a>
|
||||
<a class="btn btn-mini btn-danger" href="#" onclick="ajax_post('<?php echo $file_path; ?>','delete')">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<form class="form-inline" action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<input class="form-control" type="hidden" name="delDir" value="/recycle/" readonly="">
|
||||
<a class="btn btn-mini btn-primary" href="filer.php?path=<?php echo $config['path']; ?>recycle" target="_blank">管理回收</a>
|
||||
<button class="btn btn-mini btn-danger"><?php echo $cache_num; ?>张 | 删除全部</button>
|
||||
</form>
|
||||
<a class="btn btn-mini btn-primary" href="filer.php?path=<?php echo $config['path']; ?>recycle" target="_blank">管理回收</a>
|
||||
<button class="btn btn-mini btn-danger" onclick="ajax_post('/recycle/','delDir')"><?php echo $cache_num; ?>张 | 删除全部</button>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="Content12">
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
|
@ -1310,7 +1259,7 @@ auto_delete(); //定时删除
|
|||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label data-toggle="tooltip" title="格式RGBA 末尾为透明度0-127 0为不透明,仅支持文字水印">文字水印颜色</label>
|
||||
<input type="text" name="textColor" class="form-control" value="" readonly data-jscolor="{preset:'myPreset'}">
|
||||
<input type="text" name="textColor" class="form-control" value="" data-jscolor="{preset:'myPreset'}" readonly required="required">
|
||||
</div>
|
||||
<div class="form-group col-md-6">
|
||||
<label>文字水印大小 | 当前: </label><label id="textSize"><?php echo $config['textSize']; ?></label><label>px</label>
|
||||
|
@ -1325,39 +1274,45 @@ auto_delete(); //定时删除
|
|||
<div class="tab-pane fade" id="Content13">
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<h5 class="header-dividing">前端裁剪/压缩 <small>优点:服务器无压力 缺点:PC配置低的会导致浏览器卡顿,偶现丢失方向信息,仅支持JPG</small></h5>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="控制以下五项 不开启不生效">
|
||||
<input type="hidden" name="imgRatio" value="0">
|
||||
<input type="checkbox" name="imgRatio" value="1" <?php if ($config['imgRatio']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">前端修改图片</label>
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="控制以下五项 不开启不生效">
|
||||
<input type="hidden" name="imgRatio" value="0">
|
||||
<input type="checkbox" name="imgRatio" value="1" <?php if ($config['imgRatio']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">前端修改图片</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="imgRatio_crop" value="0">
|
||||
<input type="checkbox" name="imgRatio_crop" value="1" <?php if ($config['imgRatio_crop']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">上传前裁剪</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="imgRatio_preserve_headers" value="0">
|
||||
<input type="checkbox" name="imgRatio_preserve_headers" value="1" <?php if ($config['imgRatio_preserve_headers']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">保留图片原始数据</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>压缩后的宽度 | 当前: </label><label id="image_x"><?php echo $config['image_x']; ?></label><label>px (0为不生效)</label>
|
||||
<input type="range" class="form-control" name="image_x" value="<?php echo $config['image_x']; ?>" min="0" max="4096" step="100" onchange="document.getElementById('image_x').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>压缩后的高度 | 当前: </label><label id="image_y"><?php echo $config['image_y']; ?></label><label>px (0为不生效)</label>
|
||||
<input type="range" class="form-control" name="image_y" value="<?php echo $config['image_y']; ?>" min="0" max="4096" step="100" onchange="document.getElementById('image_y').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="imgRatio_crop" value="0">
|
||||
<input type="checkbox" name="imgRatio_crop" value="1" <?php if ($config['imgRatio_crop']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">上传前裁剪</label>
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-4">
|
||||
<label>压缩后的宽度 | 当前: </label><label id="image_x"><?php echo $config['image_x']; ?></label><label>px (0为不生效)</label>
|
||||
<input type="range" class="form-control" name="image_x" value="<?php echo $config['image_x']; ?>" min="0" max="4096" step="100" onchange="document.getElementById('image_x').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group col-md-4">
|
||||
<label>压缩后的高度 | 当前: </label><label id="image_y"><?php echo $config['image_y']; ?></label><label>px (0为不生效)</label>
|
||||
<input type="range" class="form-control" name="image_y" value="<?php echo $config['image_y']; ?>" min="0" max="4096" step="100" onchange="document.getElementById('image_y').innerHTML=value">
|
||||
</div>
|
||||
<div class="form-group col-md-4">
|
||||
<label>前端压缩率(仅支持JPG) | 当前: </label><label id="imgRatio_quality"><?php echo $config['imgRatio_quality']; ?></label><label>%</label>
|
||||
<input type="range" class="form-control" name="imgRatio_quality" value="<?php echo $config['imgRatio_quality']; ?>" min="10" max="100" step="5" onchange="document.getElementById('imgRatio_quality').innerHTML=value">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="imgRatio_preserve_headers" value="0">
|
||||
<input type="checkbox" name="imgRatio_preserve_headers" value="1" <?php if ($config['imgRatio_preserve_headers']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">保留图片原始数据</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>前端压缩率(仅支持JPG) | 当前: </label><label id="imgRatio_quality"><?php echo $config['imgRatio_quality']; ?></label><label>%</label>
|
||||
<input type="range" class="form-control" name="imgRatio_quality" value="<?php echo $config['imgRatio_quality']; ?>" min="10" max="100" step="5" onchange="document.getElementById('imgRatio_quality').innerHTML=value">
|
||||
</div>
|
||||
|
||||
|
||||
<h5 class="header-dividing">后端压缩 <small data-toggle="tooltip" title=" 有一定概率改变图片方向,有可能使图片变大(特别是小图片) !<br />开启转换图片格式后不建议开启此选项,可能会导致图片变大!">优点:避免用户端欺骗,效果更好 缺点:增加服务器压力</small></h5>
|
||||
<div class="form-group">
|
||||
<div class="switch switch-inline">
|
||||
|
@ -1381,20 +1336,104 @@ auto_delete(); //定时删除
|
|||
<a class="btn btn-mini btn-primary" href="/admin/manager.php?p=<?php echo date('Y/m/d'); ?> " target="_blank" data-toggle="tooltip" title="使用Tinyfilemanager管理文件"><i class="icon icon-folder-open"> 文件管理</i></a>
|
||||
<a class="btn btn-mini btn-primary" href="filer.php?path=<?php echo $config['path'] . date('Y/m/d'); ?> " target="_blank" data-toggle="tooltip" title="使用web-indexr管理文件"><i class="icon icon-folder-close"> 文件管理</i></a>
|
||||
<h5 class="header-dividing">删除文件 <small>* 删除后不可恢复</small></h5>
|
||||
<form class="form-inline" method="get" action="../app/del.php" id="form" name="delForm" target="_blank" style="margin-bottom: 5px;">
|
||||
<form class="form-inline" method="POST" style="margin-bottom: 5px;">
|
||||
<p id="delimgurl"></p>
|
||||
<div class="form-group">
|
||||
<label for="del" class="text-warning">删除单张图片文件: </label>
|
||||
<input type="url" name="url_admin_inc" class="form-control input-sm" id="del" required="required" placeholder="请输入图片链接">
|
||||
<label for="delSingle" class="text-warning">删除单张图片文件: </label>
|
||||
<input type="url" name="url_admin_inc" class="form-control input-sm" id="delSingle" required="required" placeholder="请输入图片链接">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-sm btn-warning" onClick="return confirm('确认要删除?\n* 删除文件后将无法恢复! ');">删除</button>
|
||||
<button type="submit" class="btn btn-sm btn-warning" onclick="ajax_post($('#delSingle').val(),'delete')">删除</button>
|
||||
</form>
|
||||
<form class="form-inline" action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<form class="form-inline" method="POST">
|
||||
<div class="form-group">
|
||||
<label for="delDir" class="text-danger">删除指定日期文件: </label>
|
||||
<input type="text" class="form-control form-date input-sm" name="delDir" value="<?php echo date('Y/m/d/'); ?>" readonly>
|
||||
<input type="text" class="form-control form-date input-sm" id="dateDir" name="dateDir" value="<?php echo date('Y/m/d/'); ?>" readonly>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-sm btn-danger" onClick="return confirm('确认要删除?\n* 删除文件夹后将无法恢复! ');">删除</button>
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="ajax_post($('#dateDir').val(),'delDir')">删除</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="Content15">
|
||||
<div class="alert alert-primary with-icon">
|
||||
<i class="icon-info-sign"></i>
|
||||
<div class="content">
|
||||
<ol>
|
||||
<li>慎用,正在实验中</li>
|
||||
<li>已回收的图片无法再还原到FTP</li>
|
||||
<li>效果: 开启后上传|删除等受网络影响</li>
|
||||
<li>流程: 客户端->图床服务器->远程附件</li>
|
||||
<li>网络影响: 当前服务器->远程附件服务器速度</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<h5 class="header-dividing">远程附件 <small> 将文件以FTP方式上传到第三方</small></h5>
|
||||
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline">
|
||||
<input type="hidden" name="ftp_status" value="0">
|
||||
<input type="checkbox" name="ftp_status" value="1" <?php if ($config['ftp_status']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">启用远程附件</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="一般情况下被动模式即可<br/>如果存在上传失败可尝试开启">
|
||||
<input type="hidden" name="ftp_pasv" value="0">
|
||||
<input type="checkbox" name="ftp_pasv" value="1" <?php if ($config['ftp_pasv']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">主动模式</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="注意: FTP服务器需开启SSL">
|
||||
<input type="hidden" name="ftp_ssl" value="0">
|
||||
<input type="checkbox" name="ftp_ssl" value="1" <?php if ($config['ftp_ssl']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">启用SSL</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="FTP上传完毕删除本地文件<br/>非自用不建议开启此选项<br/>没有SQL无法管理远程文件">
|
||||
<input type="hidden" name="ftp_complete_del_local" value="0">
|
||||
<input type="checkbox" name="ftp_complete_del_local" value="1" <?php if ($config['ftp_complete_del_local']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">完成删除</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<div class="switch switch-inline" data-toggle="tooltip" title="删除本地文件时同步删除远程附件">
|
||||
<input type="hidden" name="ftp_delloc_sync" value="0">
|
||||
<input type="checkbox" name="ftp_delloc_sync" value="1" <?php if ($config['ftp_delloc_sync']) echo 'checked="checked"'; ?>>
|
||||
<label style="font-weight: bold">同步删除</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-3">
|
||||
<label data-toggle="tooltip" title="域名/IP地址, 可以先测试FTP软件是否能正常登录">FTP 服务器地址</label>
|
||||
<input type="text" class="form-control" name="ftp_host" value="<?php echo $config['ftp_host']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')" placeholder="FTP 服务器地址">
|
||||
</div>
|
||||
<div class="form-group col-md-1">
|
||||
<label data-toggle="tooltip" title="FTP 链接端口, 默认:21">端口</label>
|
||||
<input type="number" class="form-control" name="ftp_port" required="required" value="<?php echo $config['ftp_port']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group col-md-1">
|
||||
<label data-toggle="tooltip" title="FTP 传输超时时间<br/> 单位:秒, 0为服务器默认时间">超时时间</label>
|
||||
<input type="number" class="form-control" name="ftp_time" required="required" value="<?php echo $config['ftp_time']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label data-toggle="tooltip" title="FTP 账号,该账户需要有以下权限: 读取/写入/删除文件、创建/继承目录">账号</label>
|
||||
<input type="text" class="form-control" name="ftp_user" value="<?php echo $config['ftp_user']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')" placeholder="FTP 账号">
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
<label data-toggle="tooltip" title="FTP 密码">密码</label>
|
||||
<input type="password" class="form-control" name="ftp_pass" value="<?php echo $config['ftp_pass']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')" placeholder="FTP 密码">
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label data-toggle="tooltip" title="网址与图片域名一致, 末尾不加'/'">远程图片域名</label>
|
||||
<input type="url" class="form-control" name="imgurl" value="<?php echo $config['imgurl']; ?>" required="required" readonly="readonly" onkeyup="this.value=this.value.replace(/\s/g,'')">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="hidden" class="form-control" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">保存</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1402,10 +1441,60 @@ auto_delete(); //定时删除
|
|||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/datagrid/zui.datagrid.min.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.css">
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/crypto/SHA256.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/crypto/SHA256.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/jscolor/jscolor.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/datagrid/zui.datagrid.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.js"></script>
|
||||
<script>
|
||||
// POST 更新数据
|
||||
function update_post(cid, url = "update.php") {
|
||||
$.ajax({
|
||||
//几个参数需要注意一下
|
||||
type: "POST", //方法类型
|
||||
dataType: "json", //预期服务器返回的数据类型
|
||||
url: url, //url
|
||||
data: $("#" + cid).serialize(),
|
||||
success: function(res) {
|
||||
console.log(res); //打印服务端返回的数据(调试用)
|
||||
// if (res.code === 200) {};
|
||||
new $.zui.Messager(res.msg, {
|
||||
type: res.type, // 定义颜色主题
|
||||
icon: res.icon // 定义消息图标
|
||||
}).show();
|
||||
|
||||
// 延时2秒刷新
|
||||
window.setTimeout(function() {
|
||||
window.location.reload();
|
||||
}, 1500)
|
||||
},
|
||||
error: function() {
|
||||
confirm("保存异常,请使用浏览器F12查看控制台信息");
|
||||
console.log(res); //打印服务端返回的数据(调试用)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// POST提交
|
||||
function ajax_post(url, mode) {
|
||||
$.post("../app/del.php", {
|
||||
url: url,
|
||||
mode: mode
|
||||
},
|
||||
function(data, status) {
|
||||
let res = JSON.parse(data);
|
||||
new $.zui.Messager(res.msg, {
|
||||
type: res.type,
|
||||
icon: res.icon
|
||||
}).show();
|
||||
if (res.code === 200) {
|
||||
// 延时2秒刷新
|
||||
window.setTimeout(function() {
|
||||
window.location.reload();
|
||||
}, 2000)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 水印字体颜色
|
||||
jscolor.presets.myPreset = {
|
||||
value: '<?php echo $config['textColor']; ?>',
|
||||
|
@ -1465,7 +1554,7 @@ auto_delete(); //定时删除
|
|||
}
|
||||
|
||||
// 动态显示要删除的图片
|
||||
var oBtn = document.getElementById('del');
|
||||
var oBtn = document.getElementById('delSingle');
|
||||
var oTi = document.getElementById('title');
|
||||
if ('oninput' in oBtn) {
|
||||
oBtn.addEventListener("input", getWord, false);
|
||||
|
@ -1490,7 +1579,7 @@ auto_delete(); //定时删除
|
|||
endDate: new Date() // 只能选当前日期之前
|
||||
});
|
||||
|
||||
// log日期选择
|
||||
// viewlog日期选择
|
||||
$(".logDate").datetimepicker({
|
||||
|
||||
format: 'yyyy-mm',
|
||||
|
@ -1552,12 +1641,13 @@ auto_delete(); //定时删除
|
|||
add_time: '<?php echo date('Y-m-d H:i:s', $value['add_time']); ?>',
|
||||
expired: '<?php echo $expired; ?>',
|
||||
number: <?php echo get_file_by_glob(APP_ROOT . $config['path'] . $value['id'], $type = 'number'); ?>,
|
||||
manage: "<a href='/admin/manager.php?p=<?php echo $value['id']; ?>' target='_blank' class='btn btn-mini btn-success <?php if (!$config['token_path_status']) echo 'disabled'; ?>'>文件</a> <a href='admin.inc.php?stop_token=<?php echo $key; ?>' class='btn btn-mini btn-danger'>禁用</a> <a href='admin.inc.php?delete_token=<?php echo $key; ?>' class='btn btn-mini btn-danger'>删除</a> <a href='admin.inc.php?delDir=<?php echo $value['id']; ?>' class='btn btn-mini btn-primary <?php if (!$config['token_path_status']) echo 'disabled'; ?>'>删除上传</a>"
|
||||
manage: "<a href='/admin/manager.php?p=<?php echo $value['id']; ?>' target='_blank' class='btn btn-mini btn-success <?php if (!$config['token_path_status']) echo 'disabled'; ?>'>文件</a> <a href='admin.inc.php?stop_token=<?php echo $key; ?>' class='btn btn-mini btn-danger'>禁用</a> <a href='admin.inc.php?delete_token=<?php echo $key; ?>' class='btn btn-mini btn-danger'>删除</a> <a href='#' onclick=\"ajax_post('<?php echo $value['id']; ?>','delDir')\" class='btn btn-mini btn-primary <?php if (!$config['token_path_status']) echo 'disabled'; ?>'>删除上传</a>"
|
||||
},
|
||||
<?php endforeach; ?>
|
||||
]
|
||||
},
|
||||
sortable: true,
|
||||
storage: true,
|
||||
hoverCell: true,
|
||||
showRowIndex: false,
|
||||
responsive: true,
|
||||
|
@ -1629,12 +1719,13 @@ auto_delete(); //定时删除
|
|||
add_time: '<?php echo date('Y-m-d H:i:s', $v['add_time']); ?>',
|
||||
expired: '<?php echo $expired; ?>',
|
||||
files: <?php echo get_file_by_glob(APP_ROOT . $config['path'] . $k, $type = 'number'); ?>,
|
||||
manage: "<a href='/admin/manager.php?p=<?php echo $k; ?>' target='_blank' class='btn btn-mini btn-success <?php if (!$config['guest_path_status']) echo 'disabled'; ?>'>文件</a> <a href='admin.inc.php?stop_guest=<?php echo $k; ?>' class='btn btn-mini btn-danger'>禁用</a> <a class='btn btn-mini btn-danger' href='admin.inc.php?delete_guest=<?php echo $k; ?>'>删除</a> <a class='btn btn-mini btn-primary <?php if (!$config['guest_path_status']) echo 'disabled'; ?>' href='admin.inc.php?delDir=<?php echo $k; ?>'>删除上传</a>",
|
||||
manage: "<a href='/admin/manager.php?p=<?php echo $k; ?>' target='_blank' class='btn btn-mini btn-success <?php if (!$config['guest_path_status']) echo 'disabled'; ?>'>文件</a> <a href='admin.inc.php?stop_guest=<?php echo $k; ?>' class='btn btn-mini btn-danger'>禁用</a> <a class='btn btn-mini btn-danger' href='admin.inc.php?delete_guest=<?php echo $k; ?>'>删除</a> <a class='btn btn-mini btn-primary <?php if (!$config['guest_path_status']) echo 'disabled'; ?>' href='#' onclick=\"ajax_post('<?php echo $k; ?>','delDir')\">删除上传</a>",
|
||||
},
|
||||
<?php endforeach; ?>
|
||||
]
|
||||
},
|
||||
sortable: true,
|
||||
storage: true,
|
||||
hoverCell: true,
|
||||
showRowIndex: true,
|
||||
responsive: true,
|
||||
|
@ -1657,7 +1748,7 @@ auto_delete(); //定时删除
|
|||
guestMyDataGrid.sortBy('add_time', 'desc');
|
||||
|
||||
/** 引入设置页面检测文件 */
|
||||
<?php if ($config['checkEnv']) require_once APP_ROOT . '/app/check_admin.inc.php'; ?>
|
||||
<?php if ($config['checkEnv']) require_once __DIR__ . '/inc.check.php'; ?>
|
||||
|
||||
// 更改网页标题
|
||||
document.title = "图床设置 - <?php echo $config['title']; ?>"
|
||||
|
|
|
@ -52,9 +52,9 @@ session_start();
|
|||
<meta name="keywords" content="<?php echo $config['keywords']; ?>" />
|
||||
<meta name="description" content="<?php echo $config['description']; ?>" />
|
||||
<link rel="shortcut icon" href="<?php static_cdn(); ?>/favicon.ico" type="image/x-icon" />
|
||||
<link href="<?php static_cdn(); ?>/public/static/zui/css/zui.min.css" rel="stylesheet">
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/js/zui.min.js"></script>
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/css/zui.min.css">
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/js/zui.min.js"></script>
|
||||
<style type="text/css">
|
||||
body {
|
||||
font-size: 14px;
|
||||
|
|
|
@ -0,0 +1,197 @@
|
|||
<?php
|
||||
|
||||
/** 禁止直接访问 */
|
||||
defined('APP_ROOT') ?: exit;
|
||||
|
||||
// 开启 DEBUG 2023-04-03
|
||||
if (!ini_get('display_errors')) {
|
||||
ini_set('display_errors', 'On');
|
||||
}
|
||||
error_reporting(E_ALL);
|
||||
|
||||
// 检查当前PHP版本是否大于7.0
|
||||
if (PHP_VERSION < 7) {
|
||||
echo '
|
||||
new $.zui.Messager("当前PHP版本<7.0, 部分功能受限!",{
|
||||
type: "primary", // 定义颜色主题
|
||||
time:2000
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 扩展检测
|
||||
$expand = array('fileinfo', 'iconv', 'gd', 'mbstring', 'openssl',);
|
||||
foreach ($expand as $val) {
|
||||
if (!extension_loaded($val)) {
|
||||
echo '
|
||||
new $.zui.Messager("扩展:' . $val . '- 未安装,可能导致图片上传失败! 请尽快修复。",{
|
||||
type: "black", // 定义颜色主题
|
||||
icon: "exclamation-sign", // 定义消息图标
|
||||
time:2200
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
}
|
||||
|
||||
// 检测是否修改默认密码
|
||||
if ($config['password'] === '7676aaafb027c825bd9abab78b234070e702752f625b752e55e55b48e607e358') {
|
||||
echo '
|
||||
new $.zui.Messager("请修改默认密码,否则会有泄露风险! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:2400
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检测是否局域网访问
|
||||
if (is_local($config['domain']) || is_local($config['imgurl'])) {
|
||||
echo '
|
||||
new $.zui.Messager("当前使用局域网,可能会导致外网访问异常!",{
|
||||
type: "black", // 定义颜色主题
|
||||
time:2600
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检测是否存在.user.ini
|
||||
if (file_exists(APP_ROOT . '/.user.ini')) {
|
||||
echo '
|
||||
new $.zui.Messager("请关闭防跨目录读写或删除.user.ini文件",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:2700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检测是否存在 IP数据库文件 ip2region.xdb
|
||||
if (!file_exists(APP_ROOT . '/app/ip2region/ip2region.xdb')) {
|
||||
echo '
|
||||
new $.zui.Messager("IP 数据库不存在, 请在系统信息中查看 Ip2region",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:2900
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检查当前版本与GitHub版本
|
||||
if (getVersion() !== APP_VERSION) {
|
||||
echo '
|
||||
new $.zui.Messager("当前版本与GitHub不一致,请检查当前是否最新版本!",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:3100
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检测是否开启登录上传
|
||||
if ($config['mustLogin']) {
|
||||
echo '
|
||||
$.zui.browser.tip("请注意: 当前已开启登录上传,游客不能上传图片!");
|
||||
';
|
||||
}
|
||||
|
||||
// 检测水印图片是否存在
|
||||
if (!is_file(APP_ROOT . $config['waterImg'])) {
|
||||
echo '
|
||||
new $.zui.Messager("水印图片不存在,请检测路径或者文件是否存在!",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:3300
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检测水印字体是否存在
|
||||
if (!is_file(APP_ROOT . $config['textFont'])) {
|
||||
echo '
|
||||
new $.zui.Messager("水印字体不存在,请检测路径或者文件是否存在!",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:3500
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// 检测监黄接口是否可以访问
|
||||
if ($config['checkImg'] !== 0) {
|
||||
|
||||
if ($config['checkImg'] === 1) {
|
||||
|
||||
if (!@IP_URL_Ping('api.moderatecontent.com', 80, 1)) {
|
||||
echo '
|
||||
new $.zui.Messager("moderatecontent 鉴黄接口无法ping通! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:3700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
}
|
||||
|
||||
if ($config['checkImg'] === 2) {
|
||||
|
||||
$ip = parse_url($config['nsfwjs_url'])['host'];
|
||||
$port = parse_url($config['nsfwjs_url'])['port'];
|
||||
|
||||
if (filter_var($ip, FILTER_VALIDATE_IP)) {
|
||||
if (!@IP_URL_Ping($ip, $port, 1)) {
|
||||
echo '
|
||||
new $.zui.Messager("' . $ip . $port . ' 鉴黄接口无法ping通! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:3700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
} else {
|
||||
if (!@IP_URL_Ping($ip, 80, 1)) {
|
||||
echo '
|
||||
new $.zui.Messager("' . $ip . ' 鉴黄接口无法ping通! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:3700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('fastcgi_finish_request')) {
|
||||
echo '
|
||||
new $.zui.Messager("开启 fastcgi_finish_request 处理数据会更快喔!",{
|
||||
type: "primary", // 定义颜色主题
|
||||
time:3900
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// FTP检测
|
||||
if ($config['ftp_status']) {
|
||||
|
||||
if (!extension_loaded('ftp')) { // 检测FTP扩展是否开启
|
||||
echo '
|
||||
new $.zui.Messager("FTP 错误: FTP 扩展未开启, 无法使用远程附件",{
|
||||
type: "info", // 定义颜色主题
|
||||
time:4000
|
||||
}).show();
|
||||
';
|
||||
} else {
|
||||
// 登录FTP
|
||||
require_once APP_ROOT . '/app/Ftp.php';
|
||||
try {
|
||||
$ftp = new Ftp;
|
||||
|
||||
if ($config['ftp_ssl'] === 1) {
|
||||
$ftp->sslConnect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
} else {
|
||||
$ftp->connect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
}
|
||||
|
||||
$ftp->login($config['ftp_user'], $config['ftp_pass']);
|
||||
$ftp->pasv($config['ftp_pasv']);
|
||||
} catch (FtpException $e) {
|
||||
echo '
|
||||
new $.zui.Messager("FTP 错误:' . $e->getMessage() . '",{
|
||||
type: "info", // 定义颜色主题
|
||||
time:4300
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
}
|
||||
}
|
|
@ -95,7 +95,7 @@ if (isset($_POST['password']) and isset($_POST['user'])) {
|
|||
write_login_log($_POST['user'], $_POST['password'], $login["messege"]);
|
||||
}
|
||||
?>
|
||||
<link href="<?php static_cdn(); ?>/public/static/login.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/login.css">
|
||||
<!-- 忘记密码 -->
|
||||
<div class="modal fade" id="fogot">
|
||||
<div class="modal-dialog ">
|
||||
|
@ -128,8 +128,7 @@ if (isset($_POST['password']) and isset($_POST['user'])) {
|
|||
<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">
|
||||
<input type="password" name="password" id="password" class="form-control" value="" placeholder="输入登录密码" autocomplete="off" required="required">
|
||||
<input type="hidden" name="password" id="md5_password">
|
||||
<input type="password" name="password" id="password" class="form-control" value="" placeholder="输入登录密码" autocomplete="off" required="required"><input type="hidden" name="password" id="md5_password">
|
||||
<?php if ($config['captcha']) : ?>
|
||||
<input class="form-control" type="text" name="code" value="" placeholder="请输入验证码" autocomplete="off" required="required" />
|
||||
<div class="form-group">
|
||||
|
@ -161,13 +160,15 @@ if (isset($_POST['password']) and isset($_POST['user'])) {
|
|||
</div>
|
||||
</section>
|
||||
</form>
|
||||
<script src="<?php static_cdn(); ?>/public/static/crypto/SHA256.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/crypto/SHA256.js"></script>
|
||||
<script>
|
||||
function md5_post() {
|
||||
var password = document.getElementById('password');
|
||||
var md5pwd = document.getElementById('md5_password');
|
||||
md5pwd.value = SHA256(password.value);
|
||||
//可以校验判断表单内容,true就是通过提交,false,阻止提交
|
||||
// fix https://github.com/icret/EasyImages2.0/pull/163
|
||||
password.value = "Null";
|
||||
// 可以校验判断表单内容,true就是通过提交,false,阻止提交
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1258,7 +1258,7 @@ if (isset($_GET['upload']) && !FM_READONLY) {
|
|||
return '';
|
||||
}
|
||||
?>
|
||||
<link href="<?php static_cdn(); ?>/public/static/tinyfilemanager/dropzone.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/tinyfilemanager/dropzone.min.css">
|
||||
<div class="path">
|
||||
|
||||
<div class="card mb-2 fm-upload-wrapper <?php echo fm_get_theme(); ?>">
|
||||
|
@ -3838,10 +3838,10 @@ $isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
|
|||
{
|
||||
?>
|
||||
</div>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/tinyfilemanager/bootstrap.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/tinyfilemanager/jquery.dataTables.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/tinyfilemanager/ekko-lightbox.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/tinyfilemanager/bootstrap.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/tinyfilemanager/jquery.dataTables.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/tinyfilemanager/ekko-lightbox.min.js"></script>
|
||||
<?php if (FM_USE_HIGHLIGHTJS): ?>
|
||||
<script src="<?php static_cdn(); ?>/public/static/tinyfilemanager/highlight.min.js"></script>
|
||||
<script>hljs.highlightAll(); var isHighlightingEnabled = true;</script>
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
2.8.4
|
|
@ -5,7 +5,7 @@
|
|||
require_once '../app/header.php';
|
||||
require_once APP_ROOT . '/app/chart.php';
|
||||
|
||||
// 检测是否开启统计
|
||||
// 检测登录和是否开启统计
|
||||
if (!$config['chart_on'] || !is_who_login('admin')) exit(header('Location: ' . $config['domain'] . '?hart#closed'));
|
||||
|
||||
// 检测登录
|
||||
|
@ -140,10 +140,7 @@ if (is_array($char_data)) {
|
|||
<canvas id="myChart" width="1080" height="200"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/gh/icret/EasyImages2.0@2.4.0/public/static/zui/lib/chart/zui.chart.min.js"></script>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://cdn.jsdelivr.net/gh/icret/EasyImages2.0@2.4.0/public/static/zui/lib/chart/excanvas.js"></script>
|
||||
<![endif]-->
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/chart/zui.chart.min.js"></script>
|
||||
<script>
|
||||
// 文件统计-柱状图
|
||||
var data = {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Verot\Upload;
|
||||
|
||||
require_once __DIR__ . '/../app/function.php';
|
||||
|
@ -19,10 +20,11 @@ header("Content-type: application/json; charset=utf-8");
|
|||
if (empty($_FILES['image'])) {
|
||||
exit(json_encode(
|
||||
array(
|
||||
"result" => "failed",
|
||||
"code" => 204,
|
||||
"message" => "没有选择上传的文件",
|
||||
)
|
||||
"result" => "failed",
|
||||
"code" => 204,
|
||||
"message" => "没有选择上传的文件",
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -31,24 +33,31 @@ if ($config['check_ip']) {
|
|||
if (checkIP(null, $config['check_ip_list'], $config['check_ip_model'])) {
|
||||
// 上传错误 code:205 未授权IP
|
||||
exit(json_encode(array(
|
||||
"result" => "failed",
|
||||
"code" => 205,
|
||||
"message" => "黑名单内或白名单外用户不允许上传",
|
||||
)));
|
||||
"result" => "failed",
|
||||
"code" => 205,
|
||||
"message" => "黑名单内或白名单外用户不允许上传",
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
|
||||
$token = preg_replace('/[\W]/', '', $_POST['token']); // 获取Token并过滤非字母数字,删除空格;
|
||||
// 获取Token并过滤非字母数字, 删除空格
|
||||
$token = preg_replace('/[\W]/', '', $_POST['token']);
|
||||
|
||||
// 检查api合法性
|
||||
check_api($token);
|
||||
$tokenID = $tokenList[$token]['id'];
|
||||
|
||||
$handle = new Upload($_FILES['image'], 'zh_CN');
|
||||
// 分片上传
|
||||
if (!$config['chunks']) {
|
||||
$handle = new Upload($_FILES['image'], 'zh_CN');
|
||||
} else {
|
||||
$chunk = chunk($_POST['name']);
|
||||
$handle = new Upload($chunk, 'zh_CN');
|
||||
}
|
||||
|
||||
if ($handle->uploaded) {
|
||||
// 允许上传的mime类型
|
||||
if ($config['allowed'] === 1) {
|
||||
if ($config['allowed']) {
|
||||
$handle->allowed = array('image/*');
|
||||
}
|
||||
|
||||
|
@ -61,7 +70,8 @@ if ($handle->uploaded) {
|
|||
"result" => "failed",
|
||||
"code" => 205,
|
||||
"message" => "请勿上传非法文件",
|
||||
)
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -90,25 +100,12 @@ if ($handle->uploaded) {
|
|||
$handle->webp_quality = $config['compress_ratio'];
|
||||
// JPEG 图像的压缩质量 1-100
|
||||
$handle->jpeg_quality = $config['compress_ratio'];
|
||||
|
||||
/* 等比例缩减图片 放到前端了*/
|
||||
/*
|
||||
if ($config['imgRatio']) {
|
||||
$handle->image_resize = true;
|
||||
$handle->image_x = $config['image_x'];
|
||||
$handle->image_y = $config['image_y'];
|
||||
// 如果调整后的图像大于原始图像,则取消调整大小,以防止放大
|
||||
$handle->image_no_enlarging = true;
|
||||
}
|
||||
*/
|
||||
|
||||
// 默认目录
|
||||
$Img_path = config_path();
|
||||
|
||||
if ($config['token_path_status'] == 1) {
|
||||
//Token分离
|
||||
if ($config['token_path_status']) {
|
||||
$Img_path = config_path($tokenID . date('/Y/m/d/'));
|
||||
}
|
||||
|
||||
// 存储图片路径:images/201807/
|
||||
$handle->process(APP_ROOT . $Img_path);
|
||||
|
||||
|
@ -120,27 +117,23 @@ if ($handle->uploaded) {
|
|||
$imageUrl = rand_imgurl() . $pathIMG;
|
||||
// 后续处理地址
|
||||
$processUrl = $config['domain'] . $pathIMG;
|
||||
|
||||
// 隐藏config文件中的path目录,需要搭配网站设置
|
||||
if ($config['hide_path'] == 1) {
|
||||
if ($config['hide_path']) {
|
||||
$imageUrl = str_replace($config['path'], '/', $imageUrl);
|
||||
}
|
||||
|
||||
// 源图保护 key值是由crc32加密的hide_key
|
||||
if ($config['hide'] == 1) {
|
||||
if ($config['hide']) {
|
||||
$imageUrl = $config['domain'] . '/app/hide.php?key=' . urlHash($pathIMG, 0, crc32($config['hide_key']));
|
||||
}
|
||||
|
||||
// 删除文件链接
|
||||
if ($config['show_user_hash_del']) {
|
||||
$delUrl = $config['domain'] . '/app/del.php?hash=' . urlHash($pathIMG, 0);
|
||||
} else {
|
||||
$delUrl = "Admin closed user delete";
|
||||
}
|
||||
|
||||
// 当设置访问生成缩略图时自动生成 2022-12-30 修正 2023-01-30
|
||||
$handleThumb = $config['domain'] . '/app/thumb.php?img=' . $pathIMG;
|
||||
if ($config['thumbnail'] == 2) {
|
||||
if ($config['thumbnail'] === 2) {
|
||||
// 自定义缩略图长宽
|
||||
$handle->image_resize = true;
|
||||
$handle->image_x = $config['thumbnail_w'];
|
||||
|
@ -160,8 +153,8 @@ if ($handle->uploaded) {
|
|||
"srcName" => $handle->file_src_name_body,
|
||||
"thumb" => $handleThumb,
|
||||
"del" => $delUrl,
|
||||
"ID" => $tokenID, // 202-02-11 增加返回Token ID
|
||||
"message" => "success",
|
||||
"id" => $tokenID, // 2023-02-11 增加返回Token ID
|
||||
"message" => "success", // 2023-04-22 增加返回信息
|
||||
// "memory" => getDistUsed(memory_get_peak_usage()), // 占用内存 2023-02-12
|
||||
);
|
||||
echo json_encode($reJson, JSON_UNESCAPED_UNICODE);
|
||||
|
@ -171,6 +164,8 @@ if ($handle->uploaded) {
|
|||
$reJson = array(
|
||||
"result" => "failed",
|
||||
"code" => 206,
|
||||
"srcName" => $handle->file_src_name_body, // 2023-04-03 原始上传文件名称
|
||||
"id" => $tokenID, // 2023-04-03 增加 Token ID
|
||||
"message" => $handle->error,
|
||||
"memory" => getDistUsed(memory_get_peak_usage()), // 占用内存 2023-02-12
|
||||
// 'log' => $handle->log, // 仅用作调试用
|
||||
|
@ -180,8 +175,6 @@ if ($handle->uploaded) {
|
|||
}
|
||||
|
||||
/** 后续处理 */
|
||||
// 上传至其他位置
|
||||
// @any_upload($pathIMG, APP_ROOT . $pathIMG, 'upload');
|
||||
// 使用fastcgi_finish_request操作
|
||||
if (function_exists('fastcgi_finish_request')) fastcgi_finish_request();
|
||||
// 同IP上传日志
|
||||
|
@ -194,6 +187,8 @@ if ($handle->uploaded) {
|
|||
@water($handle->file_dst_pathname);
|
||||
// 压缩
|
||||
@process_compress($handle->file_dst_pathname);
|
||||
// 上传至其他位置
|
||||
@any_upload($pathIMG, APP_ROOT . $pathIMG, 'upload');
|
||||
|
||||
unset($handle);
|
||||
}
|
||||
|
|
|
@ -5,11 +5,10 @@
|
|||
* 2022年2月22日11:41:38
|
||||
* @author Icret
|
||||
*/
|
||||
require_once '../app/function.php';
|
||||
require_once '../app/chart.php';
|
||||
|
||||
// 检查是否开启查询
|
||||
if ($config['public'] == 0) die('开放数据接口已关闭!');
|
||||
if ($config['public'] === 0) die('开放数据接口已关闭!');
|
||||
|
||||
// 获得get值
|
||||
$show = (empty($_GET['show'])) ? die('没有参数!') : htmlspecialchars($_GET['show']);
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
/*
|
||||
* 使用条款页面
|
||||
*/
|
||||
require_once __DIR__ . '/header.php';
|
||||
|
||||
/** 顶部广告 */
|
||||
if ($config['ad_top']) echo $config['ad_top_info'];
|
||||
|
||||
/** 加载使用条款 */
|
||||
if (empty($config['terms'])) {
|
||||
echo '<div class="alert alert-danger">Terms not set!<br />未设置使用条款</div>';
|
||||
} else {
|
||||
echo $config['terms'];
|
||||
// echo '<div style="margin-bottom: 80px;"></div>';
|
||||
}
|
||||
|
||||
/** 底部广告 */
|
||||
if ($config['ad_bot']) echo $config['ad_bot_info'];
|
||||
?>
|
||||
|
||||
<script>
|
||||
// Title
|
||||
document.title = '使用条款 - <?php echo $config['title']; ?>'
|
||||
</script>
|
||||
|
||||
<?php
|
||||
require_once __DIR__ . '/footer.php';
|
|
@ -1,968 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the `nicolab/php-ftp-client` package.
|
||||
*
|
||||
* (c) Nicolas Tallefourtane <dev@nicolab.net>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @copyright Nicolas Tallefourtane http://nicolab.net
|
||||
*/
|
||||
// namespace FtpClient;
|
||||
|
||||
// use \Countable;
|
||||
|
||||
/**
|
||||
* The FTP and SSL-FTP client for PHP.
|
||||
*
|
||||
* @method bool alloc(int $filesize, string &$result = null) Allocates space for a file to be uploaded
|
||||
* @method bool append(string $remote_file, string $local_file, int $mode = FTP_BINARY) Append the contents of a file to another file on the FTP server
|
||||
* @method bool cdup() Changes to the parent directory
|
||||
* @method bool chdir(string $directory) Changes the current directory on a FTP server
|
||||
* @method int chmod(int $mode, string $filename) Set permissions on a file via FTP
|
||||
* @method bool delete(string $path) Deletes a file on the FTP server
|
||||
* @method bool exec(string $command) Requests execution of a command on the FTP server
|
||||
* @method bool fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server and saves to an open file
|
||||
* @method bool fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Uploads from an open file to the FTP server
|
||||
* @method mixed get_option(int $option) Retrieves various runtime behaviours of the current FTP stream
|
||||
* @method bool get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server
|
||||
* @method int mdtm(string $remote_file) Returns the last modified time of the given file
|
||||
* @method array mlsd(string $remote_dir) Returns a list of files in the given directory
|
||||
* @method int nb_continue() Continues retrieving/sending a file (non-blocking)
|
||||
* @method int nb_fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to an open file (non-blocking)
|
||||
* @method int nb_fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Stores a file from an open file to the FTP server (non-blocking)
|
||||
* @method int nb_get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to a local file (non-blocking)
|
||||
* @method int nb_put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Stores a file on the FTP server (non-blocking)
|
||||
* @method bool pasv(bool $pasv) Turns passive mode on or off
|
||||
* @method bool put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Uploads a file to the FTP server
|
||||
* @method string pwd() Returns the current directory name
|
||||
* @method bool quit() Closes an FTP connection
|
||||
* @method array raw(string $command) Sends an arbitrary command to an FTP server
|
||||
* @method bool rename(string $oldname, string $newname) Renames a file or a directory on the FTP server
|
||||
* @method bool set_option(int $option, mixed $value) Set miscellaneous runtime FTP options
|
||||
* @method bool site(string $command) Sends a SITE command to the server
|
||||
* @method int size(string $remote_file) Returns the size of the given file
|
||||
* @method string systype() Returns the system type identifier of the remote FTP server
|
||||
*
|
||||
* @author Nicolas Tallefourtane <dev@nicolab.net>
|
||||
*/
|
||||
class FtpClient implements Countable
|
||||
{
|
||||
/**
|
||||
* The connection with the server.
|
||||
*
|
||||
* @var resource
|
||||
*/
|
||||
protected $conn;
|
||||
|
||||
/**
|
||||
* PHP FTP functions wrapper.
|
||||
*
|
||||
* @var FtpWrapper
|
||||
*/
|
||||
private $ftp;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param resource|null $connection
|
||||
* @throws FtpException If FTP extension is not loaded.
|
||||
*/
|
||||
public function __construct($connection = null)
|
||||
{
|
||||
if (!extension_loaded('ftp')) {
|
||||
throw new FtpException('FTP extension is not loaded!');
|
||||
}
|
||||
|
||||
if ($connection) {
|
||||
$this->conn = $connection;
|
||||
}
|
||||
|
||||
$this->setWrapper(new FtpWrapper($this->conn));
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the connection when the object is destroyed.
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if ($this->conn) {
|
||||
$this->ftp->close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call an internal method or a FTP method handled by the wrapper.
|
||||
*
|
||||
* Wrap the FTP PHP functions to call as method of FtpClient object.
|
||||
* The connection is automaticaly passed to the FTP PHP functions.
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $arguments
|
||||
* @return mixed
|
||||
* @throws FtpException When the function is not valid
|
||||
*/
|
||||
public function __call($method, array $arguments)
|
||||
{
|
||||
return $this->ftp->__call($method, $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrites the PHP limit
|
||||
*
|
||||
* @param string|null $memory The memory limit, if null is not modified
|
||||
* @param int $time_limit The max execution time, unlimited by default
|
||||
* @param bool $ignore_user_abort Ignore user abort, true by default
|
||||
* @return FtpClient
|
||||
*/
|
||||
public function setPhpLimit($memory = null, $time_limit = 0, $ignore_user_abort = true)
|
||||
{
|
||||
if (null !== $memory) {
|
||||
ini_set('memory_limit', $memory);
|
||||
}
|
||||
|
||||
ignore_user_abort($ignore_user_abort);
|
||||
set_time_limit($time_limit);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the help information of the remote FTP server.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function help()
|
||||
{
|
||||
return $this->ftp->raw('help');
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a FTP connection.
|
||||
*
|
||||
* @param string $host
|
||||
* @param bool $ssl
|
||||
* @param int $port
|
||||
* @param int $timeout
|
||||
*
|
||||
* @return FtpClient
|
||||
* @throws FtpException If unable to connect
|
||||
*/
|
||||
public function connect($host, $ssl = false, $port = 21, $timeout = 90)
|
||||
{
|
||||
if ($ssl) {
|
||||
$this->conn = $this->ftp->ssl_connect($host, $port, $timeout);
|
||||
} else {
|
||||
$this->conn = $this->ftp->connect($host, $port, $timeout);
|
||||
}
|
||||
|
||||
if (!$this->conn) {
|
||||
throw new FtpException('Unable to connect');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the current FTP connection.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function close()
|
||||
{
|
||||
if ($this->conn) {
|
||||
$this->ftp->close();
|
||||
$this->conn = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the connection with the server.
|
||||
*
|
||||
* @return resource
|
||||
*/
|
||||
public function getConnection()
|
||||
{
|
||||
return $this->conn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the wrapper.
|
||||
*
|
||||
* @return FtpWrapper
|
||||
*/
|
||||
public function getWrapper()
|
||||
{
|
||||
return $this->ftp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs in to an FTP connection.
|
||||
*
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
*
|
||||
* @return FtpClient
|
||||
* @throws FtpException If the login is incorrect
|
||||
*/
|
||||
public function login($username = 'anonymous', $password = '')
|
||||
{
|
||||
$result = $this->ftp->login($username, $password);
|
||||
|
||||
if ($result === false) {
|
||||
throw new FtpException('Login incorrect');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last modified time of the given file.
|
||||
* Return -1 on error
|
||||
*
|
||||
* @param string $remoteFile
|
||||
* @param string|null $format
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function modifiedTime($remoteFile, $format = null)
|
||||
{
|
||||
$time = $this->ftp->mdtm($remoteFile);
|
||||
|
||||
if ($time !== -1 && $format !== null) {
|
||||
return date($format, $time);
|
||||
}
|
||||
|
||||
return $time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes to the parent directory.
|
||||
*
|
||||
* @throws FtpException
|
||||
* @return FtpClient
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
$result = $this->ftp->cdup();
|
||||
|
||||
if ($result === false) {
|
||||
throw new FtpException('Unable to get parent folder');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of files in the given directory.
|
||||
*
|
||||
* @param string $directory The directory, by default is "." the current directory
|
||||
* @param bool $recursive
|
||||
* @param callable $filter A callable to filter the result, by default is asort() PHP function.
|
||||
* The result is passed in array argument,
|
||||
* must take the argument by reference !
|
||||
* The callable should proceed with the reference array
|
||||
* because is the behavior of several PHP sorting
|
||||
* functions (by reference ensure directly the compatibility
|
||||
* with all PHP sorting functions).
|
||||
*
|
||||
* @return array
|
||||
* @throws FtpException If unable to list the directory
|
||||
*/
|
||||
public function nlist($directory = '.', $recursive = false, $filter = 'sort')
|
||||
{
|
||||
if (!$this->isDir($directory)) {
|
||||
throw new FtpException('"'.$directory.'" is not a directory');
|
||||
}
|
||||
|
||||
$files = $this->ftp->nlist($directory);
|
||||
|
||||
if ($files === false) {
|
||||
throw new FtpException('Unable to list directory');
|
||||
}
|
||||
|
||||
$result = array();
|
||||
$dir_len = strlen($directory);
|
||||
|
||||
// if it's the current
|
||||
if (false !== ($kdot = array_search('.', $files))) {
|
||||
unset($files[$kdot]);
|
||||
}
|
||||
|
||||
// if it's the parent
|
||||
if(false !== ($kdot = array_search('..', $files))) {
|
||||
unset($files[$kdot]);
|
||||
}
|
||||
|
||||
if (!$recursive) {
|
||||
$result = $files;
|
||||
|
||||
// working with the reference (behavior of several PHP sorting functions)
|
||||
$filter($result);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
// utils for recursion
|
||||
$flatten = function (array $arr) use (&$flatten) {
|
||||
$flat = [];
|
||||
|
||||
foreach ($arr as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$flat = array_merge($flat, $flatten($v));
|
||||
} else {
|
||||
$flat[] = $v;
|
||||
}
|
||||
}
|
||||
|
||||
return $flat;
|
||||
};
|
||||
|
||||
foreach ($files as $file) {
|
||||
$file = $directory.'/'.$file;
|
||||
|
||||
// if contains the root path (behavior of the recursivity)
|
||||
if (0 === strpos($file, $directory, $dir_len)) {
|
||||
$file = substr($file, $dir_len);
|
||||
}
|
||||
|
||||
if ($this->isDir($file)) {
|
||||
$result[] = $file;
|
||||
$items = $flatten($this->nlist($file, true, $filter));
|
||||
|
||||
foreach ($items as $item) {
|
||||
$result[] = $item;
|
||||
}
|
||||
|
||||
} else {
|
||||
$result[] = $file;
|
||||
}
|
||||
}
|
||||
|
||||
$result = array_unique($result);
|
||||
$filter($result);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a directory.
|
||||
*
|
||||
* @see FtpClient::rmdir()
|
||||
* @see FtpClient::remove()
|
||||
* @see FtpClient::put()
|
||||
* @see FtpClient::putAll()
|
||||
*
|
||||
* @param string $directory The directory
|
||||
* @param bool $recursive
|
||||
* @return bool
|
||||
*/
|
||||
public function mkdir($directory, $recursive = false)
|
||||
{
|
||||
if (!$recursive or $this->isDir($directory)) {
|
||||
return $this->ftp->mkdir($directory);
|
||||
}
|
||||
|
||||
$result = false;
|
||||
$pwd = $this->ftp->pwd();
|
||||
$parts = explode('/', $directory);
|
||||
|
||||
foreach ($parts as $part) {
|
||||
if ($part == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!@$this->ftp->chdir($part)) {
|
||||
$result = $this->ftp->mkdir($part);
|
||||
$this->ftp->chdir($part);
|
||||
}
|
||||
}
|
||||
|
||||
$this->ftp->chdir($pwd);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a directory.
|
||||
*
|
||||
* @see FtpClient::mkdir()
|
||||
* @see FtpClient::cleanDir()
|
||||
* @see FtpClient::remove()
|
||||
* @see FtpClient::delete()
|
||||
* @param string $directory
|
||||
* @param bool $recursive Forces deletion if the directory is not empty
|
||||
* @return bool
|
||||
* @throws FtpException If unable to list the directory to remove
|
||||
*/
|
||||
public function rmdir($directory, $recursive = true)
|
||||
{
|
||||
if ($recursive) {
|
||||
$files = $this->nlist($directory, false, 'rsort');
|
||||
|
||||
// remove children
|
||||
foreach ($files as $file) {
|
||||
$this->remove($file, true);
|
||||
}
|
||||
}
|
||||
|
||||
// remove the directory
|
||||
return $this->ftp->rmdir($directory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty directory.
|
||||
*
|
||||
* @see FtpClient::remove()
|
||||
* @see FtpClient::delete()
|
||||
* @see FtpClient::rmdir()
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
*/
|
||||
public function cleanDir($directory)
|
||||
{
|
||||
if (!$files = $this->nlist($directory)) {
|
||||
return $this->isEmpty($directory);
|
||||
}
|
||||
|
||||
// remove children
|
||||
foreach ($files as $file) {
|
||||
$this->remove($file, true);
|
||||
}
|
||||
|
||||
return $this->isEmpty($directory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a file or a directory.
|
||||
*
|
||||
* @see FtpClient::rmdir()
|
||||
* @see FtpClient::cleanDir()
|
||||
* @see FtpClient::delete()
|
||||
* @param string $path The path of the file or directory to remove
|
||||
* @param bool $recursive Is effective only if $path is a directory, {@see FtpClient::rmdir()}
|
||||
* @return bool
|
||||
*/
|
||||
public function remove($path, $recursive = false)
|
||||
{
|
||||
if ($path == '.' || $path == '..') {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
if (@$this->ftp->delete($path)
|
||||
or ($this->isDir($path)
|
||||
and $this->rmdir($path, $recursive))) {
|
||||
return true;
|
||||
} else {
|
||||
// in special cases the delete can fail (for example, at Symfony's "r+e.gex[c]a(r)s" directory)
|
||||
$newPath = preg_replace('/[^A-Za-z0-9\/]/', '', $path);
|
||||
if ($this->rename($path, $newPath)) {
|
||||
if (@$this->ftp->delete($newPath)
|
||||
or ($this->isDir($newPath)
|
||||
and $this->rmdir($newPath, $recursive))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a directory exist.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
* @throws FtpException
|
||||
*/
|
||||
public function isDir($directory)
|
||||
{
|
||||
$pwd = $this->ftp->pwd();
|
||||
|
||||
if ($pwd === false) {
|
||||
throw new FtpException('Unable to resolve the current directory');
|
||||
}
|
||||
|
||||
if (@$this->ftp->chdir($directory)) {
|
||||
$this->ftp->chdir($pwd);
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->ftp->chdir($pwd);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a directory is empty.
|
||||
*
|
||||
* @param string $directory
|
||||
* @return bool
|
||||
*/
|
||||
public function isEmpty($directory)
|
||||
{
|
||||
return $this->countItems($directory, null, false) === 0 ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan a directory and returns the details of each item.
|
||||
*
|
||||
* @see FtpClient::nlist()
|
||||
* @see FtpClient::rawlist()
|
||||
* @see FtpClient::parseRawList()
|
||||
* @see FtpClient::dirSize()
|
||||
* @param string $directory
|
||||
* @param bool $recursive
|
||||
* @return array
|
||||
*/
|
||||
public function scanDir($directory = '.', $recursive = false)
|
||||
{
|
||||
return $this->parseRawList($this->rawlist($directory, $recursive));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total size of the given directory in bytes.
|
||||
*
|
||||
* @param string $directory The directory, by default is the current directory.
|
||||
* @param bool $recursive true by default
|
||||
* @return int The size in bytes.
|
||||
*/
|
||||
public function dirSize($directory = '.', $recursive = true)
|
||||
{
|
||||
$items = $this->scanDir($directory, $recursive);
|
||||
$size = 0;
|
||||
|
||||
foreach ($items as $item) {
|
||||
$size += (int) $item['size'];
|
||||
}
|
||||
|
||||
return $size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the items (file, directory, link, unknown).
|
||||
*
|
||||
* @param string $directory The directory, by default is the current directory.
|
||||
* @param string|null $type The type of item to count (file, directory, link, unknown)
|
||||
* @param bool $recursive true by default
|
||||
* @return int
|
||||
*/
|
||||
public function countItems($directory = '.', $type = null, $recursive = true)
|
||||
{
|
||||
$items = (null === $type ? $this->nlist($directory, $recursive)
|
||||
: $this->scanDir($directory, $recursive));
|
||||
|
||||
$count = 0;
|
||||
foreach ($items as $item) {
|
||||
if (null === $type or $item['type'] == $type) {
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the items (file, directory, link, unknown).
|
||||
* This method call `countItems()` with the default arguments.
|
||||
*
|
||||
* @see countItems
|
||||
* @return int
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return $this->countItems();
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads a file from the FTP server into a string
|
||||
*
|
||||
* @param string $remote_file
|
||||
* @param int $mode
|
||||
* @param int $resumepos
|
||||
* @return string|null
|
||||
*/
|
||||
public function getContent($remote_file, $mode = FTP_BINARY, $resumepos = 0)
|
||||
{
|
||||
$handle = fopen('php://temp', 'r+');
|
||||
|
||||
if ($this->ftp->fget($handle, $remote_file, $mode, $resumepos)) {
|
||||
rewind($handle);
|
||||
return stream_get_contents($handle);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads a file to the server from a string.
|
||||
*
|
||||
* @param string $remote_file
|
||||
* @param string $content
|
||||
* @return FtpClient
|
||||
* @throws FtpException When the transfer fails
|
||||
*/
|
||||
public function putFromString($remote_file, $content)
|
||||
{
|
||||
$handle = fopen('php://temp', 'w');
|
||||
|
||||
fwrite($handle, $content);
|
||||
rewind($handle);
|
||||
|
||||
if ($this->ftp->fput($remote_file, $handle, FTP_BINARY)) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
throw new FtpException('Unable to put the file "'.$remote_file.'"');
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads a file to the server.
|
||||
*
|
||||
* @param string $local_file
|
||||
* @return FtpClient
|
||||
* @throws FtpException When the transfer fails
|
||||
*/
|
||||
public function putFromPath($local_file)
|
||||
{
|
||||
$remote_file = basename($local_file);
|
||||
$handle = fopen($local_file, 'r');
|
||||
|
||||
if ($this->ftp->fput($remote_file, $handle, FTP_BINARY)) {
|
||||
rewind($handle);
|
||||
return $this;
|
||||
}
|
||||
|
||||
throw new FtpException(
|
||||
'Unable to put the remote file from the local file "'.$local_file.'"'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload files.
|
||||
*
|
||||
* @param string $source_directory
|
||||
* @param string $target_directory
|
||||
* @param int $mode
|
||||
* @return FtpClient
|
||||
*/
|
||||
public function putAll($source_directory, $target_directory, $mode = FTP_BINARY)
|
||||
{
|
||||
$d = dir($source_directory);
|
||||
|
||||
// do this for each file in the directory
|
||||
while ($file = $d->read()) {
|
||||
|
||||
// to prevent an infinite loop
|
||||
if ($file != "." && $file != "..") {
|
||||
|
||||
// do the following if it is a directory
|
||||
if (is_dir($source_directory.'/'.$file)) {
|
||||
if (!$this->isDir($target_directory.'/'.$file)) {
|
||||
|
||||
// create directories that do not yet exist
|
||||
$this->ftp->mkdir($target_directory.'/'.$file);
|
||||
}
|
||||
|
||||
// recursive part
|
||||
$this->putAll(
|
||||
$source_directory.'/'.$file, $target_directory.'/'.$file,
|
||||
$mode
|
||||
);
|
||||
} else {
|
||||
|
||||
// put the files
|
||||
$this->ftp->put(
|
||||
$target_directory.'/'.$file, $source_directory.'/'.$file,
|
||||
$mode
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$d->close();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads all files from remote FTP directory
|
||||
*
|
||||
* @param string $source_directory The remote directory
|
||||
* @param string $target_directory The local directory
|
||||
* @param int $mode
|
||||
* @return FtpClient
|
||||
*/
|
||||
public function getAll($source_directory, $target_directory, $mode = FTP_BINARY)
|
||||
{
|
||||
if ($source_directory != ".") {
|
||||
if ($this->ftp->chdir($source_directory) == false) {
|
||||
throw new FtpException("Unable to change directory: ".$source_directory);
|
||||
}
|
||||
|
||||
if (!(is_dir($target_directory))) {
|
||||
mkdir($target_directory);
|
||||
}
|
||||
|
||||
chdir($target_directory);
|
||||
}
|
||||
|
||||
$contents = $this->ftp->nlist(".");
|
||||
|
||||
foreach ($contents as $file) {
|
||||
if ($file == '.' || $file == '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->ftp->get($target_directory."/".$file, $file, $mode);
|
||||
}
|
||||
|
||||
$this->ftp->chdir("..");
|
||||
chdir("..");
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a detailed list of files in the given directory.
|
||||
*
|
||||
* @see FtpClient::nlist()
|
||||
* @see FtpClient::scanDir()
|
||||
* @see FtpClient::dirSize()
|
||||
* @param string $directory The directory, by default is the current directory
|
||||
* @param bool $recursive
|
||||
* @return array
|
||||
* @throws FtpException
|
||||
*/
|
||||
public function rawlist($directory = '.', $recursive = false)
|
||||
{
|
||||
if (!$this->isDir($directory)) {
|
||||
throw new FtpException('"'.$directory.'" is not a directory.');
|
||||
}
|
||||
|
||||
if (strpos($directory, " ") > 0) {
|
||||
$ftproot = $this->ftp->pwd();
|
||||
$this->ftp->chdir($directory);
|
||||
$list = $this->ftp->rawlist("");
|
||||
$this->ftp->chdir($ftproot);
|
||||
} else {
|
||||
$list = $this->ftp->rawlist($directory);
|
||||
}
|
||||
|
||||
$items = array();
|
||||
|
||||
if (!$list) {
|
||||
return $items;
|
||||
}
|
||||
|
||||
if (false == $recursive) {
|
||||
foreach ($list as $path => $item) {
|
||||
$chunks = preg_split("/\s+/", $item);
|
||||
|
||||
// if not "name"
|
||||
if (!isset($chunks[8]) || strlen($chunks[8]) === 0 || $chunks[8] == '.' || $chunks[8] == '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$path = $directory.'/'.$chunks[8];
|
||||
|
||||
if (isset($chunks[9])) {
|
||||
$nbChunks = count($chunks);
|
||||
|
||||
for ($i = 9; $i < $nbChunks; $i++) {
|
||||
$path .= ' '.$chunks[$i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (substr($path, 0, 2) == './') {
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
|
||||
$items[ $this->rawToType($item).'#'.$path ] = $item;
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
$path = '';
|
||||
|
||||
foreach ($list as $item) {
|
||||
$len = strlen($item);
|
||||
|
||||
if (!$len
|
||||
|
||||
// "."
|
||||
|| ($item[$len-1] == '.' && $item[$len-2] == ' '
|
||||
|
||||
// ".."
|
||||
or $item[$len-1] == '.' && $item[$len-2] == '.' && $item[$len-3] == ' ')
|
||||
) {
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$chunks = preg_split("/\s+/", $item);
|
||||
|
||||
// if not "name"
|
||||
if (!isset($chunks[8]) || strlen($chunks[8]) === 0 || $chunks[8] == '.' || $chunks[8] == '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$path = $directory.'/'.$chunks[8];
|
||||
|
||||
if (isset($chunks[9])) {
|
||||
$nbChunks = count($chunks);
|
||||
|
||||
for ($i = 9; $i < $nbChunks; $i++) {
|
||||
$path .= ' '.$chunks[$i];
|
||||
}
|
||||
}
|
||||
|
||||
if (substr($path, 0, 2) == './') {
|
||||
$path = substr($path, 2);
|
||||
}
|
||||
|
||||
$items[$this->rawToType($item).'#'.$path] = $item;
|
||||
|
||||
if ($item[0] == 'd') {
|
||||
$sublist = $this->rawlist($path, true);
|
||||
|
||||
foreach ($sublist as $subpath => $subitem) {
|
||||
$items[$subpath] = $subitem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse raw list.
|
||||
*
|
||||
* @see FtpClient::rawlist()
|
||||
* @see FtpClient::scanDir()
|
||||
* @see FtpClient::dirSize()
|
||||
* @param array $rawlist
|
||||
* @return array
|
||||
*/
|
||||
public function parseRawList(array $rawlist)
|
||||
{
|
||||
$items = array();
|
||||
$path = '';
|
||||
|
||||
foreach ($rawlist as $key => $child) {
|
||||
$chunks = preg_split("/\s+/", $child, 9);
|
||||
|
||||
if (isset($chunks[8]) && ($chunks[8] == '.' or $chunks[8] == '..')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (count($chunks) === 1) {
|
||||
$len = strlen($chunks[0]);
|
||||
|
||||
if ($len && $chunks[0][$len-1] == ':') {
|
||||
$path = substr($chunks[0], 0, -1);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Prepare for filename that has space
|
||||
$nameSlices = array_slice($chunks, 8, true);
|
||||
|
||||
$item = [
|
||||
'permissions' => $chunks[0],
|
||||
'number' => $chunks[1],
|
||||
'owner' => $chunks[2],
|
||||
'group' => $chunks[3],
|
||||
'size' => $chunks[4],
|
||||
'month' => $chunks[5],
|
||||
'day' => $chunks[6],
|
||||
'time' => $chunks[7],
|
||||
'name' => implode(' ', $nameSlices),
|
||||
'type' => $this->rawToType($chunks[0]),
|
||||
];
|
||||
|
||||
if ($item['type'] == 'link' && isset($chunks[10])) {
|
||||
$item['target'] = $chunks[10]; // 9 is "->"
|
||||
}
|
||||
|
||||
// if the key is not the path, behavior of ftp_rawlist() PHP function
|
||||
if (is_int($key) || false === strpos($key, $item['name'])) {
|
||||
array_splice($chunks, 0, 8);
|
||||
|
||||
$key = $item['type'].'#'
|
||||
.($path ? $path.'/' : '')
|
||||
.implode(' ', $chunks);
|
||||
|
||||
if ($item['type'] == 'link') {
|
||||
// get the first part of 'link#the-link.ext -> /path/of/the/source.ext'
|
||||
$exp = explode(' ->', $key);
|
||||
$key = rtrim($exp[0]);
|
||||
}
|
||||
|
||||
$items[$key] = $item;
|
||||
} else {
|
||||
// the key is the path, behavior of FtpClient::rawlist() method()
|
||||
$items[$key] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert raw info (drwx---r-x ...) to type (file, directory, link, unknown).
|
||||
* Only the first char is used for resolving.
|
||||
*
|
||||
* @param string $permission Example : drwx---r-x
|
||||
*
|
||||
* @return string The file type (file, directory, link, unknown)
|
||||
* @throws FtpException
|
||||
*/
|
||||
public function rawToType($permission)
|
||||
{
|
||||
if (!is_string($permission)) {
|
||||
throw new FtpException('The "$permission" argument must be a string, "'
|
||||
.gettype($permission).'" given.');
|
||||
}
|
||||
|
||||
if (empty($permission[0])) {
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
switch ($permission[0]) {
|
||||
case '-':
|
||||
return 'file';
|
||||
|
||||
case 'd':
|
||||
return 'directory';
|
||||
|
||||
case 'l':
|
||||
return 'link';
|
||||
|
||||
default:
|
||||
return 'unknown';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the wrapper which forward the PHP FTP functions to use in FtpClient instance.
|
||||
*
|
||||
* @param FtpWrapper $wrapper
|
||||
* @return FtpClient
|
||||
*/
|
||||
protected function setWrapper(FtpWrapper $wrapper)
|
||||
{
|
||||
$this->ftp = $wrapper;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the `nicolab/php-ftp-client` package.
|
||||
*
|
||||
* (c) Nicolas Tallefourtane <dev@nicolab.net>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @copyright Nicolas Tallefourtane http://nicolab.net
|
||||
*/
|
||||
// namespace FtpClient;
|
||||
|
||||
/**
|
||||
* The FtpException class.
|
||||
* Exception thrown if an error on runtime of the FTP client occurs.
|
||||
* @inheritDoc
|
||||
* @author Nicolas Tallefourtane <dev@nicolab.net>
|
||||
*/
|
||||
class FtpException extends \Exception {}
|
|
@ -1,116 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* This file is part of the `nicolab/php-ftp-client` package.
|
||||
*
|
||||
* (c) Nicolas Tallefourtane <dev@nicolab.net>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @copyright Nicolas Tallefourtane http://nicolab.net
|
||||
*/
|
||||
// namespace FtpClient;
|
||||
|
||||
/**
|
||||
* Wrap the PHP FTP functions
|
||||
*
|
||||
* @method bool alloc(int $filesize, string &$result = null) Allocates space for a file to be uploaded
|
||||
* @method bool cdup() Changes to the parent directory
|
||||
* @method bool chdir(string $directory) Changes the current directory on a FTP server
|
||||
* @method int chmod(int $mode, string $filename) Set permissions on a file via FTP
|
||||
* @method bool close() Closes an FTP connection
|
||||
* @method bool delete(string $path) Deletes a file on the FTP server
|
||||
* @method bool exec(string $command) Requests execution of a command on the FTP server
|
||||
* @method bool fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server and saves to an open file
|
||||
* @method bool fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Uploads from an open file to the FTP server
|
||||
* @method mixed get_option(int $option) Retrieves various runtime behaviours of the current FTP stream
|
||||
* @method bool get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server
|
||||
* @method bool login(string $username, string $password) Logs in to an FTP connection
|
||||
* @method int mdtm(string $remote_file) Returns the last modified time of the given file
|
||||
* @method bool mkdir(string $directory) Creates a directory
|
||||
* @method array mlsd(string $remote_dir) Returns a list of files in the given directory
|
||||
* @method int nb_continue() Continues retrieving/sending a file (non-blocking)
|
||||
* @method int nb_fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to an open file (non-blocking)
|
||||
* @method int nb_fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Stores a file from an open file to the FTP server (non-blocking)
|
||||
* @method int nb_get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to a local file (non-blocking)
|
||||
* @method int nb_put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Stores a file on the FTP server (non-blocking)
|
||||
* @method array nlist(string $directory) Returns a list of file names in the given directory; remote_dir parameter may also include arguments
|
||||
* @method bool pasv(bool $pasv) Turns passive mode on or off
|
||||
* @method bool put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Uploads a file to the FTP server
|
||||
* @method string pwd() Returns the current directory name
|
||||
* @method bool quit() Closes an FTP connection
|
||||
* @method array raw(string $command) Sends an arbitrary command to an FTP server
|
||||
* @method array rawlist(string $directory, bool $recursive = false) Returns a detailed list of files in the given directory
|
||||
* @method bool rename(string $oldname, string $newname) Renames a file or a directory on the FTP server
|
||||
* @method bool rmdir(string $directory) Removes a directory
|
||||
* @method bool set_option(int $option, mixed $value) Set miscellaneous runtime FTP options
|
||||
* @method bool site(string $command) Sends a SITE command to the server
|
||||
* @method int size(string $remote_file) Returns the size of the given file
|
||||
* @method string systype() Returns the system type identifier of the remote FTP server
|
||||
*
|
||||
* @author Nicolas Tallefourtane <dev@nicolab.net>
|
||||
*/
|
||||
class FtpWrapper
|
||||
{
|
||||
/**
|
||||
* The connection with the server
|
||||
*
|
||||
* @var resource
|
||||
*/
|
||||
protected $conn;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param resource &$connection The FTP (or SSL-FTP) connection (takes by reference).
|
||||
*/
|
||||
public function __construct(&$connection)
|
||||
{
|
||||
$this->conn = &$connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forward the method call to FTP functions
|
||||
*
|
||||
* @param string $function
|
||||
* @param array $arguments
|
||||
* @return mixed
|
||||
* @throws FtpException When the function is not valid
|
||||
*/
|
||||
public function __call($function, array $arguments)
|
||||
{
|
||||
$function = 'ftp_' . $function;
|
||||
|
||||
if (function_exists($function)) {
|
||||
array_unshift($arguments, $this->conn);
|
||||
return @call_user_func_array($function, $arguments);
|
||||
}
|
||||
|
||||
throw new FtpException("{$function} is not a valid FTP function");
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens a FTP connection
|
||||
*
|
||||
* @param string $host
|
||||
* @param int $port
|
||||
* @param int $timeout
|
||||
* @return resource
|
||||
*/
|
||||
public function connect($host, $port = 21, $timeout = 90)
|
||||
{
|
||||
return @ftp_connect($host, $port, $timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens a Secure SSL-FTP connection
|
||||
* @param string $host
|
||||
* @param int $port
|
||||
* @param int $timeout
|
||||
* @return resource
|
||||
*/
|
||||
public function ssl_connect($host, $port = 21, $timeout = 90)
|
||||
{
|
||||
return @ftp_ssl_connect($host, $port, $timeout);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,199 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* https://github.com/devster/ubench
|
||||
*
|
||||
* Copyright (c) 2012 Jeremy Perret
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is furnished
|
||||
* to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
class Ubench
|
||||
{
|
||||
protected $start_time;
|
||||
|
||||
protected $end_time;
|
||||
|
||||
protected $memory_usage;
|
||||
|
||||
/**
|
||||
* Sets start microtime
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function start()
|
||||
{
|
||||
$this->start_time = microtime(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets end microtime
|
||||
*
|
||||
* @return $this
|
||||
* @throws Exception
|
||||
*/
|
||||
public function end()
|
||||
{
|
||||
if (!$this->hasStarted())
|
||||
{
|
||||
throw new LogicException("You must call start()");
|
||||
}
|
||||
|
||||
$this->end_time = microtime(true);
|
||||
$this->memory_usage = memory_get_usage(true);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the elapsed time, readable or not
|
||||
*
|
||||
* @param bool $raw
|
||||
* @param string $format The format to display (printf format)
|
||||
* @return float|string
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getTime($raw = false, $format = null)
|
||||
{
|
||||
if (!$this->hasStarted())
|
||||
{
|
||||
throw new LogicException("You must call start()");
|
||||
}
|
||||
|
||||
if (!$this->hasEnded())
|
||||
{
|
||||
throw new LogicException("You must call end()");
|
||||
}
|
||||
|
||||
$elapsed = $this->end_time - $this->start_time;
|
||||
|
||||
return $raw ? $elapsed : self::readableElapsedTime($elapsed, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the memory usage at the end checkpoint
|
||||
*
|
||||
* @param boolean $readable Whether the result must be human readable
|
||||
* @param string $format The format to display (printf format)
|
||||
* @return string|float
|
||||
*/
|
||||
public function getMemoryUsage($raw = false, $format = null)
|
||||
{
|
||||
return $raw ? $this->memory_usage : self::readableSize($this->memory_usage, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the memory peak, readable or not
|
||||
*
|
||||
* @param boolean $readable Whether the result must be human readable
|
||||
* @param string $format The format to display (printf format)
|
||||
* @return string|float
|
||||
*/
|
||||
public function getMemoryPeak($raw = false, $format = null)
|
||||
{
|
||||
$memory = memory_get_peak_usage(true);
|
||||
|
||||
return $raw ? $memory : self::readableSize($memory, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a callable with start() and end() calls
|
||||
*
|
||||
* Additional arguments passed to this method will be passed to
|
||||
* the callable.
|
||||
*
|
||||
* @param callable $callable
|
||||
* @return mixed
|
||||
*/
|
||||
public function run(callable $callable)
|
||||
{
|
||||
$arguments = func_get_args();
|
||||
array_shift($arguments);
|
||||
|
||||
$this->start();
|
||||
$result = call_user_func_array($callable, $arguments);
|
||||
$this->end();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a human readable memory size
|
||||
*
|
||||
* @param int $size
|
||||
* @param string $format The format to display (printf format)
|
||||
* @param int $round
|
||||
* @return string
|
||||
*/
|
||||
public static function readableSize($size, $format = null, $round = 3)
|
||||
{
|
||||
$mod = 1024;
|
||||
|
||||
if (is_null($format)) {
|
||||
$format = '%.2f%s';
|
||||
}
|
||||
|
||||
$units = explode(' ','B Kb Mb Gb Tb');
|
||||
|
||||
for ($i = 0; $size > $mod; $i++) {
|
||||
$size /= $mod;
|
||||
}
|
||||
|
||||
if (0 === $i) {
|
||||
$format = preg_replace('/(%.[\d]+f)/', '%d', $format);
|
||||
}
|
||||
|
||||
return sprintf($format, round($size, $round), $units[$i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a human readable elapsed time
|
||||
*
|
||||
* @param float $microtime
|
||||
* @param string $format The format to display (printf format)
|
||||
* @return string
|
||||
*/
|
||||
public static function readableElapsedTime($microtime, $format = null, $round = 3)
|
||||
{
|
||||
if (is_null($format)) {
|
||||
$format = '%.3f%s';
|
||||
}
|
||||
|
||||
if ($microtime >= 1) {
|
||||
$unit = 's';
|
||||
$time = round($microtime, $round);
|
||||
} else {
|
||||
$unit = 'ms';
|
||||
$time = round($microtime*1000);
|
||||
|
||||
$format = preg_replace('/(%.[\d]+f)/', '%d', $format);
|
||||
}
|
||||
|
||||
return sprintf($format, $time, $unit);
|
||||
}
|
||||
|
||||
public function hasEnded()
|
||||
{
|
||||
return isset($this->end_time);
|
||||
}
|
||||
|
||||
public function hasStarted()
|
||||
{
|
||||
return isset($this->start_time);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @author icret
|
||||
* @link https://png.cm
|
||||
* @email lemonim@qq.com
|
||||
* @project EasyImage2.0 - 简单图床
|
||||
* @Github https://github.com/icret/easyImages2.0
|
||||
* @Telegram https://t.me/Easy_Image
|
||||
* QQ Group 954441002
|
||||
* @Last 2024-01-20
|
||||
|
||||
* 上传服务器后第一次打开会检查运行环境,请根据提示操作;
|
||||
* 检查环境仅会在第一开始开始出现,并在config目录下生成EasyImage.lock文件,如需再次查看请删除此文件。
|
||||
|
||||
* 敬请注意:本程序为开源程序,你可以使用本程序在任何非商业项目或者网站中。但请你务必保留代码中相关信息(页面logo和页面上必要的链接可以更改)
|
||||
* 本人仅为程序开源创作,如非法网站与本人无关,请勿用于非法用途
|
||||
* 请为本人网站 (https://png.cm) 加上网址链接,谢谢支持。作为开发者你可以对相应的后台功能进行扩展(增删改相应代码),但请保留代码中相关来源信息(例如:本人博客,邮箱等)
|
||||
* 如果因安装问题或其他问题可以给我发邮件。
|
||||
*/
|
||||
|
||||
/*---------------基础配置开始-------------------*/
|
||||
|
||||
// 设置html为utf8
|
||||
header('Content-Type:text/html;charset=utf-8');
|
||||
// 定义根目录
|
||||
define('APP_ROOT', str_replace('\\', '/', 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']);
|
||||
// 修改内存限制 根据服务器配置选择,低于128M容易出现上传失败,你懂得图片挺占用内存的
|
||||
ini_set('memory_limit', '512M');
|
||||
// 判断当前系统是否为windows
|
||||
define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0);
|
||||
// 定义程序版本
|
||||
define('APP_VERSION', '2.8.4');
|
||||
|
||||
/*---------------基础配置结束-------------------*/
|
|
@ -15,6 +15,7 @@ file_put_contents(APP_ROOT . '/config/EasyIamge.lock', '安装环境检测锁定
|
|||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">x</span><span class="sr-only">关闭</span></button>
|
||||
<h4 class="modal-title">
|
||||
<i class="icon icon-heart"> </i><a href="https://github.com/icret/EasyImages2.0" target="_blank">简单图床-EasyImage2.0</a> 安装环境检测
|
||||
</h4>
|
||||
|
@ -92,6 +93,12 @@ file_put_contents(APP_ROOT . '/config/EasyIamge.lock', '安装环境检测锁定
|
|||
backdrop: "static", //点击空白处不关闭对话框
|
||||
show: true
|
||||
})
|
||||
} else {
|
||||
new $.zui.Messager("取消查看 - 如需再次展示请删除config/EasyIamge.lock文件", {
|
||||
type: "info", // 定义颜色主题
|
||||
time: 6000,
|
||||
icon: "info-sign" // 定义消息图标
|
||||
}).show();
|
||||
}
|
||||
console.log('EasyIamge.lock 生成完毕!')
|
||||
</script>
|
|
@ -1,19 +1,20 @@
|
|||
<?php
|
||||
|
||||
/** 禁止直接访问 */
|
||||
defined('APP_ROOT') ?: exit;
|
||||
// 开启 DEBUG 2023-04-03
|
||||
if (!ini_get('display_errors')) {
|
||||
ini_set('display_errors', 'On');
|
||||
}
|
||||
error_reporting(E_ALL);
|
||||
|
||||
/*
|
||||
// 检查当前PHP版本是否大于7.0
|
||||
if (PHP_VERSION < 7) {
|
||||
echo '
|
||||
new $.zui.Messager("当前PHP版本<7.0, 部分功能受限!",{
|
||||
type: "primary", // 定义颜色主题
|
||||
time:3000
|
||||
time:2000
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
*/
|
||||
|
||||
// 扩展检测
|
||||
$expand = array('fileinfo', 'iconv', 'gd', 'mbstring', 'openssl',);
|
||||
|
@ -23,7 +24,7 @@ foreach ($expand as $val) {
|
|||
new $.zui.Messager("扩展:' . $val . '- 未安装,可能导致图片上传失败! 请尽快修复。",{
|
||||
type: "black", // 定义颜色主题
|
||||
icon: "exclamation-sign", // 定义消息图标
|
||||
time:3500
|
||||
time:2200
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -34,7 +35,7 @@ if ($config['password'] === '7676aaafb027c825bd9abab78b234070e702752f625b752e55e
|
|||
echo '
|
||||
new $.zui.Messager("请修改默认密码,否则会有泄露风险! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:4000
|
||||
time:2400
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -44,7 +45,7 @@ if (is_local($config['domain']) || is_local($config['imgurl'])) {
|
|||
echo '
|
||||
new $.zui.Messager("当前使用局域网,可能会导致外网访问异常!",{
|
||||
type: "black", // 定义颜色主题
|
||||
time:4500
|
||||
time:2600
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -54,7 +55,7 @@ if (file_exists(APP_ROOT . '/.user.ini')) {
|
|||
echo '
|
||||
new $.zui.Messager("请关闭防跨目录读写或删除.user.ini文件",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:5000
|
||||
time:2700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -64,7 +65,7 @@ if (!file_exists(__DIR__ . '/ip2region/ip2region.xdb')) {
|
|||
echo '
|
||||
new $.zui.Messager("IP 数据库不存在, 请在系统信息中查看 Ip2region",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:5500
|
||||
time:2900
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -74,7 +75,7 @@ if (getVersion() !== APP_VERSION) {
|
|||
echo '
|
||||
new $.zui.Messager("当前版本与GitHub不一致,请检查当前是否最新版本!",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:6000
|
||||
time:3100
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -91,7 +92,7 @@ if (!is_file(APP_ROOT . $config['waterImg'])) {
|
|||
echo '
|
||||
new $.zui.Messager("水印图片不存在,请检测路径或者文件是否存在!",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:6500
|
||||
time:3300
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -101,7 +102,7 @@ if (!is_file(APP_ROOT . $config['textFont'])) {
|
|||
echo '
|
||||
new $.zui.Messager("水印字体不存在,请检测路径或者文件是否存在!",{
|
||||
type: "danger", // 定义颜色主题
|
||||
time:6500
|
||||
time:3500
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -115,7 +116,7 @@ if ($config['checkImg'] !== 0) {
|
|||
echo '
|
||||
new $.zui.Messager("moderatecontent 鉴黄接口无法ping通! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:7000
|
||||
time:3700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -131,7 +132,7 @@ if ($config['checkImg'] !== 0) {
|
|||
echo '
|
||||
new $.zui.Messager("' . $ip . $port . ' 鉴黄接口无法ping通! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:7000
|
||||
time:3700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -140,7 +141,7 @@ if ($config['checkImg'] !== 0) {
|
|||
echo '
|
||||
new $.zui.Messager("' . $ip . ' 鉴黄接口无法ping通! ",{
|
||||
type: "warning", // 定义颜色主题
|
||||
time:7000
|
||||
time:3700
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
@ -152,7 +153,32 @@ if (!function_exists('fastcgi_finish_request')) {
|
|||
echo '
|
||||
new $.zui.Messager("开启 fastcgi_finish_request 处理数据会更快喔!",{
|
||||
type: "primary", // 定义颜色主题
|
||||
time:7000
|
||||
time:3900
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
|
||||
// FTP检测
|
||||
if ($config['ftp_status']) {
|
||||
require_once __DIR__ . '/Ftp.php';
|
||||
// 登录FTP
|
||||
try {
|
||||
$ftp = new Ftp;
|
||||
|
||||
if ($config['ftp_ssl'] === 1) {
|
||||
$ftp->sslConnect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
} else {
|
||||
$ftp->connect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
}
|
||||
|
||||
$ftp->login($config['ftp_user'], $config['ftp_pass']);
|
||||
$ftp->pasv($config['ftp_pasv']);
|
||||
} catch (FtpException $e) {
|
||||
echo '
|
||||
new $.zui.Messager("FTP 错误:' . $e->getMessage() . '",{
|
||||
type: "primary", // 定义颜色主题
|
||||
time:4000
|
||||
}).show();
|
||||
';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
// | This script is free to use, don't abuse. |
|
||||
// +------------------------------------------------------------------------+
|
||||
|
||||
namespace Verot\Upload;
|
||||
namespace Verot\Upload;
|
||||
|
||||
if (!defined('IMG_WEBP')) define('IMG_WEBP', 32);
|
||||
|
||||
|
@ -1892,6 +1892,8 @@ class Upload {
|
|||
'bat',
|
||||
'phar',
|
||||
'wsdl',
|
||||
'html',
|
||||
'htm',
|
||||
);
|
||||
|
||||
$this->forbidden = array_merge($this->dangerous, array(
|
||||
|
@ -2118,7 +2120,7 @@ class Upload {
|
|||
*/
|
||||
function upload($file, $lang = 'en_GB') {
|
||||
|
||||
$this->version = '09/12/2022';
|
||||
$this->version = '07/12/2023';
|
||||
|
||||
$this->file_src_name = '';
|
||||
$this->file_src_name_body = '';
|
||||
|
@ -5239,5 +5241,3 @@ class Upload {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
437
app/del.php
|
@ -1,25 +1,24 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 删除文件页面
|
||||
* 删除/回收文件页面
|
||||
* @author Icret
|
||||
* 2023-3-15 11:01:52
|
||||
*/
|
||||
require_once __DIR__ . '/header.php';
|
||||
|
||||
require __DIR__ . '/function.php';
|
||||
|
||||
if (empty($_REQUEST)) {
|
||||
echo '
|
||||
<script>
|
||||
new $.zui.Messager("没有要删除的图片!", {
|
||||
type: "danger", // 定义颜色主题
|
||||
icon: "exclamation-sign" // 定义消息图标
|
||||
}).show();
|
||||
</script>
|
||||
';
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '无效请求',
|
||||
'type' => 'success',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'get',
|
||||
'url' => null
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
|
||||
$img = rand_imgurl() . '/public/images/404.png';
|
||||
if (isset($_GET['url'])) {
|
||||
$img = strip_tags($_GET['url']);
|
||||
}
|
||||
|
||||
// 解密删除
|
||||
if (isset($_GET['hash'])) {
|
||||
|
@ -28,111 +27,331 @@ if (isset($_GET['hash'])) {
|
|||
|
||||
if ($config['image_recycl']) {
|
||||
// 如果开启回收站则进入回收站
|
||||
if (checkImg($delHash, 3, 'recycle/') == true) {
|
||||
echo '
|
||||
<script>
|
||||
new $.zui.Messager("删除成功", {
|
||||
type: "success", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
</script>
|
||||
';
|
||||
if (checkImg($delHash, 3, 'recycle/') === true) {
|
||||
|
||||
any_upload($delHash, $delHash, 'delete'); // FTP删除
|
||||
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $delHash
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
} else {
|
||||
echo '
|
||||
<script>
|
||||
new $.zui.Messager("文件不存在!", {
|
||||
type: "danger", // 定义颜色主题
|
||||
icon: "exclamation-sign" // 定义消息图标
|
||||
}).show();
|
||||
</script>
|
||||
';
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '文件不存在',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $delHash
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
} else {
|
||||
// 否则直接删除
|
||||
getDel($delHash, 'url');
|
||||
getDel($delHash, 'url'); // 直接删除
|
||||
|
||||
any_upload($delHash, $delHash, 'delete'); // FTP删除
|
||||
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $delHash
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除失败',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $delHash
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
|
||||
// 非管理员不可访问
|
||||
if (!is_who_login('admin')) exit('Permission denied');
|
||||
|
||||
// 广场 - 批量删除文件
|
||||
if (isset($_POST['del_url_array'])) {
|
||||
$del_url_array = $_POST['del_url_array'];
|
||||
$del_num = count($del_url_array);
|
||||
for ($i = 0; $i < $del_num; $i++) {
|
||||
getDel($del_url_array[$i], 'url');
|
||||
// FTP删除
|
||||
any_upload($del_url_array[$i], $del_url_array[$i], 'delete');
|
||||
}
|
||||
}
|
||||
|
||||
// 检查登录后再处理url删除请求
|
||||
if (is_who_login('admin')) {
|
||||
|
||||
// 广场页面删除
|
||||
if (isset($_GET['url'])) {
|
||||
getDel($img, 'url');
|
||||
}
|
||||
|
||||
// 从管理页面删除
|
||||
if (isset($_GET['url_admin_inc'])) {
|
||||
$del_url = $_GET['url_admin_inc'];
|
||||
if ($config['hide_path']) {
|
||||
$del_url = $config['domain'] . $config['path'] . parse_url($del_url)['path'];
|
||||
}
|
||||
getDel($del_url, 'url');
|
||||
}
|
||||
// 回收
|
||||
if (isset($_GET['recycle_url'])) {
|
||||
$recycle_url = $_GET['recycle_url'];
|
||||
$recycle_url = parse_url($recycle_url)['path'];
|
||||
if (file_exists(APP_ROOT . $recycle_url)) {
|
||||
checkImg($recycle_url, 3);
|
||||
echo '
|
||||
<script>
|
||||
new $.zui.Messager("已放入回收站!", {
|
||||
type: "success", // 定义颜色主题
|
||||
icon: "ok" // 定义消息图标
|
||||
}).show();
|
||||
</script>
|
||||
';
|
||||
} else {
|
||||
echo '
|
||||
<script>
|
||||
new $.zui.Messager("文件不存在!", {
|
||||
type: "danger", // 定义颜色主题
|
||||
icon: "exclamation-sign" // 定义消息图标
|
||||
}).show();
|
||||
</script>
|
||||
';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isset($_GET['url'])) {
|
||||
echo '
|
||||
<script>
|
||||
new $.zui.Messager("请使用管理员账号登录再删除!", {
|
||||
type: "danger", // 定义颜色主题
|
||||
icon: "exclamation-sign" // 定义消息图标
|
||||
}).show();
|
||||
// 延时2s跳转
|
||||
window.setTimeout("window.location=\'/../admin/index.php \'",3000);
|
||||
</script>
|
||||
';
|
||||
// 广场 - 批量回收文件
|
||||
if (isset($_POST['recycle_url_array'])) {
|
||||
$recycle_url_array = $_POST['recycle_url_array'];
|
||||
$del_num = count($recycle_url_array);
|
||||
for ($i = 0; $i < $del_num; $i++) {
|
||||
checkImg($recycle_url_array[$i], 3);
|
||||
}
|
||||
}
|
||||
?>
|
||||
<div class="col-md-4 col-md-offset-4">
|
||||
<a href="<?php echo $img; ?>" target="_blank"><img src="<?php echo $img; ?>" alt="简单图床-EasyImage" class="img-thumbnail"></a>
|
||||
<form class="form-inline" method="get" action="<?php $_SERVER['SCRIPT_NAME']; ?>" id="form" name="delForm" onSubmit="getStr();">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputInviteCode3">删除图片-格式:</label>
|
||||
<input type="text" class="form-control" id="exampleInputInviteCode3" name="url" placeholder="https://i1.100024.xyz/i/2021/05/04/10fn9ei.jpg">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-danger">删除</button>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
// 修改网页标题
|
||||
document.title = "删除图片 - <?php echo $config['title']; ?>";
|
||||
|
||||
var oBtn = document.getElementById('del');
|
||||
var oTi = document.getElementById('title');
|
||||
if ('oninput' in oBtn) {
|
||||
oBtn.addEventListener("input", getWord, false);
|
||||
if (isset($_POST['url'])) $postURL = strip_tags($_POST['url']);
|
||||
|
||||
// 广场|日志 - 单文件删除
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'delete') {
|
||||
$reslut = easyimage_delete($postURL, 'url');
|
||||
// FTP删除
|
||||
any_upload($postURL, $postURL, 'delete');
|
||||
|
||||
if ($reslut) {
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
} else {
|
||||
oBtn.onpropertychange = getWord;
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除失败',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
|
||||
// 广场|日志 - 回收文件
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'recycle') {
|
||||
if (is_file(APP_ROOT . $postURL)) {
|
||||
checkImg($postURL, 3);
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '回收成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'recycle',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
} else {
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '回收失败',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
|
||||
// 管理页面 - 删除版本信息文件
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'del_version_file') {
|
||||
try {
|
||||
@unlink(APP_ROOT . $postURL);
|
||||
$re = json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
throw new Exception('更新版本号失败');
|
||||
} catch (Exception $e) {
|
||||
$re = json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => $e->getMessage(),
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} finally {
|
||||
exit($re);
|
||||
}
|
||||
}
|
||||
|
||||
// 管理页面 - 回收站恢复文件
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'recycle_reimg') {
|
||||
try {
|
||||
if (re_checkImg($postURL, 'recycle/') === true) {
|
||||
$re = json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '恢复成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} else {
|
||||
throw new Exception('恢复失败');
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$re = json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => $e->getMessage(),
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} finally {
|
||||
exit($re);
|
||||
}
|
||||
}
|
||||
|
||||
// 管理页面 - 监黄恢复文件
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'suspic_reimg') {
|
||||
try {
|
||||
if (re_checkImg($postURL, 'suspic/') === true) {
|
||||
$re = json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '恢复成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} else {
|
||||
throw new Exception('恢复失败');
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$re = json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => $e->getMessage(),
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} finally {
|
||||
exit($re);
|
||||
}
|
||||
}
|
||||
|
||||
// 管理页面 - 删除非空目录
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'delDir') {
|
||||
try {
|
||||
$delDir = APP_ROOT . $config['path'] . $postURL; // 限制删除目录
|
||||
if (deldir($delDir)) {
|
||||
$re = json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除文件夹成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} else {
|
||||
throw new Exception('删除文件夹失败');
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$re = json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => $e->getMessage(),
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $postURL
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} finally {
|
||||
exit($re);
|
||||
}
|
||||
}
|
||||
|
||||
// 管理页面 - 删除指定日期文件夹
|
||||
if (isset($_POST['dateDir'])) {
|
||||
$delDir = APP_ROOT . $config['path'] . $_POST['dateDir'];
|
||||
if (deldir($delDir)) {
|
||||
echo json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delDir',
|
||||
'url' => $delDir
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
} else {
|
||||
exit(json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => '删除失败',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delDir',
|
||||
'url' => $delDir
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
|
||||
// 管理页面 - 删除指定文件
|
||||
if (isset($_POST['url_admin_inc'])) {
|
||||
|
||||
$del_url = $_POST['url_admin_inc'];
|
||||
if ($config['hide_path']) {
|
||||
$del_url = $config['domain'] . $config['path'] . parse_url($del_url)['path'];
|
||||
}
|
||||
|
||||
function getWord() {
|
||||
oTi.innerHTML = '<img src="' + oBtn.value + '" width="200" class="img-rounded" /><br />';
|
||||
if (easyimage_delete($del_url, 'url') === TRUE) {
|
||||
exit(json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $del_url
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
</script>
|
||||
<?php require_once __DIR__ . '/footer.php';
|
||||
|
||||
exit(json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => '删除失败',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
'url' => $del_url
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
|
||||
// 管理页面 - 重置OPcache缓存
|
||||
if (isset($_POST['mode']) && $_POST['mode'] === 'OPcache') {
|
||||
|
||||
if (!function_exists('opcache_reset')) {
|
||||
exit(json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => '未开启OPcache',
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
), JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
|
||||
try {
|
||||
if (opcache_reset() === true) {
|
||||
$re = json_encode(array(
|
||||
'code' => 200,
|
||||
'msg' => '重置缓存成功',
|
||||
'type' => 'success',
|
||||
'icon' => 'ok-sign',
|
||||
'mode' => 'delete',
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} else {
|
||||
throw new Exception('重置缓存失败');
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$re = json_encode(array(
|
||||
'code' => 404,
|
||||
'msg' => $e->getMessage(),
|
||||
'type' => 'danger',
|
||||
'icon' => 'exclamation-sign',
|
||||
'mode' => 'delete',
|
||||
), JSON_UNESCAPED_UNICODE);
|
||||
} finally {
|
||||
exit($re);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
/** 禁止直接访问 */
|
||||
defined('APP_ROOT') ?: exit;
|
||||
|
||||
/** 弹窗公告 */
|
||||
if ($config['notice_status'] > 0) : ?>
|
||||
<div class="modal fade" id="notice">
|
||||
|
@ -19,7 +18,7 @@ if ($config['notice_status'] > 0) : ?>
|
|||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-mini btn-primary" data-dismiss="modal">了解</button>
|
||||
<button type="button" class="btn btn-mini btn-primary" data-dismiss="modal">知道了</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -47,9 +46,9 @@ if ($config['notice_status'] > 0) : ?>
|
|||
<?php /** 页脚自定义代码 */ echo $config['footer']; ?>
|
||||
<p>
|
||||
<!-- 页脚信息 -->
|
||||
<a href="https://github.com/icret/EasyImages2.0" target="_blank" rel="nofollow" data-toggle="tooltip" title="Github">© Since 2018</a>
|
||||
<a href="https://png.cm/" target="_blank" data-toggle="tooltip" title="EasyImage2.0 简单图床">EasyImage</a>
|
||||
<a href="/admin/terms.php" target="_blank" data-toggle="tooltip" title="使用协议">DMCA</a>
|
||||
<a href="https://github.com/icret/EasyImages2.0" target="_blank" rel="nofollow" data-toggle="tooltip" title="Github Releases">© Since 2018</a>
|
||||
<a href="https://png.cm/" target="_blank" data-toggle="tooltip" title="简单图床官网">EasyImage</a>
|
||||
<a href="/app/DMCA.php" target="_blank" data-toggle="tooltip" title="使用协议">DMCA</a>
|
||||
<!-- 二维码按钮 -->
|
||||
<a data-toggle="modal" href="#qr"><i class="icon icon-qrcode hidden-xs inline-block" data-toggle="tooltip" title="二维码"></i></a>
|
||||
<?php /** 暗黑模式 */ if ($config['dark-mode']) : ?>
|
||||
|
@ -62,18 +61,20 @@ if ($config['notice_status'] > 0) : ?>
|
|||
<?php endif; ?>
|
||||
</p>
|
||||
</footer>
|
||||
<link href="<?php static_cdn(); ?>/public/static/nprogress/nprogress.min.css" rel="stylesheet">
|
||||
<script src="<?php static_cdn(); ?>/public/static/nprogress/nprogress.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/qrcode/qrcode.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/qrcode/qrcode.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/nprogress/nprogress.min.js"></script>
|
||||
<script>
|
||||
// NProgress
|
||||
NProgress.configure({
|
||||
barColor: '<?php echo $config['NProgress_default']; ?>'
|
||||
});
|
||||
NProgress.start();
|
||||
NProgress.done();
|
||||
|
||||
// 导航状态
|
||||
$('.nav-pills').find('a').each(function() {
|
||||
// console.log(document.location);
|
||||
if (this.pathname == document.location.pathname) {
|
||||
if (this.pathname === location.pathname) {
|
||||
$(this).parent().addClass('active');
|
||||
}
|
||||
});
|
||||
|
|
294
app/function.php
|
@ -1,60 +1,8 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @author icret
|
||||
* @link https://png.cm
|
||||
* @email lemonim@qq.com
|
||||
* @project EasyImage2.0 - 简单图床
|
||||
* @Github https://github.com/icret/easyImages2.0
|
||||
* QQ Group 954441002
|
||||
* @Last 2023-03-09 17:38:57
|
||||
|
||||
* 上传服务器后第一次打开会检查运行环境,请根据提示操作;
|
||||
* 检查环境仅会在第一开始开始出现,并在config目录下生成EasyImage.lock文件,如需再次查看请删除此文件。
|
||||
|
||||
* 敬请注意:本程序为开源程序,你可以使用本程序在任何非商业项目或者网站中。但请你务必保留代码中相关信息(页面logo和页面上必要的链接可以更改)
|
||||
* 本人仅为程序开源创作,如非法网站与本人无关,请勿用于非法用途
|
||||
* 请为本人网站 (https://png.cm) 加上网址链接,谢谢支持。作为开发者你可以对相应的后台功能进行扩展(增删改相应代码),但请保留代码中相关来源信息(例如:本人博客,邮箱等)
|
||||
* 如果因安装问题或其他问题可以给我发邮件。
|
||||
*/
|
||||
|
||||
/*---------------基础配置开始-------------------*/
|
||||
|
||||
// 设置html为utf8
|
||||
header('Content-Type:text/html;charset=utf-8');
|
||||
//将时区设置为中国·上海
|
||||
ini_set('date.timezone', 'Asia/Shanghai');
|
||||
date_default_timezone_set('Asia/Shanghai');
|
||||
// 修改内存限制 根据服务器配置选择,低于128M容易出现上传失败,你懂得图片挺占用内存的
|
||||
ini_set('memory_limit', '512M');
|
||||
// 定义根目录
|
||||
define('APP_ROOT', str_replace('\\', '/', realpath(dirname(__FILE__) . '/../')));
|
||||
// 判断当前的系统类型是否为windows
|
||||
define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0);
|
||||
// 定义当前版本
|
||||
define('APP_VERSION', '2.8.3');
|
||||
|
||||
/*---------------基础配置结束-------------------*/
|
||||
|
||||
require_once APP_ROOT . '/config/config.php';
|
||||
require_once APP_ROOT . '/config/config.guest.php';
|
||||
require_once __DIR__ . '/base.php';
|
||||
require_once __DIR__ . '/WaterMask.php';
|
||||
require_once APP_ROOT . '/config/config.guest.php';
|
||||
|
||||
/**
|
||||
* 开启DEBUG
|
||||
* 2023-03-09
|
||||
*/
|
||||
function easyimage_debug()
|
||||
{
|
||||
global $config;
|
||||
if ($config['checkEnv']) {
|
||||
|
||||
if (!ini_get('display_errors')) {
|
||||
ini_set('display_errors', 'On');
|
||||
}
|
||||
error_reporting(E_ALL);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 判断GIF图片是否为动态
|
||||
* @param $filename string 文件
|
||||
|
@ -154,7 +102,7 @@ function _login($user = null, $password = null)
|
|||
if ($browser_cookie[0] === $config['user'] && $browser_cookie[1] === $config['password']) return json_encode(array('code' => 200, 'level' => 1, 'messege' => '尊敬的管理员'));
|
||||
// 判断是否上传者
|
||||
if (array_key_exists($browser_cookie[0], $guestConfig) && $browser_cookie[1] === $guestConfig[$browser_cookie[0]]['password']) {
|
||||
// 判断上车者是否过期
|
||||
// 判断上传者是否过期
|
||||
if ($guestConfig[$browser_cookie[0]]['expired'] < time()) {
|
||||
// 上传者账户密码正确,但是账户过期
|
||||
return json_encode(array('code' => 400, 'level' => 0, 'messege' => $browser_cookie[0] . '账号已过期'));
|
||||
|
@ -682,6 +630,39 @@ function getDel($url, $type)
|
|||
clearstatcache();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除指定文件
|
||||
* @param $url string 文件
|
||||
* @param $type string 模式
|
||||
*/
|
||||
function easyimage_delete($url, $type)
|
||||
{
|
||||
global $config;
|
||||
// url本地化
|
||||
$url = htmlspecialchars(str_replace($config['domain'], '', $url)); // 过滤html 获取url path
|
||||
$url = urldecode(trim($url));
|
||||
|
||||
if ($type == 'url') {
|
||||
$url = $_SERVER['DOCUMENT_ROOT'] . $url;
|
||||
}
|
||||
if ($type == 'hash') {
|
||||
$url = APP_ROOT . $url;
|
||||
}
|
||||
|
||||
// 文件是否存在 限制删除目录
|
||||
if (is_file($url) && strrpos($url, $config['path'])) {
|
||||
// 执行删除
|
||||
if (@unlink($url)) {
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
// 清除查询
|
||||
clearstatcache();
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否此用户登录
|
||||
* @param string $user 判断登录者权限 当$user=null 时检查是否登录, 不区分身份
|
||||
|
@ -778,7 +759,7 @@ function getVersion($name = 'tag_name')
|
|||
global $config;
|
||||
|
||||
if ($config['checkEnv']) {
|
||||
require_once APP_ROOT . '/app/class.version.php';
|
||||
require_once __DIR__ . '/class.version.php';
|
||||
$url = "https://api.github.com/repositories/188228357/releases/latest"; // 获取版本地址
|
||||
$getVersion = new getVersion($url);
|
||||
try {
|
||||
|
@ -898,7 +879,7 @@ function checkImg($imageUrl, $type = 1, $dir = 'suspic/')
|
|||
global $config;
|
||||
|
||||
/** # 使用moderatecontent */
|
||||
if ($type == 1) {
|
||||
if ($type === 1) {
|
||||
$response = moderatecontent_json($imageUrl);
|
||||
if ($response['rating_index'] == 3 or $response['predictions']['adult'] > $config['checkImg_value']) { // (1 = everyone, 2 = teen, 3 = adult)
|
||||
$bad_pic = true;
|
||||
|
@ -906,7 +887,7 @@ function checkImg($imageUrl, $type = 1, $dir = 'suspic/')
|
|||
}
|
||||
|
||||
/** # 使用nsfwjs */
|
||||
if ($type == 2) {
|
||||
if ($type === 2) {
|
||||
/**
|
||||
* probability,概率
|
||||
* className,类型
|
||||
|
@ -956,13 +937,13 @@ function checkImg($imageUrl, $type = 1, $dir = 'suspic/')
|
|||
}
|
||||
|
||||
// 移入回收站
|
||||
if ($type == 3) {
|
||||
if ($type === 3) {
|
||||
$bad_pic = true;
|
||||
$dir = 'recycle/';
|
||||
}
|
||||
|
||||
/** # 如果违规则移动图片到违规文件夹 */
|
||||
if ($bad_pic == true) {
|
||||
if ($bad_pic === true) {
|
||||
$old_path = APP_ROOT . parse_url($imageUrl)['path']; // 提交网址中的文件路径 /i/2021/10/29/p8vypd.png
|
||||
$name = parse_url($imageUrl)['path']; // 获得图片的相对地址
|
||||
$name = str_replace($config['path'], '', $name); // 去除 path目录
|
||||
|
@ -975,6 +956,12 @@ function checkImg($imageUrl, $type = 1, $dir = 'suspic/')
|
|||
}
|
||||
if (is_file($old_path)) {
|
||||
rename($old_path, $new_path);
|
||||
|
||||
// FTP
|
||||
if ($config['ftp_status'] === 1) {
|
||||
any_upload(parse_url($imageUrl)['path'], $config['path'] . $dir . $name, 'rename');
|
||||
}
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
@ -995,6 +982,10 @@ function re_checkImg($name, $dir = 'suspic/')
|
|||
if (is_file($now_path_file)) {
|
||||
$to_file = APP_ROOT . $config['path'] . $fileToPath; // 要还原图片的绝对位置 */i/2021/10/30/p8vypd.png
|
||||
rename($now_path_file, $to_file); // 移动文件
|
||||
// FTP
|
||||
if ($config['ftp_status'] === 1) {
|
||||
any_upload($config['path'] . $dir . $name, $config['path'] . $fileToPath, 'rename');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -1389,7 +1380,6 @@ function check_api($token)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据URL判断是否本地局域网访问(PHP代码函数)
|
||||
* https://blog.csdn.net/monxinmonxin0/article/details/44854383
|
||||
|
@ -1398,9 +1388,8 @@ function check_api($token)
|
|||
*/
|
||||
function is_local($url)
|
||||
{
|
||||
if (stristr($url, 'localhost') || stristr($url, '127.') || stristr($url, '192.')) {
|
||||
return true;
|
||||
}
|
||||
if (stristr($url, '://localhost') || stristr($url, '://127.') || stristr($url, '://192.') || stristr($url, '://10.')) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1422,7 +1411,6 @@ function rand_imgurl($text = null)
|
|||
* @param String $file 文件相对路径
|
||||
* @return String 内容信息
|
||||
*/
|
||||
|
||||
function get_current_version($file = '/admin/version.php')
|
||||
{
|
||||
$file = APP_ROOT . $file;
|
||||
|
@ -1463,8 +1451,13 @@ function water($source)
|
|||
{
|
||||
global $config;
|
||||
|
||||
// 判断是否图片格式
|
||||
|
||||
|
||||
|
||||
|
||||
// 文字水印
|
||||
if ($config['watermark'] == 1) {
|
||||
if ($config['watermark'] === 1) {
|
||||
// 过滤gif
|
||||
if (!is_Gif_Webp_Animated($source)) {
|
||||
$arr = [
|
||||
|
@ -1483,7 +1476,7 @@ function water($source)
|
|||
}
|
||||
|
||||
// 图片水印
|
||||
if ($config['watermark'] == 2) {
|
||||
if ($config['watermark'] === 2) {
|
||||
// 过滤gif
|
||||
if (!is_Gif_Webp_Animated($source)) {
|
||||
$arr = [
|
||||
|
@ -1598,21 +1591,19 @@ function write_upload_logs($filePath, $sourceName, $absolutePath, $fileSize, $fr
|
|||
*/
|
||||
function ip2region($IP)
|
||||
{
|
||||
$db = __DIR__ . '/ip2region/ip2region.xdb';
|
||||
|
||||
if (!is_file($db)) {
|
||||
return '<a href="https://raw.githubusercontent.com/lionsoul2014/ip2region/master/data/ip2region.xdb" target="_blank"><span class="label label-primary" data-toggle="tooltip" title="点击下载 IP数据库 并上传到<br/><code>/app/ip2region/</code>">IP数据库不存在</span></a>';
|
||||
}
|
||||
if (!is_file(__DIR__ . '/ip2region/ip2region.xdb')) return '<a href="https://raw.githubusercontent.com/lionsoul2014/ip2region/master/data/ip2region.xdb" target="_blank"><span class="label label-primary" data-toggle="tooltip" title="点击下载 IP数据库 并上传到<br/><code>/app/ip2region/</code>">IP数据库不存在</span></a>';
|
||||
|
||||
try {
|
||||
require_once __DIR__ . '/ip2region/Ip2Region.php';
|
||||
$ip2region = new Ip2Region();
|
||||
$location = $ip2region->memorySearch($IP);
|
||||
$location = $location['region'];
|
||||
/* 显示完整信息
|
||||
$location = $ip2region->memorySearch($IP);
|
||||
$location = $location['region'];
|
||||
$location = str_replace(array('0', '||'), '', $location);
|
||||
return $location;
|
||||
*/
|
||||
return $ip2region->simple($IP); // 显示简易信息
|
||||
} catch (Exception $e) {
|
||||
return '查询失败: ' . $e->getMessage();
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1675,7 +1666,7 @@ function auto_delete()
|
|||
global $config;
|
||||
if ($config['auto_delete'] && $config['storage_path'] == 'Y/m/d/') {
|
||||
|
||||
/** 重命名要删除的文件夹 */
|
||||
/** 重命名要删除的文件夹 */
|
||||
$Odir = APP_ROOT . $config['path'] . date('Y/m/d', strtotime(-$config['auto_delete'] . 'day')); // 重命名文件夹路径
|
||||
$Rdir = APP_ROOT . $config['path'] . date('Y/m/d', strtotime(-$config['auto_delete'] . 'day')) . '_auto_delete'; // 新命名文件夹路径
|
||||
if (is_dir($Odir)) { // 执行重命名
|
||||
|
@ -1716,12 +1707,11 @@ function auto_delete()
|
|||
}
|
||||
|
||||
/**
|
||||
* 记录登录日志
|
||||
* @param String $user 登录用户
|
||||
* @param String $pass 登录密码
|
||||
* @param String $msg 登录提示
|
||||
* 登录日志
|
||||
* @param String $user 用户
|
||||
* @param String $pass 密码
|
||||
* @param String $msg 提示
|
||||
*/
|
||||
|
||||
function write_login_log($user, $pass, $msg)
|
||||
{
|
||||
$log_path = APP_ROOT . '/admin/logs/login/';
|
||||
|
@ -1732,53 +1722,32 @@ function write_login_log($user, $pass, $msg)
|
|||
if (!is_file($log_file)) file_put_contents($log_file, '<?php /** 登录日志 */ exit; ?>' . PHP_EOL, FILE_APPEND | LOCK_EX);
|
||||
|
||||
/** 写入日志 */
|
||||
$log = htmlentities('时间: ' . date('Y-m-d H:i:s') . ' IP: ' . real_ip() . ' 账号: ' . $user . ' 密码: ' . $pass . ' 消息: ' . $msg);
|
||||
$log = htmlentities(date('Y-m-d H:i:s') . ' IP: ' . real_ip() . ' 账号: ' . $user . ' 密码: ' . $pass . ' 提示: ' . $msg);
|
||||
file_put_contents($log_file, $log . PHP_EOL, FILE_APPEND | LOCK_EX);
|
||||
}
|
||||
|
||||
/**
|
||||
* 其他上传
|
||||
* 支持: FTP
|
||||
* @param String $remoteFile 远程地址
|
||||
* @param String $localFile 本地地址
|
||||
* @param String $way 使用方式 upload 上传 | delete 删除
|
||||
* curl检查远程链接是否有效
|
||||
* @param String $url
|
||||
* @param return boll
|
||||
*/
|
||||
|
||||
function FTP_upload($remoteFile = null, $localFile = null, $way = 'upload')
|
||||
function validUrl($url)
|
||||
{
|
||||
global $config;
|
||||
$ch = curl_init();
|
||||
$timeout = 10;
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_HEADER, 1); //将文件的信息作为数据流输出
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将获取的信息以字符串返回
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //设置等待时间
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //禁止验证对等证书
|
||||
$contents = curl_exec($ch);
|
||||
|
||||
if (!$config['ftp_status']) exit;
|
||||
|
||||
require_once __DIR__ . '/FtpClient/FtpClient.php';
|
||||
require_once __DIR__ . '/FtpClient/FtpException.php';
|
||||
require_once __DIR__ . '/FtpClient/FtpWrapper.php';
|
||||
|
||||
$ftp = new FtpClient();
|
||||
// FTP 基本信息
|
||||
$ftp->connect($config['ftp_host'], $config['ftp_ssl'], $config['ftp_port'], $config['ftp_time']);
|
||||
// FTP账号密码
|
||||
$ftp->login($config['ftp_user'], $config['ftp_pass']);
|
||||
// FTP主动|被动
|
||||
$ftp->pasv($config['ftp_pasv']);
|
||||
|
||||
switch ($way) {
|
||||
case 'upload':
|
||||
// 创建文件夹
|
||||
$ftp->mkdir(pathinfo($remoteFile, PATHINFO_DIRNAME), 0755, true);
|
||||
// 上传文件 远端->本地
|
||||
$ftp->put($remoteFile, $localFile);
|
||||
break;
|
||||
case 'delete':
|
||||
$ftp->delete($remoteFile);
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
$ftp->close();
|
||||
// 上传完毕是否删除本地文件
|
||||
if ($config['ftped_del_local']) {
|
||||
@unlink($localFile);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //获取请求状态码
|
||||
curl_close($ch);
|
||||
if ($http_code != '200') {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1789,48 +1758,111 @@ function FTP_upload($remoteFile = null, $localFile = null, $way = 'upload')
|
|||
* @param String $localFile 本地地址
|
||||
* @param String $way 使用方式 upload 上传 | delete 删除
|
||||
*/
|
||||
|
||||
function any_upload($remoteFile = null, $localFile = null, $way = 'upload')
|
||||
{
|
||||
global $config;
|
||||
|
||||
if (!$config['ftp_status']) exit;
|
||||
if (!$config['ftp_status']) return null;
|
||||
require_once __DIR__ . '/Ftp.php';
|
||||
|
||||
// 登录FTP
|
||||
try {
|
||||
$ftp = new Ftp;
|
||||
$ftp->connect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
|
||||
if ($config['ftp_ssl'] === 1) {
|
||||
$ftp->sslConnect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
} else {
|
||||
$ftp->connect($config['ftp_host'], $config['ftp_port'], $config['ftp_time']);
|
||||
}
|
||||
|
||||
$ftp->login($config['ftp_user'], $config['ftp_pass']);
|
||||
$ftp->pasv($config['ftp_pasv']);
|
||||
} catch (FtpException $e) {
|
||||
echo 'Error: ', $e->getMessage();
|
||||
}
|
||||
|
||||
// 获取文件相对目录
|
||||
$dir = pathinfo($remoteFile, PATHINFO_DIRNAME);
|
||||
// 隐藏上传目录
|
||||
if ($config['hide_path']) {
|
||||
$dir = str_replace($config['path'], '', $dir);
|
||||
$remoteFile = str_replace($config['path'], '', $remoteFile);
|
||||
}
|
||||
|
||||
switch ($way) {
|
||||
case 'upload':
|
||||
try {
|
||||
// 创建文件夹
|
||||
$dir = pathinfo($remoteFile, PATHINFO_DIRNAME);
|
||||
// 递归创建目录
|
||||
if (!$ftp->isDir($dir)) {
|
||||
$ftp->mkDir($dir);
|
||||
$ftp->mkDirRecursive($dir);
|
||||
}
|
||||
|
||||
// 上传文件 远端->本地
|
||||
$ftp->put($remoteFile, $localFile);
|
||||
// 上传文件 远端->本地 模式: $config['ftp_mode']
|
||||
$ftp->put($remoteFile, $localFile, 2);
|
||||
} catch (FtpException $e) {
|
||||
echo 'Error: ', $e->getMessage();
|
||||
}
|
||||
break;
|
||||
case 'delete':
|
||||
if ($config['ftp_delloc_sync'] === 0) return true;
|
||||
$ftp->tryDelete($remoteFile);
|
||||
break;
|
||||
case 'list':
|
||||
return $ftp->nList($remoteFile);
|
||||
break;
|
||||
case 'rename':
|
||||
try {
|
||||
// 获取文件相对目录
|
||||
$dir = pathinfo($localFile, PATHINFO_DIRNAME);
|
||||
// 隐藏上传目录
|
||||
if ($config['hide_path']) {
|
||||
$dir = str_replace($config['path'], '', $dir);
|
||||
$localFile = str_replace($config['path'], '', $localFile);
|
||||
}
|
||||
// 递归创建目录
|
||||
if (!$ftp->isDir($dir)) {
|
||||
$ftp->mkDirRecursive($dir);
|
||||
}
|
||||
// 此处 $remoteFile为源文件名及路径 $localFile为新文件名及路径
|
||||
$ftp->rename($remoteFile, $localFile);
|
||||
} catch (FtpException $e) {
|
||||
echo 'Error: ', $e->getMessage();
|
||||
}
|
||||
break;
|
||||
}
|
||||
// 关闭FTP
|
||||
$ftp->close();
|
||||
|
||||
// FTP上传后是否删除本地文件
|
||||
if ($config['ftp_del_local']) {
|
||||
if ($config['ftp_complete_del_local']) {
|
||||
@unlink($localFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 分片上传
|
||||
* @param $target_name 名称
|
||||
* @return Sting $target_name
|
||||
*/
|
||||
function chunk($target_name)
|
||||
{
|
||||
global $config;
|
||||
// 分片缓存目录
|
||||
$temp_dir = APP_ROOT . $config['path'] . 'cache/' . $target_name . '/';
|
||||
// 分片合并后的文件
|
||||
$target_file = APP_ROOT . $config['path'] . 'cache/' . $target_name;
|
||||
// 储存分片
|
||||
if (!is_dir($temp_dir)) mkdir($temp_dir, 0755, true);
|
||||
// 移动缓存分片
|
||||
move_uploaded_file($_FILES['file']['tmp_name'], $temp_dir . $_REQUEST['chunk']);
|
||||
// 合并分片
|
||||
if ($_REQUEST['chunk'] == $_REQUEST['chunks'] - 1) { // 最后一个分片
|
||||
if (!is_dir($target_file)) mkdir($target_file, 0755, true);
|
||||
$handle = fopen($target_name, 'x+');
|
||||
for ($i = 0; $i < $_REQUEST['chunks']; $i++) {
|
||||
fwrite($handle, file_get_contents($temp_dir . $i));
|
||||
}
|
||||
fclose($handle);
|
||||
deldir($temp_dir); // 删除临时目录
|
||||
}
|
||||
return $target_name;
|
||||
}
|
||||
|
|
|
@ -12,15 +12,16 @@
|
|||
<title><?php echo $config['title']; ?></title>
|
||||
<meta name="keywords" content="<?php echo $config['keywords']; ?>" />
|
||||
<meta name="description" content="<?php echo $config['description']; ?>" />
|
||||
<link rel="shortcut icon" href="<?php static_cdn(); ?>/favicon.ico" type="image/x-icon" />
|
||||
<link href="<?php static_cdn(); ?>/public/static/zui/css/zui.min.css" rel="stylesheet">
|
||||
<link href="<?php static_cdn(); ?>/public/static/zui/theme/zui-theme-<?php echo $config['theme']; ?>.css" rel="stylesheet">
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/js/zui.min.js"></script>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="<?php static_cdn(); ?>/favicon.ico" />
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/css/zui.min.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/nprogress/nprogress.min.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/theme/zui-theme-<?php echo $config['theme']; ?>.css">
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.6.4.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/js/zui.min.js"></script>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/ieonly/html5shiv.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/ieonly/respond.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/ieonly/excanvas.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/ieonly/html5shiv.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/ieonly/respond.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/ieonly/excanvas.js"></script>
|
||||
<![endif]-->
|
||||
<?php /** 页头自定义代码 */ echo $config['customize']; ?>
|
||||
</head>
|
||||
|
@ -34,7 +35,7 @@
|
|||
</div>
|
||||
<div class="collapse navbar-collapse navbar-collapse-EasyImage">
|
||||
<ul class="nav nav-pills">
|
||||
<li><a href="<?php echo $config['domain']; ?>/index.php"><i class="icon icon-home"></i> 首页</a></li>
|
||||
<li><a href="<?php echo $config['domain']; ?>"><i class="icon icon-home"></i> 首页</a></li>
|
||||
<?php /** 非管理或未开启不显示广场 */ if ($config['showSwitch'] || is_who_login('admin')) : ?>
|
||||
<li><a href="<?php echo $config['domain']; ?>/app/list.php"><i class="icon icon-th"></i> 广场<span class="label label-badge label-primary"><?php echo get_file_by_glob(APP_ROOT . config_path(), 'number'); ?></span></a></li>
|
||||
<?php endif; ?>
|
||||
|
|
|
@ -14,7 +14,7 @@ include_once __DIR__ . "/header.php";
|
|||
</div>
|
||||
<div class="col-md-12 history_clear">
|
||||
</div>
|
||||
<script src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/lazyload/lazyload.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/viewjs/viewer.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/clipboard/clipboard.min.js"></script>
|
||||
|
|
169
app/info.php
|
@ -7,20 +7,16 @@ if (!$config['show_exif_info'] && !is_who_login('admin')) exit(header('Location:
|
|||
if (isset($_GET['img'])) {
|
||||
// 过滤特殊符号
|
||||
$getIMG = strip_tags($_GET['img']);
|
||||
$del_url = $config['domain'] . $getIMG;
|
||||
} elseif (isset($_GET['history'])) {
|
||||
// 过滤特殊符号
|
||||
|
||||
if ($config['hide_path']) {
|
||||
$getIMG = $config['path'] . ltrim(strip_tags($_GET['history']), '/');
|
||||
} else {
|
||||
$getIMG = strip_tags($_GET['history']);
|
||||
}
|
||||
$del_url = $config['domain'] . $getIMG;
|
||||
} else {
|
||||
// 未获取到图片地址
|
||||
$getIMG = "/public/images/404.png";
|
||||
$del_url = "#";
|
||||
}
|
||||
|
||||
|
||||
|
@ -63,11 +59,11 @@ $upTime = filemtime($imgABPath);
|
|||
// 广告
|
||||
if ($config['ad_top']) echo $config['ad_top_info'];
|
||||
?>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-5" style="text-align: center;">
|
||||
<img data-toggle="lightbox" src="<?php echo $img_url; ?>" id="img1" class="img-rounded" height="432px" data-caption="<?php echo pathinfo($img_url, PATHINFO_FILENAME); ?>的详细信息" alt="<?php echo $img_url; ?>" />
|
||||
<div class="col-md-12" style="margin-bottom:10px;">
|
||||
<div class="col-md-6">
|
||||
<img src="<?php echo $img_url; ?>" class="img-rounded" height="436px" width="540px" data-toggle="lightbox" id="img1" data-caption="<?php echo pathinfo($img_url, PATHINFO_FILENAME); ?>的详细信息" alt="<?php echo $img_url; ?>" />
|
||||
</div>
|
||||
<div class="col-md-6 table-responsive table-condensed" style="margin-top: 10px;">
|
||||
<div class="col-md-6 table-responsive table-condensed">
|
||||
<table class="table table-hover table-striped table-bordered text-nowrap">
|
||||
<tbody>
|
||||
<tr>
|
||||
|
@ -86,6 +82,10 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
<td>图片宽高</td>
|
||||
<td><span id="wh"></span>px</td>
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<td>使用设备</td>
|
||||
<td id="makeAndModel"></td>
|
||||
</tr> -->
|
||||
<tr>
|
||||
<td>上传时间</td>
|
||||
<td><?php echo $logs[$logsName]['date']; ?></td>
|
||||
|
@ -128,19 +128,23 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
<td>文件操作</td>
|
||||
<td>
|
||||
<a class="btn btn-mini btn-primary" href="<?php echo $img_url; ?>" target="_blank"><i class="icon icon-picture"> 查看</i></a>
|
||||
<!-- <a class="btn btn-mini btn-primary" data-toggle="collapse" data-target="#collapseExample"><i class="icon icon-caret-down"> Exif</i></a> -->
|
||||
<a class="btn btn-mini btn-primary" href="" onclick="window.location.replace;"><i class="icon icon-spin icon-refresh"></i> 刷新</a>
|
||||
<a class="btn btn-mini btn-primary" href="/app/down.php?dw=<?php echo $getIMG; ?>" target="_blank"><i class="icon icon-cloud-download"> 下载</i></a>
|
||||
<?php if (!empty($config['report']) && !is_who_login('admin')) : ?>
|
||||
<a class="btn btn-mini btn-warning" href="<?php echo $config['report'] . '?Website1=' . $img_url; ?>" target="_blank"><i class="icon icon-question-sign"> 举报</i></a>
|
||||
<?php endif; ?>
|
||||
<?php if (is_who_login('admin')) : ?>
|
||||
<a class="btn btn-mini btn-warning" href="/app/del.php?recycle_url=<?php echo $getIMG; ?>" target="_blank"><i class="icon icon-undo"> 回收</i></a>
|
||||
<a class="btn btn-mini btn-warning" href="/app/del.php?url=<?php echo $del_url; ?>" target="_blank"><i class="icon icon-trash"> 删除</i></a>
|
||||
<a class="btn btn-mini btn-warning" href="#" onclick="ajax_post('<?php echo $getIMG; ?>','recycle')"><i class="icon icon-undo"> 回收</i></a>
|
||||
<a class="btn btn-mini btn-warning" href="#" onclick="ajax_post('<?php echo $getIMG; ?>')"><i class="icon icon-trash"> 删除</i></a>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="collapse" id="collapseExample">
|
||||
<pre style="background-color: rgba(0, 0, 0, 0);" id="allMetaDataSpan"></pre>
|
||||
</div>
|
||||
<h4 class="with-padding hl-gray"><i class="icon icon-info-sign"> 此图片来自网友上传, 不代表<a href="/admin/terms.php" target="_blank">本站立场</a>, 若有侵权, 请举报或联系管理员!</i></h4>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -148,15 +152,15 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
<div class="col-md-6" style="padding-bottom: 10px;">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon"><i class="icon icon-link"></i> 直 链 </span>
|
||||
<input type="text" class="form-control" id="links" onclick="copyText()" value="<?php echo $img_url; ?>">
|
||||
<span class="input-group-btn"><button class="btn btn-default copyBtn1" type="button">复制</button></span>
|
||||
<input type="text" class="form-control" id="links" value="<?php echo $img_url; ?>">
|
||||
<span class="input-group-btn"><button class="btn btn-default btnLinks" onclick="uploadCopy('links','.btnLinks')" type="button">复制</button></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6" style="padding-bottom: 10px;">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon"><i class="icon icon-chat"></i> 论坛代码 </span>
|
||||
<input type="text" class="form-control" id="bbscode" value="[img]<?php echo $img_url; ?>[/img]">
|
||||
<span class="input-group-btn"><button class="btn btn-default copyBtn2" type="button">复制</button></span>
|
||||
<span class="input-group-btn"><button class="btn btn-default btnBbscode" onclick="uploadCopy('bbscode','.btnBbscode')" type="button">复制</button></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -165,14 +169,14 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
<div class="input-group">
|
||||
<span class="input-group-addon"><i class="icon icon-code"></i> MarkDown</span>
|
||||
<input type="text" class="form-control" id="markdown" value="![简单图床 - EasyImage](<?php echo $img_url; ?>)">
|
||||
<span class="input-group-btn"><button class="btn btn-default copyBtn3" type="button">复制</button></span>
|
||||
<span class="input-group-btn"><button class="btn btn-default btnMarkDown" onclick="uploadCopy('markdown','.btnMarkDown')" type="button">复制</button></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6" style="padding-bottom: 10px;">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon"><i class="icon icon-html5"></i> HTML </span>
|
||||
<input type="text" class="form-control" id="html" value='<img src="<?php echo $img_url; ?>" alt="简单图床 - EasyImage" />'>
|
||||
<span class="input-group-btn"><button class="btn btn-default copyBtn4" type="button">复制</button></span>
|
||||
<span class="input-group-btn"><button class="btn btn-default btnHtml" onclick="uploadCopy('html','.btnHtml')" type="button">复制</button></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -183,9 +187,10 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
<h4 class="header-dividing">当月随机图片:</h4>
|
||||
<div class="cards cards-borderless">
|
||||
<?php if ($logs[$logsName]['port'] != 0) : for ($i = 0; $i <= 7; $i++) : $randName = array_rand($logs, 1) ?>
|
||||
<div class="col-md-4 col-sm-6 col-lg-3">
|
||||
|
||||
<div class="col-md-3">
|
||||
<a class="card" href="?img=<?php echo $logs[$randName]['path']; ?>" target="_blank">
|
||||
<img src="thumb.php?img=<?php echo $logs[$randName]['path']; ?>">
|
||||
<img src="thumb.php?img=<?php echo $logs[$randName]['path']; ?>" width="100%">
|
||||
<div class="caption"><?php echo $logs[$randName]['source']; ?></div>
|
||||
</a>
|
||||
</div>
|
||||
|
@ -196,100 +201,54 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<script src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/clipboard/clipboard.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/imgready/imgready.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/clipboard/clipboard.min.js"></script>
|
||||
<!-- <script type="application/javascript" src="https://fastly.jsdelivr.net/gh/icret/EasyImages2.0@2.6.5/public/static/exif/exif.js"></script> -->
|
||||
<script>
|
||||
// 获取图片长宽 https://www.cnblogs.com/houxianzhou/p/14807983.html
|
||||
var imgReady = (function() {
|
||||
var list = [],
|
||||
intervalId = null,
|
||||
// 用来执行队列
|
||||
tick = function() {
|
||||
var i = 0;
|
||||
for (; i < list.length; i++) {
|
||||
list[i].end ? list.splice(i--, 1) : list[i]();
|
||||
};
|
||||
!list.length && stop();
|
||||
// POST 删除提交
|
||||
function ajax_post(url, mode = 'delete') {
|
||||
$.post("del.php", {
|
||||
url: url,
|
||||
mode: mode
|
||||
},
|
||||
// 停止所有定时器队列
|
||||
stop = function() {
|
||||
clearInterval(intervalId);
|
||||
intervalId = null;
|
||||
};
|
||||
return function(url, ready, load, error) {
|
||||
var onready, width, height, newWidth, newHeight,
|
||||
img = new Image();
|
||||
img.src = url;
|
||||
// 如果图片被缓存,则直接返回缓存数据
|
||||
if (img.complete) {
|
||||
ready.call(img);
|
||||
load && load.call(img);
|
||||
return;
|
||||
};
|
||||
width = img.width;
|
||||
height = img.height;
|
||||
// 加载错误后的事件
|
||||
img.onerror = function() {
|
||||
error && error.call(img);
|
||||
onready.end = true;
|
||||
img = img.onload = img.onerror = null;
|
||||
};
|
||||
// 图片尺寸就绪
|
||||
onready = function() {
|
||||
newWidth = img.width;
|
||||
newHeight = img.height;
|
||||
if (newWidth !== width || newHeight !== height || newWidth * newHeight > 1024) {
|
||||
// 如果图片已经在其他地方加载可使用面积检测
|
||||
ready.call(img);
|
||||
onready.end = true;
|
||||
};
|
||||
};
|
||||
onready();
|
||||
// 完全加载完毕的事件
|
||||
img.onload = function() {
|
||||
// onload在定时器时间差范围内可能比onready快
|
||||
// 这里进行检查并保证onready优先执行
|
||||
!onready.end && onready();
|
||||
load && load.call(img);
|
||||
// IE gif动画会循环执行onload,置空onload即可
|
||||
img = img.onload = img.onerror = null;
|
||||
};
|
||||
// 加入队列中定期执行
|
||||
if (!onready.end) {
|
||||
list.push(onready);
|
||||
// 无论何时只允许出现一个定时器,减少浏览器性能损耗
|
||||
if (intervalId === null) intervalId = setInterval(tick, 40);
|
||||
};
|
||||
};
|
||||
})();
|
||||
function(data, status) {
|
||||
console.log(data)
|
||||
let res = JSON.parse(data);
|
||||
new $.zui.Messager(res.msg, {
|
||||
type: res.type,
|
||||
icon: res.icon
|
||||
}).show();
|
||||
// 延时2秒刷新
|
||||
window.setTimeout(function() {
|
||||
window.location.reload();
|
||||
}, 2000)
|
||||
});
|
||||
}
|
||||
|
||||
imgReady('<?php echo $img_url; ?>', function() {
|
||||
// alert('size ready: width=' + this.width + '; height=' + this.height);
|
||||
var hw = document.getElementById("wh");
|
||||
hw.innerHTML = this.width + "x" + this.height
|
||||
// 获取图片长宽
|
||||
$.zui.imgReady($('#img1')[0].src, function() {
|
||||
$('#wh').text(this.width + "x" + this.height);
|
||||
});
|
||||
|
||||
// Exif信息
|
||||
/*
|
||||
window.onload = getExif;
|
||||
// // Exif信息
|
||||
// window.onload = getExif;
|
||||
|
||||
function getExif() {
|
||||
var img1 = document.getElementById("img1");
|
||||
EXIF.getData(img1, function() {
|
||||
var make = EXIF.getTag(this, "Make");
|
||||
var model = EXIF.getTag(this, "Model");
|
||||
var makeAndModel = document.getElementById("makeAndModel");
|
||||
makeAndModel.innerHTML = `${make} ${model}`;
|
||||
});
|
||||
var img2 = document.getElementById("img1");
|
||||
EXIF.getData(img2, function() {
|
||||
var allMetaData = EXIF.getAllTags(this);
|
||||
var allMetaDataSpan = document.getElementById("allMetaDataSpan");
|
||||
|
||||
allMetaDataSpan.innerHTML = EXIF.pretty(this);;
|
||||
});
|
||||
}
|
||||
*/
|
||||
// function getExif() {
|
||||
// var img1 = document.getElementById("img1");
|
||||
// EXIF.getData(img1, function() {
|
||||
// var make = EXIF.getTag(this, "Make");
|
||||
// var model = EXIF.getTag(this, "Model");
|
||||
// var makeAndModel = document.getElementById("makeAndModel");
|
||||
// makeAndModel.innerHTML = `${make} ${model}`;
|
||||
// });
|
||||
// var img2 = document.getElementById("img1");
|
||||
// EXIF.getData(img2, function() {
|
||||
// var allMetaData = EXIF.getAllTags(this);
|
||||
// var allMetaDataSpan = document.getElementById("allMetaDataSpan");
|
||||
// allMetaDataSpan.innerHTML = EXIF.pretty(this);;
|
||||
// });
|
||||
// }
|
||||
|
||||
//禁用右键
|
||||
document.onkeydown = function() {
|
||||
|
|
|
@ -20,7 +20,7 @@ class Ip2Region
|
|||
*/
|
||||
public function __construct()
|
||||
{
|
||||
class_exists('XdbSearcher') || include(__DIR__ . '/XdbSearcher.php');
|
||||
class_exists('XdbSearcher') or include __DIR__ . '/XdbSearcher.php';
|
||||
$this->searcher = XdbSearcher::newWithFileOnly(__DIR__ . '/ip2region.xdb');
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,20 @@ class Ip2Region
|
|||
return $this->memorySearch($ip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接查询并返回名称
|
||||
* @param string $ip
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function simple($ip)
|
||||
{
|
||||
$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}]");
|
||||
}
|
||||
|
||||
/**
|
||||
* destruct method
|
||||
* resource destroy
|
||||
|
|
92
app/list.php
|
@ -74,8 +74,8 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
<a href="<?php echo $config['report'] . '?Website1=' . $linkUrl; ?>" target="_blank"><i class="icon icon-question-sign" data-toggle="tooltip" title="举报文件" style="margin-left:10px;"></i></a>
|
||||
<?php endif; ?>
|
||||
<?php if (is_who_login('admin')) : ?>
|
||||
<a href="/app/del.php?recycle_url=<?php echo $relative_path; ?>" target="_blank" data-toggle="tooltip" title="回收文件" style="margin-left:10px;"><i class="icon icon-undo"></i></a>
|
||||
<a href="/app/del.php?url=<?php echo $relative_path; ?>" target="_blank" data-toggle="tooltip" title="删除文件" style="margin-left:10px;"><i class="icon icon-trash"></i></a>
|
||||
<a href="#" onclick="ajax_post('<?php echo $relative_path; ?>','recycle')" data-toggle="tooltip" title="回收文件" style="margin-left:10px;"><i class="icon icon-undo"></i></a>
|
||||
<a href="#" onclick="ajax_post('<?php echo $relative_path; ?>')" data-toggle="tooltip" title="删除文件" style="margin-left:10px;"><i class="icon icon-trash"></i></a>
|
||||
<label class="text-primary"><input type="checkbox" id="url" name="checkbox" value="<?php echo $relative_path; ?>"> 选择</label>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
@ -160,30 +160,11 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
</div>
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/EasyImage.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/viewjs/viewer.min.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/bootbox/bootbox.min.css">
|
||||
<style>
|
||||
/* 返回顶部 */
|
||||
.btn-back-to-top {
|
||||
padding: 0.5rem 1rem;
|
||||
position: fixed;
|
||||
right: 2rem;
|
||||
bottom: 1rem;
|
||||
z-index: 2;
|
||||
-webkit-transition: -webkit-transform 0.2s ease;
|
||||
transition: transform 0.2s ease;
|
||||
-webkit-transform: translateY(200%);
|
||||
transform: translateY(200%);
|
||||
}
|
||||
|
||||
.btn-back-to-top.scrolled {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
</style>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/bootbox/bootbox.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/lazyload/lazyload.min.js"></script>
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.css">
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/viewjs/viewer.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/lazyload/lazyload.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/bootbox/bootbox.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/clipboard/clipboard.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.js"></script>
|
||||
<script>
|
||||
|
@ -192,6 +173,49 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
url: 'data-original',
|
||||
});
|
||||
|
||||
// POST 删除提交
|
||||
function ajax_post(url, mode = 'delete') {
|
||||
|
||||
bootbox.confirm({
|
||||
message: "确认执行 " + mode + " 操作?",
|
||||
buttons: {
|
||||
confirm: {
|
||||
label: '确定',
|
||||
className: 'btn-success'
|
||||
},
|
||||
cancel: {
|
||||
label: '取消',
|
||||
className: 'btn-danger'
|
||||
}
|
||||
},
|
||||
callback: function(result) {
|
||||
if (result == true) {
|
||||
$.post("del.php", {
|
||||
url: url,
|
||||
mode: mode
|
||||
},
|
||||
function(data, status) {
|
||||
console.log(data)
|
||||
let res = JSON.parse(data);
|
||||
new $.zui.Messager(res.msg, {
|
||||
type: res.type,
|
||||
icon: res.icon
|
||||
}).show();
|
||||
// 延时2秒刷新
|
||||
window.setTimeout(function() {
|
||||
window.location.reload();
|
||||
}, 2000)
|
||||
});
|
||||
} else {
|
||||
new $.zui.Messager("取消 " + mode, {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "info-sign" // 定义消息图标
|
||||
}).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 复制url
|
||||
var clipboard = new Clipboard('.copy');
|
||||
clipboard.on('success', function(e) {
|
||||
|
@ -251,7 +275,7 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
check_val.push(obj[k].value);
|
||||
console.log(check_val);
|
||||
}
|
||||
$.post("./post_del.php", {
|
||||
$.post("del.php", {
|
||||
'recycle_url_array': check_val
|
||||
}, );
|
||||
new $.zui.Messager("放入回收站成功", {
|
||||
|
@ -298,7 +322,7 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
check_val.push(obj[k].value);
|
||||
console.log(check_val);
|
||||
}
|
||||
$.post("./post_del.php", {
|
||||
$.post("del.php", {
|
||||
'del_url_array': check_val
|
||||
},
|
||||
function(data) {
|
||||
|
@ -331,6 +355,14 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
});
|
||||
}
|
||||
|
||||
//懒加载
|
||||
var lazy = new Lazy({
|
||||
onload: function(elem) {
|
||||
console.log(elem)
|
||||
},
|
||||
delay: 300,
|
||||
})
|
||||
|
||||
// 返回顶部
|
||||
var back_to_top_button = jQuery('.btn-back-to-top');
|
||||
jQuery(window).scroll(function() {
|
||||
|
@ -350,14 +382,6 @@ if ($config['ad_top']) echo $config['ad_top_info'];
|
|||
return false;
|
||||
});
|
||||
|
||||
//懒加载
|
||||
var lazy = new Lazy({
|
||||
onload: function(elem) {
|
||||
console.log(elem)
|
||||
},
|
||||
delay: 300,
|
||||
})
|
||||
|
||||
// 按日期浏览
|
||||
$(".form-date").datetimepicker({
|
||||
weekStart: 1,
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 删除/回收文件页面
|
||||
* @author Icret
|
||||
* 2022-2-23 11:01:52
|
||||
*/
|
||||
require_once __DIR__ . '/function.php';
|
||||
|
||||
if (!is_who_login('admin')) {
|
||||
exit('Not Logged!');
|
||||
}
|
||||
|
||||
// 删除文件
|
||||
if (isset($_POST['del_url_array'])) {
|
||||
$del_url_array = $_POST['del_url_array'];
|
||||
$del_num = count($del_url_array);
|
||||
for ($i = 0; $i < $del_num; $i++) {
|
||||
getDel($del_url_array[$i], 'url');
|
||||
// FTP
|
||||
// any_upload($del_url_array[$i], null, 'delete');
|
||||
}
|
||||
}
|
||||
|
||||
// 回收文件
|
||||
if (isset($_POST['recycle_url_array'])) {
|
||||
$recycle_url_array = $_POST['recycle_url_array'];
|
||||
$del_num = count($recycle_url_array);
|
||||
for ($i = 0; $i < $del_num; $i++) {
|
||||
checkImg($recycle_url_array[$i], 3);
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 2023-01-29
|
||||
* 随机图片显示
|
||||
*/
|
||||
|
||||
$img_array = glob('../public/images/*.{gif,jpg,png,jpeg,webp,bmp}', GLOB_BRACE);
|
||||
if (count($img_array) == 0) die('没找到图片文件。请先上传一些图片到 ' . dirname(__FILE__) . '/images/ 文件夹');
|
||||
header('Content-Type: image/png');
|
||||
echo (file_get_contents($img_array[array_rand($img_array)]));
|
|
@ -55,7 +55,7 @@ define('MEMORY_LIMIT', '256M');
|
|||
define('DEFAULT_WIDTH', $config['thumbnail_w']);
|
||||
define('DEFAULT_HEIGHT', $config['thumbnail_h']);
|
||||
define('FILE_CACHE_PREFIX', 'EasyImage');
|
||||
define('DEFAULT_ZC', 1);
|
||||
define('DEFAULT_ZC', 0);
|
||||
|
||||
define('MAX_WIDTH', 10240);
|
||||
define('MAX_HEIGHT', 10240);
|
||||
|
|
|
@ -4,15 +4,20 @@ namespace Verot\Upload;
|
|||
|
||||
require __DIR__ . '/function.php';
|
||||
require __DIR__ . '/class.upload.php';
|
||||
// 定义返回头信息为Json
|
||||
header("Content-type: application/json; charset=utf-8");
|
||||
|
||||
// 检查登录
|
||||
if ($config['mustLogin']) {
|
||||
if (!is_who_login('status')) {
|
||||
exit(json_encode(array(
|
||||
"result" => "failed",
|
||||
"code" => 401,
|
||||
"message" => "本站已开启登陆上传,您尚未登陆",
|
||||
)));
|
||||
exit(json_encode(
|
||||
array(
|
||||
"result" => "failed",
|
||||
"code" => 401,
|
||||
"message" => "本站已开启登陆上传,您尚未登陆",
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,50 +28,65 @@ if (empty($_FILES['file'])) {
|
|||
"result" => "failed",
|
||||
"code" => 204,
|
||||
"message" => "没有选择上传的文件",
|
||||
)
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
|
||||
// sign : 前端生成的时间戳 time() - $_POST['sign'] = 从选择文件到上传完毕的耗费时间
|
||||
if (empty($_POST['sign']) || time() - $_POST['sign'] > 12306) {
|
||||
exit(json_encode(array(
|
||||
"result" => "failed",
|
||||
"code" => 403,
|
||||
"systime" => time(),
|
||||
"message" => "上传签名错误,请刷新重试",
|
||||
)));
|
||||
exit(json_encode(
|
||||
array(
|
||||
"result" => "failed",
|
||||
"code" => 403,
|
||||
"systime" => time(),
|
||||
"message" => "上传签名错误,请刷新重试",
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
|
||||
// 黑/白IP名单上传
|
||||
if ($config['check_ip']) {
|
||||
if (checkIP(null, $config['check_ip_list'], $config['check_ip_model'])) {
|
||||
// 上传错误 code:403 未授权IP
|
||||
exit(json_encode(array(
|
||||
"result" => "failed",
|
||||
"code" => 403,
|
||||
"message" => "黑名单内或白名单外用户不允许上传",
|
||||
)));
|
||||
exit(json_encode(
|
||||
array(
|
||||
"result" => "failed",
|
||||
"code" => 403,
|
||||
"message" => "你不能上传任何文件",
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// 根据IP限制游客每日上传数量
|
||||
if ($config['ip_upload_counts'] > 0 && !is_who_login('status')) {
|
||||
if (false == get_ip_upload_log_counts(real_ip())) {
|
||||
if (false === get_ip_upload_log_counts(real_ip())) {
|
||||
exit(json_encode(
|
||||
array(
|
||||
"result" => "failed",
|
||||
"code" => 403,
|
||||
"message" => sprintf("游客限制每日上传 %d 张", $config['ip_upload_counts']),
|
||||
)
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$handle = new Upload($_FILES['file'], 'zh_CN');
|
||||
// 分片上传
|
||||
if ($config['chunks']) {
|
||||
$chunk = chunk($_POST['name']);
|
||||
// exit($chunk);
|
||||
$handle = new Upload($chunk, 'zh_CN');
|
||||
} else {
|
||||
$handle = new Upload($_FILES['file'], 'zh_CN');
|
||||
}
|
||||
|
||||
if ($handle->uploaded) {
|
||||
// 允许上传的mime类型
|
||||
if ($config['allowed'] === 1) {
|
||||
if ($config['allowed']) {
|
||||
$handle->allowed = array('image/*');
|
||||
}
|
||||
|
||||
|
@ -79,14 +99,14 @@ if ($handle->uploaded) {
|
|||
"result" => "failed",
|
||||
"code" => 205,
|
||||
"message" => "请勿上传非法文件",
|
||||
)
|
||||
),
|
||||
JSON_UNESCAPED_UNICODE
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// 文件命名
|
||||
$handle->file_new_name_body = imgName($handle->file_src_name_body);
|
||||
|
||||
// 最大上传限制
|
||||
$handle->file_max_size = $config['maxSize'];
|
||||
// 最大宽度
|
||||
|
@ -108,8 +128,7 @@ if ($handle->uploaded) {
|
|||
// JPEG 图像的压缩质量 1-100
|
||||
$handle->jpeg_quality = $config['compress_ratio'];
|
||||
|
||||
/* 等比例缩减图片 放到前端了*/
|
||||
/*
|
||||
/* 等比例缩减图片 放到前端了
|
||||
if ($config['imgRatio']) {
|
||||
$handle->image_resize = true;
|
||||
$handle->image_x = $config['image_x'];
|
||||
|
@ -128,17 +147,15 @@ if ($handle->uploaded) {
|
|||
|
||||
// 默认目录
|
||||
$Img_path = config_path();
|
||||
|
||||
// 开启管理员自定义目录
|
||||
if ($config['admin_path_status']) {
|
||||
if (checkLogin() == 204) {
|
||||
if (checkLogin() === 204) {
|
||||
$Img_path = config_path($config['admin_path'] . date('/Y/m/d/'));
|
||||
}
|
||||
}
|
||||
|
||||
// 开启上传者单独目录
|
||||
if ($config['guest_path_status']) {
|
||||
if (checkLogin() == 205) {
|
||||
if (checkLogin() === 205) {
|
||||
$getCok = json_decode($_COOKIE['auth']);
|
||||
$Img_path = config_path($getCok[0] . date('/Y/m/d/'));
|
||||
}
|
||||
|
@ -149,8 +166,6 @@ if ($handle->uploaded) {
|
|||
|
||||
// 图片完整相对路径:/i/2021/05/03/k88e7p.jpg
|
||||
if ($handle->processed) {
|
||||
header('Content-type:text/json');
|
||||
|
||||
// 图片相对路径
|
||||
$pathIMG = $Img_path . $handle->file_dst_name;
|
||||
// 图片访问网址
|
||||
|
@ -159,13 +174,13 @@ if ($handle->uploaded) {
|
|||
$processUrl = $config['domain'] . $pathIMG;
|
||||
|
||||
// 隐藏config文件中的path目录,需要搭配网站设置
|
||||
if ($config['hide_path'] == 1) {
|
||||
if ($config['hide_path'] === 1) {
|
||||
$imageUrl = str_replace($config['path'], '/', $imageUrl);
|
||||
}
|
||||
|
||||
// 源图保护 key值是由crc32加密的hide_key
|
||||
// $hide_original = $config['hide'] == 1 ? $config['domain'] . '/app/hide.php?key=' . urlHash($pathIMG, 0, crc32($config['hide_key'])) : $imageUrl;
|
||||
if ($config['hide'] == 1) {
|
||||
if ($config['hide'] === 1) {
|
||||
$imageUrl = $config['domain'] . '/app/hide.php?key=' . urlHash($pathIMG, 0, crc32($config['hide_key']));
|
||||
}
|
||||
|
||||
|
@ -178,7 +193,7 @@ if ($handle->uploaded) {
|
|||
|
||||
// 当设置访问生成缩略图时自动生成 2022-12-30 修正 2023-01-30
|
||||
$handleThumb = $config['domain'] . '/app/thumb.php?img=' . $pathIMG;
|
||||
if ($config['thumbnail'] == 2) {
|
||||
if ($config['thumbnail'] === 2) {
|
||||
// 自定义缩略图长宽
|
||||
$handle->image_resize = true;
|
||||
$handle->image_x = $config['thumbnail_w'];
|
||||
|
@ -200,10 +215,9 @@ if ($handle->uploaded) {
|
|||
"del" => $delUrl,
|
||||
// "memory" => getDistUsed(memory_get_peak_usage()), // 占用内存 2023-02-12
|
||||
);
|
||||
echo json_encode($reJson);
|
||||
echo json_encode($reJson, JSON_UNESCAPED_UNICODE);
|
||||
$handle->clean(); // 如果取消上传生成缩略图需要恢复此选项功能
|
||||
} else {
|
||||
// 上传错误 code:206 客户端文件有问题
|
||||
} else { // 上传错误 code:206 客户端文件有问题
|
||||
$reJson = array(
|
||||
"result" => "failed",
|
||||
"code" => 206,
|
||||
|
@ -212,13 +226,10 @@ if ($handle->uploaded) {
|
|||
// 'log' => $handle->log, // 仅用作调试用
|
||||
);
|
||||
unset($handle);
|
||||
header('Content-Type:application/json; charset=utf-8');
|
||||
exit(json_encode($reJson, JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
|
||||
/** 后续处理 */
|
||||
// 上传至其他位置
|
||||
// @any_upload($pathIMG, APP_ROOT . $pathIMG, 'upload');
|
||||
// 使用fastcgi_finish_request操作
|
||||
if (function_exists('fastcgi_finish_request')) fastcgi_finish_request();
|
||||
// 同IP上传日志
|
||||
|
@ -231,6 +242,8 @@ if ($handle->uploaded) {
|
|||
@water($handle->file_dst_pathname);
|
||||
// 压缩
|
||||
@process_compress($handle->file_dst_pathname);
|
||||
// 上传至其他位置
|
||||
@any_upload($pathIMG, APP_ROOT . $pathIMG, 'upload');
|
||||
|
||||
unset($handle);
|
||||
}
|
||||
|
|
|
@ -58,14 +58,34 @@ try {
|
|||
</div>
|
||||
<p class="text-muted" style="font-size:10px;"><i class="modal-icon icon-info"></i> 建议使用分辨率 ≥ 1366*768px; 当前日志文件: <?php echo $logFile; ?></p>
|
||||
</div>
|
||||
<link href="<?php static_cdn(); ?>/public/static/zui/lib/datagrid/zui.datagrid.min.css" rel="stylesheet">
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/datagrid/zui.datagrid.min.js"></script>
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/datagrid/zui.datagrid.min.css">
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/datagrid/zui.datagrid.min.js"></script>
|
||||
<script>
|
||||
// 更改页面布局
|
||||
$(document).ready(function() {
|
||||
$("body").removeClass("container").addClass("container-fixed-lg");
|
||||
});
|
||||
|
||||
// POST 删除提交
|
||||
function ajax_post(url, mode = 'delete') {
|
||||
$.post("del.php", {
|
||||
url: url,
|
||||
mode: mode
|
||||
},
|
||||
function(data, status) {
|
||||
console.log(data)
|
||||
let res = JSON.parse(data);
|
||||
new $.zui.Messager(res.msg, {
|
||||
type: res.type,
|
||||
icon: res.icon
|
||||
}).show();
|
||||
// 延时2秒刷新
|
||||
window.setTimeout(function() {
|
||||
window.location.reload();
|
||||
}, 2000)
|
||||
});
|
||||
}
|
||||
|
||||
// logs 数据表格
|
||||
$('#logs').datagrid({
|
||||
dataSource: {
|
||||
|
@ -155,7 +175,7 @@ try {
|
|||
size: '<?php echo $v['size']; ?>',
|
||||
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 $config['domain'] . $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='/app/del.php?recycle_url=<?php echo $v['path']; ?>' target='_blank' class='btn btn-mini btn-info'>回收</a> <a href='/app/del.php?url=<?php echo $v['path']; ?>' target='_blank' class='btn btn-mini btn-danger'>删除</a></div>",
|
||||
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,16 +1,16 @@
|
|||
<?php
|
||||
$tokenList=Array
|
||||
(
|
||||
'd5edb4e962a017bd99d1b71195f39fa9'=>Array
|
||||
(
|
||||
'id'=>0,
|
||||
'expired'=>1678456553,
|
||||
'add_time'=>1678456540
|
||||
),
|
||||
'1c17b11693cb5ec63859b091c5b9c1b2'=>Array
|
||||
(
|
||||
'id'=>0,
|
||||
'expired'=>2544411528,
|
||||
'add_time'=>1680497928
|
||||
),
|
||||
'833c5611862efcaa9955205ee96125e9'=>Array
|
||||
(
|
||||
'id'=>2,
|
||||
'expired'=>2542384054,
|
||||
'add_time'=>1678470454
|
||||
'expired'=>1680584583,
|
||||
'add_time'=>1680498183
|
||||
)
|
||||
);
|
|
@ -4,7 +4,7 @@ $guestConfig=Array
|
|||
'guest'=>Array
|
||||
(
|
||||
'password'=>'84983c60f7daadc1cb8698621f802c0d9f9a3c3c295c810748fb048115c186ec',
|
||||
'expired'=>1680497325,
|
||||
'add_time'=>1677905325
|
||||
'expired'=>1765301956,
|
||||
'add_time'=>1678988356
|
||||
)
|
||||
);
|
|
@ -0,0 +1,3 @@
|
|||
- 远程文件夹权限问题
|
||||
- FTP用户权限
|
||||
- 主动被动问题
|
|
@ -1,3 +1,16 @@
|
|||
* 2024-01-20 v2.8.4
|
||||
- Fix [#163](https://github.com/icret/EasyImages2.0/pull/163)
|
||||
- 增加检测FTP
|
||||
- 增加自定义时区
|
||||
- 增加大文件分片上传
|
||||
- 增加重置OPcache缓存
|
||||
- 增加自定义NProgress颜色
|
||||
- 优化-IP数据基于内存的查询
|
||||
- 优化-删除类操作统一
|
||||
- 优化-修改配置统一
|
||||
- 优化-页面
|
||||
- 更新组件
|
||||
|
||||
* 2023-05-30 v2.8.3
|
||||
- FIX [#118](https://github.com/icret/EasyImages2.0/issues/118)
|
||||
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
- 登录图床后台->图床安全->高级设置->开启API上传
|
||||
- 访问下面链接即可:
|
||||
[https://www.icloud.com/shortcuts/857b1921c1aa4d679470fcfed583cb1c](https://www.icloud.com/shortcuts/857b1921c1aa4d679470fcfed583cb1c)
|
||||
|
||||
- [RashidaKAKU](https://github.com/RashidaKAKU)提供
|
||||
[https://www.icloud.com/shortcuts/5f5fc7a047d9464ea95554246ba21c74](https://www.icloud.com/shortcuts/5f5fc7a047d9464ea95554246ba21c74)
|
13
i/index.html
106
index.php
|
@ -55,42 +55,42 @@ mustLogin();
|
|||
<div class="tab-content" style="text-align:right;">
|
||||
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 1) echo 'active in'; ?>" id="tab2Content1">
|
||||
<textarea class="form-control" rows="5" id="links" readonly></textarea>
|
||||
<button class="btn btn-primary" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
|
||||
<button id="btnLinks" class="btn btn-primary copyBtn1" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
|
||||
<button class="btn btn-primary" data-toggle="tooltip" data-original-title="刷新" style="margin-top:5px;" onclick="location.reload()"><i class="icon icon-refresh"></i></button>
|
||||
<button class="btn btn-primary btnLinks" onclick="uploadCopy('links','.btnLinks')" data-toggle="tooltip" data-original-title="复制" data-loading-text="已复制" style="margin-top:5px;"><i class="icon icon-copy"></i></button>
|
||||
</div>
|
||||
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 2) echo 'active in'; ?>" id="tab2Content2">
|
||||
<textarea class="form-control" rows="5" id="bbscode" readonly></textarea>
|
||||
<button class="btn btn-primary" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
|
||||
<button id="btnBbscode" class="btn btn-primary copyBtn2" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
|
||||
<button class="btn btn-primary" data-toggle="tooltip" data-original-title="刷新" style="margin-top:5px;" onclick="location.reload()"><i class="icon icon-refresh"></i></button>
|
||||
<button class="btn btn-primary btnBbscode" onclick="uploadCopy('bbscode','.btnBbscode')" data-toggle="tooltip" data-original-title="复制" data-loading-text="已复制" style="margin-top:5px;"><i class="icon icon-copy"></i></button>
|
||||
</div>
|
||||
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 3) echo 'active in'; ?>" id="tab2Content3">
|
||||
<textarea class="form-control" rows="5" id="markdown" readonly></textarea>
|
||||
<button class="btn btn-primary" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
|
||||
<button id="btnMarkDown" class="btn btn-primary copyBtn3" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
|
||||
<button class="btn btn-primary" data-toggle="tooltip" data-original-title="刷新" style="margin-top:5px;" onclick="location.reload()"><i class="icon icon-refresh"></i></button>
|
||||
<button class="btn btn-primary btnMarkDown" onclick="uploadCopy('markdown','.btnMarkDown')" data-toggle="tooltip" data-original-title="复制" data-loading-text="已复制" style="margin-top:5px;"><i class="icon icon-copy"></i></button>
|
||||
</div>
|
||||
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 4) echo 'active in'; ?>" id="tab2Content4">
|
||||
<textarea class="form-control" rows="5" id="html" readonly></textarea>
|
||||
<button class="btn btn-primary" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
|
||||
<button id="btnHtml" class="btn btn-primary copyBtn4" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
|
||||
<button class="btn btn-primary" data-toggle="tooltip" data-original-title="刷新" style="margin-top:5px;" onclick="location.reload()"><i class="icon icon-refresh"></i></button>
|
||||
<button class="btn btn-primary btnHtml" onclick="uploadCopy('html','.btnHtml')" data-toggle="tooltip" data-original-title="复制" data-loading-text="已复制" style="margin-top:5px;"><i class="icon icon-copy"></i></button>
|
||||
</div>
|
||||
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 5) echo 'active in'; ?>" id="tab2Content5">
|
||||
<textarea class="form-control" rows="5" id="thumb" readonly></textarea>
|
||||
<button class="btn btn-primary" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
|
||||
<button id="btnThumb" class="btn btn-primary copyBtn5" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
|
||||
<button class="btn btn-primary" data-toggle="tooltip" data-original-title="刷新" style="margin-top:5px;" onclick="location.reload()"><i class="icon icon-refresh"></i></button>
|
||||
<button class="btn btn-primary btnThumb" onclick="uploadCopy('thumb','.btnThumb')" data-toggle="tooltip" data-original-title="复制" data-loading-text="已复制" style="margin-top:5px;"><i class="icon icon-copy"></i></button>
|
||||
</div>
|
||||
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 6) echo 'active in'; ?>" id="tab2Content6">
|
||||
<textarea class="form-control" rows="5" id="del" readonly></textarea>
|
||||
<button class="btn btn-primary" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
|
||||
<button id="btnDel" class="btn btn-primary copyBtn6" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
|
||||
<button class="btn btn-primary" data-toggle="tooltip" data-original-title="刷新" style="margin-top:5px;" onclick="location.reload()"><i class="icon icon-refresh"></i></button>
|
||||
<button class="btn btn-primary btnDel" onclick="uploadCopy('del','.btnDel')" data-toggle="tooltip" data-original-title="复制" data-loading-text="已复制" style="margin-top:5px;"><i class="icon icon-copy"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<link href="<?php static_cdn(); ?>/public/static/marquee/marquee.css" rel="stylesheet">
|
||||
<link href="<?php static_cdn(); ?>/public/static/zui/lib/uploader/zui.uploader.min.css" rel="stylesheet">
|
||||
<script src="<?php static_cdn(); ?>/public/static/zui/lib/uploader/zui.uploader.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/marquee/marquee.min.js"></script>
|
||||
<script src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/marquee/marquee.css">
|
||||
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/uploader/zui.uploader.min.css">
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/zui/lib/uploader/zui.uploader.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/marquee/marquee.min.js"></script>
|
||||
<script type="application/javascript" src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
|
||||
<script>
|
||||
// 公告
|
||||
(function() {
|
||||
|
@ -121,7 +121,7 @@ mustLogin();
|
|||
// 最大支持的上传文件
|
||||
max_file_size: <?php echo $config['maxSize']; ?>,
|
||||
// 分片上传 0为不分片 分片容易使图片上传失败
|
||||
chunk_size: 0,
|
||||
chunk_size: <?php echo $config['chunks']; ?>,
|
||||
// 点击文件列表上传文件
|
||||
browseByClickList: true,
|
||||
// flash 上传组件地址
|
||||
|
@ -130,7 +130,7 @@ mustLogin();
|
|||
flash_swf_url: '<?php static_cdn(); ?>/public/static/zui/lib/uploader/Moxie.xap',
|
||||
// sign
|
||||
multipart_params: {
|
||||
'sign': Date.now() / 1000,
|
||||
'sign': new Date().getTime() / 1000 | 0,
|
||||
},
|
||||
// 预览图尺寸
|
||||
previewImageSize: {
|
||||
|
@ -152,37 +152,67 @@ mustLogin();
|
|||
},
|
||||
// 限制文件上传数目
|
||||
limitFilesCount: <?php echo $config['maxUploadFiles']; ?>,
|
||||
// 移除文件进行确认
|
||||
deleteConfirm: true,
|
||||
// 重置上传失败的文件
|
||||
autoResetFails: true,
|
||||
// 当文件上传进度发送变化时触发,此回调函数会在上传文件的过程中反复触发
|
||||
onUploadProgress: function(file) {
|
||||
NProgress.configure({
|
||||
barColor: '<?php echo $config['NProgress_Progress']; ?>'
|
||||
});
|
||||
NProgress.set(0)
|
||||
NProgress.set(file.percent / 100)
|
||||
},
|
||||
// 显示上传成功消息
|
||||
uploadedMessage: '已上传 {uploaded} 个文件,{failed} 个文件上传失败',
|
||||
// 当启用分片上传选项后,每个文件片段上传完成时触发
|
||||
onChunkUploaded: function(file, responseObject) {
|
||||
NProgress.set(responseObject.offset / responseObject.total);
|
||||
},
|
||||
<?php echo imgRatio(); ?>,
|
||||
responseHandler: function(responseObject, file) {
|
||||
var obj = JSON.parse(responseObject.response); //由JSON字符串转换为JSON对象
|
||||
console.log(file); // 输出上传log
|
||||
console.log(obj); // 输出回传log
|
||||
if (obj.result === 'success') {
|
||||
document.getElementById("links").innerHTML += obj.url + "\r\n";
|
||||
document.getElementById("bbscode").innerHTML += "[img]" + obj.url + "[/img]\r\n";
|
||||
document.getElementById("markdown").innerHTML += "![" + obj.srcName + "](" + obj.url + ")\r\n";
|
||||
document.getElementById("html").innerHTML += '<img src="' + obj.url + '" alt="' + obj.srcName + '" />\r\n';
|
||||
document.getElementById("thumb").innerHTML += obj.thumb + "\r\n";
|
||||
document.getElementById("del").innerHTML += obj.del + "\r\n";
|
||||
if (obj.code === 200) {
|
||||
$("#links").append(obj.url + "\r\n");
|
||||
$("#bbscode").append("[img]" + obj.url + "[/img]\r\n");
|
||||
$("#markdown").append("![" + obj.srcName + "](" + obj.url + ")\r\n");
|
||||
$("#html").append('<img src="' + obj.url + '" alt="' + obj.srcName + '" />\r\n');
|
||||
$("#thumb").append(obj.thumb + "\r\n");
|
||||
$("#del").append(obj.del + "\r\n");
|
||||
|
||||
new $.zui.Messager(obj.srcName + "上传成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
// 上传成功提示
|
||||
new $.zui.Messager(obj.srcName + " 上传成功", {
|
||||
type: "primary",
|
||||
placement: 'bottom-right',
|
||||
icon: "check" // 定义消息图标
|
||||
icon: "check"
|
||||
}).show();
|
||||
} else {
|
||||
return '上传失败,错误信息:' + obj.message;
|
||||
}
|
||||
|
||||
try { // 储存上传历史
|
||||
console.log('localStorage ok!');
|
||||
$.zui.store.set(obj.srcName, obj)
|
||||
} catch (err) {
|
||||
console.log('localStorage failed:' + err);
|
||||
try { // 储存上传历史
|
||||
console.log('history localStorage success');
|
||||
$.zui.store.set(obj.srcName, obj)
|
||||
} catch (err) {
|
||||
// 失败提示
|
||||
$.zui.messager.show('存储上传记录失败' + err, {
|
||||
icon: 'bell',
|
||||
time: 4000,
|
||||
type: 'danger',
|
||||
placement: 'top'
|
||||
});
|
||||
console.log('localStorage failed:' + err);
|
||||
}
|
||||
} else {
|
||||
// 上传失败提示
|
||||
new $.zui.Messager(obj.message, {
|
||||
type: "danger",
|
||||
placement: 'bottom-right',
|
||||
icon: "times"
|
||||
}).show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
|
|
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 170 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 164 KiB |
After Width: | Height: | Size: 73 KiB |
|
@ -50,13 +50,13 @@ function checkPASS($name)
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="keywords" content="EasyIamge 2.0 安装环境检测" />
|
||||
<meta name="description" content="EasyIamge 2.0 安装环境检测" />
|
||||
<link rel="shortcut icon" href="./../favicon.ico" type="image/x-icon" />
|
||||
<link href="./../public/static/zui/css/zui.min.css?v1.10.0" rel="stylesheet">
|
||||
<link href="./../public/static/nprogress/nprogress.min.css?v1.10.0" rel="stylesheet">
|
||||
<script src="./../public/static/zui/lib/jquery/jquery-3.6.0.min.js?v3.4.1"></script>
|
||||
<script src="./../public/static/zui/js/zui.min.js?v1.10.0"></script>
|
||||
<script src="./../public/static/qrcode/qrcode.min.js?v2.0"></script>
|
||||
<script src="./../public/static/nprogress/nprogress.min.js"></script>
|
||||
<link rel="stylesheet" rel="shortcut icon" href="./../favicon.ico" type="image/x-icon" />
|
||||
<link rel="stylesheet" href="./../public/static/zui/css/zui.min.css?v1.10.0">
|
||||
<link rel="stylesheet" href="./../public/static/nprogress/nprogress.min.css?v1.10.0">
|
||||
<script type="application/javascript" src="./../public/static/zui/lib/jquery/jquery-3.6.0.min.js?v3.4.1"></script>
|
||||
<script type="application/javascript" src="./../public/static/zui/js/zui.min.js?v1.10.0"></script>
|
||||
<script type="application/javascript" src="./../public/static/qrcode/qrcode.min.js?v2.0"></script>
|
||||
<script type="application/javascript" src="./../public/static/nprogress/nprogress.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
|
|
|
@ -23,12 +23,12 @@ if ($state !== 'checked') {
|
|||
<meta name="keywords" content="EasyIamge 2.0 即将完成安装!" />
|
||||
<meta name="description" content="EasyIamge 2.0 即将完成安装!" />
|
||||
<link rel="shortcut icon" href="./../favicon.ico" type="image/x-icon" />
|
||||
<link href="./../public/static/zui/css/zui.min.css?v1.10.0" rel="stylesheet">
|
||||
<link href="./../public/static/nprogress/nprogress.min.css?v1.10.0" rel="stylesheet">
|
||||
<script src="./../public/static/zui/lib/jquery/jquery-3.6.0.min.js?v3.4.1"></script>
|
||||
<script src="./../public/static/zui/js/zui.min.js?v1.10.0"></script>
|
||||
<script src="./../public/static/qrcode/qrcode.min.js?v2.0"></script>
|
||||
<script src="./../public/static/nprogress/nprogress.min.js"></script>
|
||||
<link rel="stylesheet" href="./../public/static/zui/css/zui.min.css?v1.10.0">
|
||||
<link rel="stylesheet" href="./../public/static/nprogress/nprogress.min.css?v1.10.0">
|
||||
<script type="application/javascript" src="./../public/static/zui/lib/jquery/jquery-3.6.0.min.js?v3.4.1"></script>
|
||||
<script type="application/javascript" src="./../public/static/zui/js/zui.min.js?v1.10.0"></script>
|
||||
<script type="application/javascript" src="./../public/static/qrcode/qrcode.min.js?v2.0"></script>
|
||||
<script type="application/javascript" src="./../public/static/nprogress/nprogress.min.js"></script>
|
||||
<style>
|
||||
.message {
|
||||
font-size: 12px;
|
||||
|
|
|
@ -1,97 +1,67 @@
|
|||
/** 图片列表*/
|
||||
|
||||
@media screen and (min-width:960px) {
|
||||
.listNum img {
|
||||
width: 258px;
|
||||
height: 258px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width:960px) {
|
||||
.listNum img {
|
||||
width: 358px;
|
||||
height: 258px;
|
||||
}
|
||||
}
|
||||
/** 返回顶部*/
|
||||
|
||||
* {
|
||||
list-style: none;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
#rocket-to-top div {
|
||||
left: 0;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 110px;
|
||||
}
|
||||
|
||||
#rocket-to-top .level-2 {
|
||||
background: url("../images/rocket_button_up.png") no-repeat scroll -149px 0 transparent;
|
||||
display: none;
|
||||
height: 250px;
|
||||
opacity: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#rocket-to-top .level-3 {
|
||||
background: none repeat scroll 0 0 transparent;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
height: 150px;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
#rocket-to-top {
|
||||
background: url("../images/rocket_button_up.png") no-repeat scroll 0 0 transparent;
|
||||
cursor: default;
|
||||
display: block;
|
||||
height: 250px;
|
||||
margin: -125px 0 0;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: fixed;
|
||||
right: 0;
|
||||
top: 80%;
|
||||
width: 110px;
|
||||
z-index: 11;
|
||||
}
|
||||
|
||||
.cards {
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin-right: 0px;
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.card {
|
||||
box-shadow: rgba(0, 0, 0, 0.45) 0px 25px 20px -20px;
|
||||
border-radius: 5px 5px 5px 5px;
|
||||
}
|
||||
|
||||
img {
|
||||
cursor: pointer;
|
||||
transition: all 0.8s;
|
||||
}
|
||||
|
||||
img:hover {
|
||||
transform: scale(1.5);
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.bottom-bar {
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
bottom: 0.1px;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.bottom-bar:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
/* 返回顶部 */
|
||||
.btn-back-to-top {
|
||||
padding: 0.5rem 1rem;
|
||||
position: fixed;
|
||||
right: 2rem;
|
||||
bottom: 1rem;
|
||||
z-index: 2;
|
||||
-webkit-transition: -webkit-transform 0.2s ease;
|
||||
transition: transform 0.2s ease;
|
||||
-webkit-transform: translateY(200%);
|
||||
transform: translateY(200%);
|
||||
}
|
||||
|
||||
.btn-back-to-top.scrolled {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/** 图片列表*/
|
||||
@media screen and (min-width:960px) {
|
||||
.listNum img {
|
||||
width: 258px;
|
||||
height: 258px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width:960px) {
|
||||
.listNum img {
|
||||
width: 358px;
|
||||
height: 258px;
|
||||
}
|
||||
}
|
||||
|
||||
.cards {
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin-right: 0px;
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.card {
|
||||
box-shadow: rgba(0, 0, 0, 0.45) 0px 25px 20px -20px;
|
||||
border-radius: 5px 5px 5px 5px;
|
||||
}
|
||||
|
||||
img {
|
||||
cursor: pointer;
|
||||
transition: all 0.8s;
|
||||
}
|
||||
|
||||
img:hover {
|
||||
transform: scale(1.5);
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.bottom-bar {
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
bottom: 0.1px;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.bottom-bar:hover {
|
||||
opacity: 1;
|
||||
}
|
|
@ -1,213 +1,56 @@
|
|||
/**
|
||||
* 来自于copy_btn.js paste.js合并
|
||||
* 简单图床-复制链接
|
||||
* 2023-01-30
|
||||
* 2023-04-20
|
||||
* @param {*} copyID 传入的ID
|
||||
* @param {*} loadClass 传入的class
|
||||
*/
|
||||
document.getElementsByClassName('copyBtn1')[0].onclick = function () {
|
||||
var copyVal = document.getElementById("links");
|
||||
function uploadCopy(copyID, loadClass) {
|
||||
var copyVal = document.getElementById(copyID);
|
||||
copyVal.select();
|
||||
|
||||
// 复制内容为空时的提示
|
||||
if (copyVal.value.length === 0) { new $.zui.Messager("复制内容为空", { type: "danger", icon: "bell" }).show(); return; }
|
||||
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(copyVal.value).then(function () {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
//success
|
||||
new $.zui.Messager("复制成功", { type: "primary", icon: "ok-sign" }).show();
|
||||
}, function () {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
//fail
|
||||
new $.zui.Messager("复制失败, 请手动复制", { type: "danger", icon: "bell" }).show();
|
||||
});
|
||||
|
||||
} else {
|
||||
if (document.execCommand('copy', false, null)) {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
//success
|
||||
new $.zui.Messager("复制成功", { type: "primary", icon: "ok-sign" }).show();
|
||||
} else {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
//fail
|
||||
new $.zui.Messager("复制失败, 请手动复制", { type: "danger", icon: "bell" }).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementsByClassName('copyBtn2')[0].onclick = function () {
|
||||
var copyVal = document.getElementById("bbscode");
|
||||
copyVal.select();
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(copyVal.value).then(function () {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
}, function () {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
});
|
||||
|
||||
} else {
|
||||
if (document.execCommand('copy', false, null)) {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
} else {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementsByClassName('copyBtn3')[0].onclick = function () {
|
||||
var copyVal = document.getElementById("markdown");
|
||||
copyVal.select();
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(copyVal.value).then(function () {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
}, function () {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
});
|
||||
|
||||
} else {
|
||||
if (document.execCommand('copy', false, null)) {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
} else {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementsByClassName('copyBtn4')[0].onclick = function () {
|
||||
var copyVal = document.getElementById("html");
|
||||
copyVal.select();
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(copyVal.value).then(function () {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
}, function () {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
});
|
||||
|
||||
} else {
|
||||
if (document.execCommand('copy', false, null)) {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
} else {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementsByClassName('copyBtn5')[0].onclick = function () {
|
||||
var copyVal = document.getElementById("thumb");
|
||||
copyVal.select();
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(copyVal.value).then(function () {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
}, function () {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
});
|
||||
|
||||
} else {
|
||||
if (document.execCommand('copy', false, null)) {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
} else {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementsByClassName('copyBtn6')[0].onclick = function () {
|
||||
var copyVal = document.getElementById("del");
|
||||
copyVal.select();
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(copyVal.value).then(function () {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
}, function () {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
});
|
||||
|
||||
} else {
|
||||
if (document.execCommand('copy', false, null)) {
|
||||
//success info
|
||||
new $.zui.Messager("复制成功", {
|
||||
type: "primary", // 定义颜色主题
|
||||
icon: "ok-sign" // 定义消息图标
|
||||
}).show();
|
||||
console.log("复制成功");
|
||||
} else {
|
||||
//fail info
|
||||
alert("复制失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 复制按钮状态
|
||||
$('#btnLinks, #btnBbscode, #btnMarkDown, #btnHtml, #btnThumb, #btnDel').on('click', function () {
|
||||
var $btn = $(this);
|
||||
$btn.addClass('btn-success load-indicator loading');
|
||||
// 复制按钮状态
|
||||
var $btn = $(loadClass);
|
||||
$btn.addClass('btn-success');
|
||||
// $btn.addClass('btn-success load-indicator loading');
|
||||
$btn.remove('data-toggle data-original-title');
|
||||
$btn.button('loading');
|
||||
// 此处使用 setTimeout 来模拟复杂功能逻辑
|
||||
setTimeout(function () {
|
||||
$btn.removeClass('btn-success load-indicator loading');
|
||||
$btn.removeClass('btn-success');
|
||||
// $btn.removeClass('btn-success load-indicator loading');
|
||||
$btn.button('reset');
|
||||
}, 666);
|
||||
});
|
||||
}
|
||||
|
||||
/** 粘贴上传 2023-01-30 */
|
||||
(function () {
|
||||
document.addEventListener('paste', function (e) {
|
||||
var items = ((e.clipboardData || window.clipboardData).items) || [];
|
||||
console.log(e)
|
||||
var file = null;
|
||||
|
||||
$("#upShowID").addClass("load-indicator loading"); // 增加正在上传状态 2-1
|
||||
if (items && items.length) {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
if (items[i].type.indexOf('image') !== -1) {
|
||||
|
@ -217,109 +60,69 @@ $('#btnLinks, #btnBbscode, #btnMarkDown, #btnHtml, #btnThumb, #btnDel').on('clic
|
|||
}
|
||||
}
|
||||
|
||||
// 未找到图片
|
||||
if (!file) {
|
||||
$.zui.messager.show('粘贴内容非图片!', {
|
||||
icon: 'bell',
|
||||
time: 3000,
|
||||
type: 'danger',
|
||||
placement: 'top'
|
||||
});
|
||||
return;
|
||||
$("#upShowID").removeClass("load-indicator loading"); // 移除正在上传状态 2-2
|
||||
$.zui.messager.show('粘贴内容非图片!', { icon: 'bell', time: 3000, type: 'danger', placement: 'top' }); return;
|
||||
}
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('sign', Date.now());
|
||||
formData.append('sign', new Date().getTime() / 1000 | 0);
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState == 1) {
|
||||
$.zui.messager.show('粘贴上传中...', {
|
||||
icon: 'bell',
|
||||
time: 3000,
|
||||
type: 'primary',
|
||||
placement: 'top'
|
||||
});
|
||||
$(".uploader").addClass("load-indicator loading"); // 增加正在上传状态
|
||||
}
|
||||
|
||||
if (xhr.readyState >= 4) {
|
||||
$.zui.messager.show('粘贴上传中...', {
|
||||
icon: 'bell',
|
||||
time: 3000,
|
||||
type: 'primary',
|
||||
placement: 'top'
|
||||
});
|
||||
$(".uploader").removeClass("load-indicator loading"); // 移除正在上传状态
|
||||
if (xhr.readyState === 1) {
|
||||
$.zui.messager.show('粘贴上传中...', { icon: 'bell', time: 3000, type: 'primary', placement: 'top' });
|
||||
}
|
||||
}
|
||||
|
||||
xhr.onload = function () {
|
||||
var result = JSON.parse(this.responseText);
|
||||
if (result.result === 'success') {
|
||||
document.getElementById("links").innerHTML += result.url + "\r\n";
|
||||
document.getElementById("bbscode").innerHTML += "[img]" + result.url + "[/img]\r\n";
|
||||
document.getElementById("markdown").innerHTML += "![" + result.srcName + "](" + result.url + ")\r\n";
|
||||
document.getElementById("html").innerHTML += '<img src="' + result.url + '" alt="' + result.srcName + '" />\r\n';
|
||||
document.getElementById("thumb").innerHTML += result.thumb + "\r\n";
|
||||
document.getElementById("del").innerHTML += result.del + "\r\n";
|
||||
|
||||
$.zui.messager.show(/** result.srcName + */'粘贴上传成功', {
|
||||
icon: 'bell',
|
||||
time: 4000,
|
||||
type: 'success',
|
||||
placement: 'top'
|
||||
});
|
||||
var obj = JSON.parse(this.responseText);
|
||||
if (obj.code === 200) {
|
||||
$("#links").append(obj.url + "\r\n");
|
||||
$("#bbscode").append("[img]" + obj.url + "[/img]\r\n");
|
||||
$("#markdown").append("![" + obj.srcName + "](" + obj.url + ")\r\n");
|
||||
$("#html").append('<img src="' + obj.url + '" alt="' + obj.srcName + '" />\r\n');
|
||||
$("#thumb").append(obj.thumb + "\r\n");
|
||||
$("#del").append(obj.del + "\r\n");
|
||||
// 上传成功提示 原始文件名称obj.srcName + 提示
|
||||
$.zui.messager.show('粘贴上传成功', { icon: 'bell', time: 4000, type: 'success', placement: 'top' });
|
||||
// 移除正在上传状态 2-3
|
||||
$("#upShowID").removeClass("load-indicator loading");
|
||||
|
||||
try { // 储存上传记录
|
||||
console.log('localStorage ok!');
|
||||
$.zui.store.set(result.srcName, result)
|
||||
console.log('history localStorage success');
|
||||
$.zui.store.set(obj.srcName, obj)
|
||||
} catch (err) {
|
||||
console.log('localStorage failed:' + err);
|
||||
// 存储上传记录失败提示
|
||||
$.zui.messager.show('存储上传记录失败' + err, { icon: 'bell', time: 4000, type: 'danger', placement: 'top' });
|
||||
console.log('history localStorage failed:' + err);
|
||||
}
|
||||
} else {
|
||||
$.zui.messager.show('上传失败...' + result.message, {
|
||||
icon: 'bell',
|
||||
time: 4000,
|
||||
type: 'danger',
|
||||
placement: 'top'
|
||||
});
|
||||
$("#upShowID").removeClass("load-indicator loading"); // 移除正在上传状态 2-4
|
||||
$.zui.messager.show(obj.message, { icon: 'bell', time: 4000, type: 'danger', placement: 'top' });
|
||||
}
|
||||
};
|
||||
|
||||
xhr.onerror = function () {
|
||||
$.zui.messager.show('因网络问题导致的上传失败...', {
|
||||
icon: 'bell',
|
||||
time: 4000,
|
||||
type: 'primary',
|
||||
placement: 'top'
|
||||
});
|
||||
$("#upShowID").removeClass("load-indicator loading"); // 移除正在上传状态 2-5
|
||||
$.zui.messager.show('因网络问题导致的上传失败...', { icon: 'bell', time: 4000, type: 'primary', placement: 'top' });
|
||||
};
|
||||
xhr.open('POST', 'app/upload.php', true);
|
||||
xhr.send(formData);
|
||||
});
|
||||
})();
|
||||
|
||||
// 检测浏览器是否支持cookie
|
||||
if (navigator.cookieEnabled === false) {
|
||||
new $.zui.Messager('浏览器不支持cookie, 无法保存登录信息', {
|
||||
type: 'black',
|
||||
icon: 'bell',
|
||||
time: 4500,
|
||||
placement: 'top'
|
||||
}).show();
|
||||
|
||||
/** 检测浏览器是否支持cookie */
|
||||
if (navigator.cookieEnabled === false) {
|
||||
new $.zui.Messager('浏览器不支持cookie, 无法保存登录信息', { type: 'black', icon: 'bell', time: 4500, placement: 'top' }).show();
|
||||
console.log('浏览器不支持cookie');
|
||||
}
|
||||
|
||||
// 检测浏览器是否支持本地存储
|
||||
/** 检测浏览器是否支持本地存储 */
|
||||
if ($.zui.store.enable === false) {
|
||||
new $.zui.Messager('浏览器不支持本地存储, 无法保存上传历史记录', {
|
||||
icon: 'bell',
|
||||
time: 4000,
|
||||
type: 'primary',
|
||||
placement: 'top'
|
||||
}).show();
|
||||
|
||||
new $.zui.Messager('浏览器不支持本地存储, 无法保存上传历史记录', { icon: 'bell', time: 4000, type: 'primary', placement: 'top' }).show();
|
||||
console.log('浏览器不支持本地存储');
|
||||
}
|
||||
|
||||
|
@ -339,7 +142,6 @@ if ($.zui.store.enable === false) {
|
|||
* myURL.protocol; // = 'http'
|
||||
* myURL.source; // = 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'
|
||||
*/
|
||||
|
||||
function parseURL(url) {
|
||||
var a = document.createElement('a');
|
||||
a.href = url;
|
||||
|
@ -368,7 +170,10 @@ function parseURL(url) {
|
|||
};
|
||||
}
|
||||
|
||||
/** jQuery 读取文件 readTxt('../admin/version.php'); */
|
||||
/**
|
||||
* jQuery 读取文件 readTxt('../admin/version.php');
|
||||
* @param {*} filePath
|
||||
*/
|
||||
function readTxt(filePath = '../admin/version.php') {
|
||||
$.get(filePath, function (data) {
|
||||
var lines = data.split("\n"); //按行读取
|
||||
|
@ -376,4 +181,16 @@ function readTxt(filePath = '../admin/version.php') {
|
|||
console.log(v);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* JS验证是否为URL 这是提取自:npm包 async-validator的源码。
|
||||
* 参考: https://www.cnblogs.com/lanleiming/p/14250497.html
|
||||
* @param {*} str
|
||||
* @returns
|
||||
* @example isUrl('http://www.baidu.com') // true
|
||||
*/
|
||||
function isUrl(str) {
|
||||
var v = new RegExp('^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', 'i');
|
||||
return v.test(str);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
/*! TangBin: image.ready.js http://www.planeart.cn/?p=1121 */
|
||||
!function(n){"use strict";n.zui.imgReady=function(){var n=[],l=null,e=function(){for(var l=0;l<n.length;l++)n[l].end?n.splice(l--,1):n[l]();!n.length&&o()},o=function(){clearInterval(l),l=null};return function(o,r,t,u){var c,i,a,d,f,h=new Image;return h.src=o,h.complete?(r.call(h),void(t&&t.call(h))):(i=h.width,a=h.height,h.onerror=function(){u&&u.call(h),c.end=!0,h=h.onload=h.onerror=null},c=function(){d=h.width,f=h.height,(d!==i||f!==a||d*f>1024)&&(r.call(h),c.end=!0)},c(),h.onload=function(){!c.end&&c(),t&&t.call(h),h=h.onload=h.onerror=null},void(c.end||(n.push(c),null===l&&(l=setInterval(e,40)))))}}()}(jQuery);
|