Compare commits

...

43 Commits
2.4.7 ... 2.5.4

Author SHA1 Message Date
=
6c620feb86 v2.5.4 2022-02-27 08:00:58 +01:00
=
4ee5cfb70e add re 2022-02-27 07:59:03 +01:00
=
4bb8f75cc7 fix table 2022-02-25 06:56:18 +01:00
=
8be373cd8b 增加Token有效期 2022-02-24 18:36:49 +01:00
=
2e9764f1b4 删除多余 2022-02-23 17:46:27 +01:00
=
6ef54dcdcb 修复标题 2022-02-23 04:12:10 +01:00
=
837bdd5e59 v2.4.5 2022-02-22 14:42:19 +01:00
=
6c207090e1 v2.5.3 2022-02-22 11:56:49 +01:00
=
6192830822 v2.5.3 2022-02-22 04:11:25 +01:00
=
ece3262c13 -v2.5.2 2022-02-19 16:15:50 +01:00
=
79079b20e4 v2.5.2 2022-02-19 15:57:33 +01:00
=
d1fb93ca2e v2.5.2 2022-02-19 14:11:08 +01:00
=
4ffba77452 v2.5.1 2022-02-17 17:46:22 +01:00
=
3fbb69957d v2.5.1 2022-02-17 17:13:13 +01:00
=
0ca2d03105 2.5.1 2022-02-15 18:05:06 +01:00
=
5c033a1cf0 2.5.1 2022-02-15 12:49:38 +01:00
=
9a742da3e7 v2.5.1 2022-02-13 16:16:57 +08:00
=
77999a704e v2.5.1 2022-02-13 16:14:46 +08:00
=
dc83ee7adc fix static 2022-02-07 06:38:47 +08:00
=
af0832f110 fix static 2022-02-07 06:20:07 +08:00
=
b149750873 ++ 2022-02-07 05:45:39 +08:00
=
07d8763a77 fix jquery bugs 2022-02-06 15:41:28 +08:00
icret
f352336da0 Merge pull request #18 from icret/whitesource/configure
Configure WhiteSource Bolt for GitHub
2022-02-06 14:52:32 +08:00
whitesource-bolt-for-github[bot]
4016513986 Add .whitesource configuration file 2022-02-06 06:24:01 +00:00
=
9aaf795d7c 增加返回值 2022-02-05 09:23:57 +01:00
=
927d853e9f v2.4.8 2022-02-05 07:41:34 +01:00
=
d97ab41972 v2.4.8 2022-02-04 18:18:15 +01:00
=
910d1fc432 v2.4.8 2022-02-04 17:25:19 +01:00
=
9dda902bc3 v2.4.8 2022-02-04 16:09:44 +01:00
=
94dd498f6a v2.4.8 2022-02-04 13:31:52 +01:00
=
1ecc042e46 v2.4.8 2022-02-04 13:28:33 +01:00
icret
c1affee65f ADD 2022-02-03 11:47:42 +08:00
icret
c2c6eb3a12 v2.4.8 2022-02-02 03:28:06 +08:00
icret
2eee083a66 v2.4.8 2022-02-01 04:18:39 +08:00
icret
317d055781 v2.4.8 2022-02-01 03:51:02 +08:00
icret
a035e68be2 add text 2022-01-30 14:46:29 +08:00
icret
4894981cf3 add 2022-01-30 08:12:41 +08:00
icret
af21e879f9 fixbugs add TimThumb 2022-01-30 08:07:26 +08:00
icret
5655c2034b add tips 2022-01-29 21:08:10 +08:00
icret
94580b453d fix postion 2022-01-28 22:57:54 +08:00
icret
7e8f021bf1 修复开启登录上传后无法上传bug,安装增加user.ini检测 2022-01-28 21:32:29 +08:00
icret
11c8ee4f0b fix header 2022-01-27 23:05:44 +08:00
icret
1751f772cc v2.4.7 2022-01-27 17:39:48 +08:00
50 changed files with 3465 additions and 983 deletions

2
.github/FUNDING.yml vendored
View File

@@ -1 +1 @@
custom: ['https://png.cm/sponsor/index.html']
custom: ['https://png.cm/sponsor/images/wechat.jpg']

12
.whitesource Executable file
View File

@@ -0,0 +1,12 @@
{
"scanSettings": {
"baseBranches": []
},
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure",
"displayMode": "diff"
},
"issueSettings": {
"minSeverityLevel": "LOW"
}
}

120
README.md
View File

@@ -20,7 +20,10 @@
>本人善写bug 发现bug可提交 [issues](https://github.com/icret/EasyImages2.0/issues) 追求稳定请下载 [稳定版](https://github.com/icret/EasyImages2.0/releases)
## 功能支持:
## 目录
[特点](#特点)  [使用注意](#使用注意)  [安装](#安装)  [程序升级](#程序升级)  [安全配置](#安全配置)  [更新日志](#更新日志)  [支持开发者](#支持开发者)  [界面演示](#界面演示)  [兼容](#兼容)  [鸣谢](#鸣谢)  [开源许可](#开源许可)  
## 特点
- [x] 支持仅登录后上传
- [x] 支持设置图片质量
@@ -32,26 +35,26 @@
- [x] 在线管理图片
- [x] 支持网站统计
- [x] 支持设置广告
- [x] 支持图片
- [x] 支持图片
- [x] 支持自定义代码
- [x] 支持上传IP黑白名单
- [x] 支持创建仅上传用户
- [x] 更多支持请安装尝试···
## 使用注意
## 使用注意
1. 请将所有文件赋予`0755``www`权限
2.`PHP`不太熟悉的请不要将图床程序放置于二级目录
3. 请关闭防跨站或删除域名文件夹内的`user.ini`文件 如宝塔面板
4. 网站域名与图片域名必须填写,如果只有一个域名请填写成一样的
5. 第一使用会执行安装程序并生成`install.lock` 不执行安装可以删除`install`目录
5. 第一使用会执行安装程序并生成`install.lock` 不执行安装可以删除`install`目录
6. 第一次访问会检查环境并在`config`目录下生成`EasyImage.lock`
7. 可以使用谷歌浏览器的调试模式查看错误`F12->console`
8. 出现`undefined function imagecreatefromwebp()`是因为GD没安装webp
9. 出现`upload File size exceeds the maximum value` 调整`PHP`上传大小
10. 出现`Warning: is_dir(): open_basedir restriction in effect`解决方法同`3`
11. 出现`Fatal error: Allowed memory size......`主机内存或分配给PHP的内存不够 解决方法百度
12. 不出验证码: 权限问题见问题1/CDN缓存了/开防火墙了
12. 不出验证码: 权限问题见问题1 CDN缓存了/开防火墙了
## 安装
@@ -64,7 +67,7 @@
## 程序升级
- 备份`config`目录和`上传目录`
- 备份`config`(没有增加上传用户和api可以只保留`config.php`文件)目录和`上传目录`
- 将新程序下载至网站目录解压覆盖,然后将备份的文件替换既完成升级
## 安全配置
@@ -94,9 +97,88 @@ $HTTP["url"] =~ "^/(i|public)/" {
fastcgi.server = ()
}
```
- 或者参考:[https://blog.png.cm/981.html](https://blog.png.cm/981.html)
- 或者参考:[https://blog.png.cm/996.html](https://blog.png.cm/996.html)
<details><summary><mark><font color=darkred>点击查看2.0版更新日志</font></mark></summary>
## 更新日志
<details><summary><mark>点击查看2.0版更新日志</mark></summary>
* 2022-2-21 v2.5.4 Developing
- 增加Token有效期
- 增加回收图片按钮
- 增加加密删除回收站
- 修复广场标题
* 2022-2-21 v2.5.3
- 增加图床数据开放
- 增加自定义服务条款
- 升级 Viewer.js 到 v1.10.4
- 将页面选择记录从cookie改为本地存储
- 修复实时生成缩略图导致的页面布局异常
- 优化显示代码
- 不出意外今年将只修复bug和兼容问题
* 2022-2-19 v2.5.2
- 增加简繁体转换
- 增加管理页面记录当前操作页
- 修复一处暴露路径bug
* 2022-2-13 v2.5.1
- 增加异步执行鉴黄
- 取消检测imagick扩展
- 修复可能导致检测弹窗弹出失败
* 2022-2-7 v2.5.0
- 修复静态文件调用失败
* 2022-2-6 v2.4.9
- 修复静态文件引用
* 2022-2-6 v2.4.9
- 修复flash和silverlight路径引用(>IE9不影响)
- markdown html alt值改为源文件名
- 升级jquery-3.4.1至3.6.0
- 调整了静态文件位置
* 2022-2-5 v2.4.8
- 调整缩略图内存至128M
- 修复无可疑图片时显示错误
- 修复转换为webp时会复制一份bug
- 修复开启登录上传后无法上传的bug
- 插件检测的敏感信息转移到管理目录
- 增加安装时检测.user.ini
- 增加检测鉴黄接口是否可以正确访问
- 增加异步处理文件,上传完毕后处理速度变快了
- 增加 [nsfwjs](https://github.com/infinitered/nsfwjs) 接口方式检测违规图片
- 作者测试时用的`docker`搭建 `docker`地址:[zengdawei/nsfw_restful_api
](https://hub.docker.com/r/zengdawei/nsfw_restful_api)
- 使用注意 程序期望nsfwjs返回json 并且如下格式:
```json
[
{
"className": "Drawing",
"probability": 0.824431836605072
},
{
"className": "Hentai",
"probability": 0.16360442340373993
},
{
"className": "Neutral",
"probability": 0.007620695047080517
},
{
"className": "Porn",
"probability": 0.004154415801167488
},
{
"className": "Sexy",
"probability": 0.00018858206749428064
}
]
```
- 增加WordPress上大名鼎鼎的实时缩略图生成TimThumb
- TimeThumb为本图床修改版,会缓存到缓存文件夹方便下次调用
* 2022-1-27 v2.4.7
- 优化页面排版
@@ -110,7 +192,6 @@ $HTTP["url"] =~ "^/(i|public)/" {
- 更换验证码库并不再区分大小写
- 修复一处有概率暴露图片绝对路径的bug
* 2022-1-22 v2.4.6
- 视图优化
- 删除重复内容
@@ -252,7 +333,7 @@ RewriteRule config/(.*).(php)$ [F]
deny all;
}
```
- - 或者参考:https://blog.png.cm/992.html https://blog.png.cm/939.html
- - 或者参考https://blog.png.cm/939.html
- 一些精简
* 2021-4-14 v2.0.2.1 Dev1
@@ -310,7 +391,7 @@ RewriteRule config/(.*).(php)$ [F]
- ~~支持删除自定义删除图片(仅管理员)~~
</details>
<details><summary><mark><font color=darkred>与1.6.4版本差别</font></mark></summary>
<details><summary><mark>与1.6.4版本差别</mark></summary>
##### 不建议再使用 [EasyImage 1.6.4版本](https://github.com/icret/easyImages)
@@ -333,19 +414,18 @@ RewriteRule config/(.*).(php)$ [F]
## 支持开发者
|支付宝支持|微信支持|
|:----:|:----:|
|![支付宝支持](./public/images/alipay.jpg)|![微信支持](./public/images/wechat.jpg)|
|![支付宝支持](https://png.cm/sponsor/images/alipay.jpg)|![微信支持](https://png.cm/sponsor/images/wechat.jpg)|
## 界面演示
![简单图床 - 上传界面](https://i1.100024.xyz/i/2020/12/31/ulmtho.png)
![简单图床 - 广场界面](https://i1.100024.xyz/i/2020/12/31/2.png)
![简单图床 - 后台界面](https://i1.100024.xyz/i/2020/12/31/3.png)
![简单图床 - 统计界面](https://i1.100024.xyz/i/2020/12/31/4.png)
![简单图床 - 上传界面](https://blog.png.cm/usr/uploads/2022/02/674074848.png)
![简单图床 - 广场界面](https://blog.png.cm/usr/uploads/2022/02/3053540273.png)
![简单图床 - 后台界面](https://blog.png.cm/usr/uploads/2022/02/2657944724.png)
![简单图床 - 统计界面](https://blog.png.cm/usr/uploads/2022/02/1305032567.png)
## 兼容
- 最低`PHP 5.6`,推荐`PHP 7.0`及以上版本需要PHP支持`Fileinfo,iconv,zip,mbstring,openssl`扩展,如果缺失会导致无法上传/删除图片
- 文件上传视图提供文件列表管理和文件批量上传功能,允许拖拽(需要`HTML5`支持)来添加上传文件,支持上传大图片,优先使用`HTML5`旧得浏览器自动使用`Flash和Silverlight`的方式兼容
## 鸣谢
@@ -355,4 +435,8 @@ RewriteRule config/(.*).(php)$ [F]
## 开源许可
- [GPL-2.0](https://github.com/icret/EasyImages2.0/blob/master/LICENSE)
- Copyright © 2018 EasyImage dev By [Icret](https://github.com/icret)
- Copyright © 2018 EasyImage dev By [Icret](https://github.com/icret)
* have fun!
[![Stargazers over time](https://starchart.cc/icret/EasyImages2.0.svg)](https://github.com/icret/EasyImages2.0/stargazers)

File diff suppressed because it is too large Load Diff

View File

@@ -80,18 +80,17 @@ if (is_array($char_data)) {
<div class="col-md-12 col-xs-12">
<div class="col-xs-3 alert alert-success autoshadow">今日上传
<hr />
<?php printf("%u 张", preg_replace('/\D/s', '', $char_data['number'][0])); ?>
<?php echo read_total_json('todayUpload'); ?>
</div>
<div class="col-xs-3 alert alert-success autoshadow">昨日上传
<hr />
<?php printf("%u 张", preg_replace('/\D/s', '', $char_data['number'][1])); ?>
<?php echo read_total_json('yestUpload'); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
累计上传
<hr />
<?php printf("%u 张", read_total_json('filenum')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
缓存文件
<hr />
@@ -108,7 +107,12 @@ if (is_array($char_data)) {
<?php printf("%d 个", read_total_json('dirnum')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
占用存储
总空间
<hr />
<?php echo getDistUsed(disk_total_space('.')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
已用空间
<hr />
<?php echo getDistUsed(disk_total_space('.') - disk_free_space('.')); ?>
</div>
@@ -117,6 +121,16 @@ if (is_array($char_data)) {
<hr />
<?php echo getDistUsed(disk_free_space('.')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
图片占用
<hr />
<?php echo read_total_json('usage_space'); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
当前版本
<hr />
<?php echo $config['version']; ?>
</div>
</div>
<div class="col-md-12 col-xs-12">
<hr />

View File

@@ -113,7 +113,7 @@ if (isset($_GET['login'])) {
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label title="选不选都记得你想退出就点击退出才可以哦!">
<label title="选不选都记得你,想退出就点击退出才可以哦!">
<input type="checkbox" checked="checked"> 记住我
</label>
</div>
@@ -125,7 +125,7 @@ if (isset($_GET['login'])) {
</div>
</div>
</form>
<script src="<?php static_cdn(); ?>/public/static/md5.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/md5/md5.min.js"></script>
<script>
function md5_post() {
var password = document.getElementById('password');
@@ -135,5 +135,4 @@ if (isset($_GET['login'])) {
return true;
}
</script>
<?php
require_once APP_ROOT . '/application/footer.php';
<?php require_once APP_ROOT . '/application/footer.php';

View File

@@ -1,98 +1,20 @@
<?php
/*
* 登录页面
* 使用条款页面
*/
require_once __DIR__ . '/../application/function.php';
require_once APP_ROOT . '/application/header.php';
?>
<div class="container">
<div class="row">
<div class="col-xs-3">
<ul class="nav nav-tabs nav-stacked">
<li class="active">
<a href="#Terms" data-target="#tab3Content1" data-toggle="tab">服务条款</a>
</li>
<li>
<a href="#Privacy" data-target="#tab3Content2" data-toggle="tab">隐私政策</a>
</li>
<li>
<a href="#DMCA" data-target="#tab3Content3" data-toggle="tab">DMCA</a>
</li>
</ul>
</div>
<div class="col-xs-9">
<div class="tab-content col-xs-9">
<div class="tab-pane fade active in" id="tab3Content1">
<h4>服务条款</h4>
<hr>
<p>访问我们网站除主页和本“条款”页面以外的任何页面,即表示您同意这些使用条款和我们的隐私政策。如果您不同意,请不要使用我们的网站。</p>
<ol>
<li>您使用我们的网站进行除简单访问/查看之外的任何事情(即上传、下载、评论等),不仅构成您的同意,而且构成您的电子签名,这意味着您受这些条款的合同约束,并且通过我们的隐私政策。</li>
<li>我们保留在使用过多带宽或以其他方式滥用系统的用户帐户上禁用直接链接的权利。
<li>请勿上传儿童色情内容或威胁、骚扰、诽谤或鼓励非法行为的材料。不要使用本网站作为内容交付网络。如果你这样做(我们将成为法官),或者如果你做了任何违法的事情,除了我们可能拥有的任何其他合法权利之外,我们将禁止你以及你从中盗链的网站,删除你的所有图片,报告如有必要,您可以向当局报告,并阻止您查看本网站上托管的任何图像。我们是认真的。</li>
<li>用户必须同意遵守适用于其所在地的所有法律,包括版权和商标法。不允许使用侵犯版权或商标的图片。如果有人对您提出侵权索赔,您将被要求删除受版权保护的文件,直到问题得到解决。如果本网站的参与者之间存在争议,我们没有义务参与其中。</li>
<li>您可以匿名上传图像,并与您的朋友、家人、在线站点以及社交网络在线共享。</li>
<li>如果您在我们的网站上看到任何不应该出现的内容,因为它违反了我们的政策或出于任何其他原因,请通过电子邮件联系告知我们</li>
<li>声明通知中的信息准确无误,否则会受到伪证处罚。为此,请包括以下声明: “我发誓,通知中的信息准确无误,并且我是(版权)所有者或被授权代表专有权的所有者行事,在作伪证的处罚下涉嫌侵权”。</li>
</ol>
<p>如果发生调查,本网站承诺与任何和所有法律机构合作。</p>
</div>
<div class="tab-pane fade" id="tab3Content2">
<h4>隐私政策</h4>
<hr>
<h4>一般: </h4>
<p>当您访问本网站或使用本政策中进一步概述的服务(“服务”)时,本网站致力于保护您的隐私。作为使用本网站服务的条件,您同意向本网站提供某些个人信息。该信息包括但不限于: 电子邮件地址和您计算机的唯一 IP 地址(如果有)、财务信息(您的 Paypal 帐户使用的电子邮件地址)和人口统计信息(例如,邮政编码、邮政编码、家乡、性别、购买历史信息和年龄以及不是您计算机独有的 IP 地址)。请注意,我们不会在本网站的任何地方故意收集 13 岁以下儿童的联系信息或财务信息。请定期查看本隐私政策,因为我们可能会不时对其进行更新。本隐私政策的最后修订日期为 2021年10月25日。您每次访问本网站、使用服务或向我们提供信息时即表示您当时接受本隐私政策中描述的做法。您同意通过使用本网站您明确并肯定地同意我们使用和披露您提供的信息并同意接收电子邮件如下面的隐私政策所述。</p>
<h4>隐私政策变更: </h4>
<p>随着新功能添加到网站或我们纳入用户的建议,本政策可能会随着时间的推移进行修订。如果我们打算以与我们收集信息时声明的方式大不相同的方式使用或披露您的个人身份信息,您将可以选择我们是否以这种新方式使用或披露您的信息。我们还将在我们的网站显着位置发布隐私政策已修订的通知,以便您可以随时查看我们收集的信息、我们将如何使用该信息以及在何种条件下我们将向任何人披露这些信息。</p>
<h4>如何使用您的信息: </h4>
<p>我们使用联系信息(即您的电子邮件地址)来帮助我们有效地执行帐户任务(更改密码、找回丢失的密码)、提供您请求的服务、执行质量保证、销售分析和其他业务分析,并就相关事宜与您联系与您向我们下的任何订单。除非满足任何法律、法规、政府要求或司法命令,否则不会将您的财务信息用于其他用途。当您通过本网站进行购买或在本网站注册时,您将向我们提供一个电子邮件地址,我们或这些服务提供商可能会出于本段所述目的与您联系。</p>
<h4>联系您获取优惠和促销信息: </h4>
<p>您同意,考虑到我们提供的服务的使用,允许我们使用您的个人信息向您发送营销和促销材料。我们也可能向您发送宣传第三方产品的营销和宣传材料。我们不会出租或出售您的个人信息以供第三方使用。这些材料可能包括但不限于: 向您提供有关如何使用服务的附加信息的时事通讯,以及来自我们或第三方的商品和服务的促销优惠。</p>
<h4>人口统计信息的使用: </h4>
<p>我们可能会使用您的人口统计信息进行业务分析或根据您的兴趣定制网站和通讯。我们可能会与广告商和其他第三方共享匿名的汇总人口统计信息,以便他们可以针对适当的受众定制广告和通信。在本隐私政策允许我们共享您的联系信息或财务信息的任何时候,我们也可能会同时共享您的人口统计信息。</p>
<h4>向政府实体披露: </h4>
<p>当我们确定此类披露是遵守法律、与执法部门合作或寻求执法协助或保护我们或网站其他访问者或用户的利益或安全时,我们可能会披露特定的联系信息。服务。此外,如果我们发生合并、收购、合并、剥离或破产,您的联系信息可能会传递给第三方。</p>
<h4>Cookie 和其他网站跟踪数据的使用: </h4>
<p>Cookies : “cookie”是我们保存在您计算机硬盘上的包含非个人信息的小文件。这些 cookie 有助于让您更快地访问您已经访问过的页面。它们还允许您个性化您的页面,并优化您在我们网站上的体验。我们还使用 cookie 来帮助我们了解有多少人访问了我们的网站、他们访问了我们的哪些网页以及他们在那里停留的时间。此信息可帮助我们确定我们的哪些网络功能非常成功以及哪些网站可能需要改进。您可以通过在浏览器的首选项或选项菜单中指明这一点来禁用计算机上的 cookie。大多数浏览器会自动接受 cookie但允许您禁用它们。禁用 cookie 可能会阻止您正确使用服务或访问网站。</p>
<h4>会话 ID: </h4>
<p>“会话 ID”允许我们在多个网页请求中识别特定用户。此会话 ID 会尽可能保存在您的 cookie 文件中。如果 cookie 未启用,或者如果用户的 Internet 浏览器程序不支持 cookie则我们将在请求的网页中放置会话 ID。这使最终用户不必为每个网页请求不断地重新输入某些信息例如帐户名和密码。每当用户关闭其 Internet 浏览器时,此会话 ID 就会过期。</p>
<h4>网站跟踪、报告: </h4>
<p>我们的许多网页还包含特殊的电子图像(称为“单像素 gif”或“gif”使我们能够仅收集非个人身份的流量统计数据和有关我们网站访问者的其他汇总信息。IMX.to通过自身或第三方使用此技术收集和积累匿名数据帮助我们了解和分析访问我们网站的人的体验并连同您提供的其他信息定制您未来的访问并改进我们的网站网站。例如我们捕获有关所用浏览器类型、操作系统软件例如 Windows 95 与 98 或 Macintosh、cookie 偏好(用户是否打开或关闭它们)和搜索引擎关键字(哪些关键字做了什么)的数据。访问者用于访问我们的网站)。我们还记录了访问次数,所采取的路径,以及在我们网站内的站点和页面上花费的时间。请记住,这些信息都不是个人身份信息,我们只将这些信息分发给我们的内部员工以及与我们签署了保密协议的合作伙伴。我们与合作伙伴共享的任何信息都反映了整个网站或 Internet 使用趋势,而不是个别信息。</p>
<h4>IP地址: </h4>
<p>每次您访问本网站时,我们都会自动收集您的 IP 地址和您来自的网页。为了为您管理和优化站点并诊断我们站点的问题,我们使用您的 IP 地址来帮助识别您的身份并收集有关您的广泛人口统计信息。</p>
<h4>来自其他网站的信息: </h4>
<p>我们可能会放置指向其他方运营的其他网站的链接,并且可能会不时在我们的促销电子邮件中包含指向第三方网站的信息和链接。其中一些其他网站包含我们的品牌名称和商标以及我们拥有的其他知识产权;其他人没有。当您点击这些链接并访问这些其他网站时,无论它们是否包含我们的品牌名称、商标和其他知识产权,您都需要注意,我们不控制这些其他网站或这些其他网站”商业惯例,并且本隐私政策不适用于这些其他网站。因此,这些其他网站的运营商可能会收集有关您的不同类型的信息,并且可能以不同于我们在网站上收集信息的方式使用和披露该信息。我们鼓励您查看他们的隐私政策,并提醒您我们不对他们的行为负责。</p>
<h4>信息存储: </h4>
<p>您理解并同意我们在服务器上存储和处理您的信息,并且通过向我们提供任何数据,您同意将此类信息传输到网站服务器。当您从我们帐户中删除文件时,您与该文件之间将不再存在任何链接。删除的文件可能会缓存在我们服务器中以节省带宽,以防其他人请求它们。</p>
<h4>如何联系我们: </h4>
<p>如果您对您提交给我们这个隐私政策或信息有任何疑问,您可以通过邮件方式联系我们</p>
</div>
<div class="tab-pane fade" id="tab3Content3">
<h4>数字千年版权法案</h4>
<hr>
<p>要向我们提交版权侵权通知,您需要发送书面通知,其中包含《数字千年版权法》第 512(c)(3) 条要求和规定的信息。</p>
<p>要撰写适当的 DMCA 通知,请说明以下信息: </p>
<ol>
<li>表明自己是您认为受到侵犯的版权作品或专有权的所有者,或代表此类所有者行事的人,并提供物理签名(纸质形式时)或电子签名(电子形式时) )。</li>
<li>指明您认为受到侵权的受版权保护的作品,或者如果有大量作品受到侵权,请提供作品的代表性清单。</li>
<li>通过在我们站点上提供包含这些材料的 Web URL确定侵犯您的版权作品的材料的位置。请不要发送附加的图像、pdf 或其他文件格式的文件,而只能发送包含我们网址的列表。在信函正文中提供所有 URL 是帮助我们快速处理您的请求的最佳方式。</li>
<li>说明您的联系信息,包括您的姓名、街道地址、电话号码和电子邮件地址。如果您代表版权所有者行事,请同时说明您与版权所有者的关系(例如律师、供应商、代理人)。</li>
<li>声明您“真诚地相信上述材料的使用未经版权所有者、其代理人或法律授权”。</li>
<li>声明通知中的信息准确无误,否则会受到伪证处罚。为此,请包括以下声明: “我发誓,通知中的信息准确无误,并且我是(版权)所有者或被授权代表专有权的所有者行事,在作伪证的处罚下涉嫌侵权”。</li>
<li>请用中文书写,所有电子邮件是任何其他语言都将被忽略。</li>
<li>要行使您的 DMCA 权利,您必须将适当的 DMCA 通知发送至我们的指定代理至电子邮件。</li>
</ol>
<p>未能包含上述所有信息可能会导致 DMCA 通知的处理延迟。请注意,根据 DMCA 第 512(f) 条,任何故意歪曲材料或活动侵权的人都可能需要承担责任。</p>
<p>如果我们收到声称侵犯版权的适当通知,它将通过删除或禁止访问声称侵权或成为侵权活动主题的材料迅速做出回应。请注意,我们不一定会向报告者发送有关删除操作的确认。</p>
</div>
</div>
</div>
</div>
</div>
require_once __DIR__ . '/../application/header.php';
if (empty($config['terms'])) {
echo '<div class="alert alert-danger">Terms not set!<br />使用条款未设置</div>';
} else {
echo $config['terms'];
}
echo "
<script>
// Title
document.title = "服务条款 - <?php echo $config['title']; ?>";
document.title = '使用条款 - " . $config['title'] . "';
</script>
<?php
";
require_once APP_ROOT . '/application/footer.php';
require_once __DIR__ . '/../application/footer.php';

View File

@@ -70,58 +70,74 @@ if (is_array($char_data)) {
</div>
</div>
<div class="col-md-12 col-xs-12">
<div class="col-md-2 col-xs-2 alert alert-success autoshadow">今日上传
<div class="col-xs-3 alert alert-success autoshadow">今日上传
<hr />
<?php printf("%u 张", preg_replace('/\D/s', '', $char_data['number'][0])); ?>
<?php echo read_total_json('todayUpload'); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-success autoshadow">昨日上传
<div class="col-xs-3 alert alert-success autoshadow">昨日上传
<hr />
<?php printf("%u 张", preg_replace('/\D/s', '', $char_data['number'][1])); ?>
<?php echo read_total_json('yestUpload'); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-primary autoshadow">
<div class="col-xs-3 alert alert-primary autoshadow">
累计上传
<hr />
<?php printf("%u 张", read_total_json('filenum')); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-primary autoshadow">
<div class="col-xs-3 alert alert-primary autoshadow">
缓存文件
<hr />
<?php printf("%u 张", getFileNumber(APP_ROOT . $config['path'] . 'thumbnails/')); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-primary autoshadow">
<div class="col-xs-3 alert alert-primary autoshadow">
可疑图片
<hr />
<?php printf("%u 张", getFileNumber(APP_ROOT . $config['path'] . 'suspic/')); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-primary autoshadow">
<div class="col-xs-3 alert alert-primary autoshadow">
文件夹
<hr />
<?php printf("%d 个", read_total_json('dirnum')); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-primary autoshadow">
占用存储
<div class="col-xs-3 alert alert-primary autoshadow">
总空间
<hr />
<?php echo getDistUsed(disk_total_space('.')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
已用空间
<hr />
<?php echo getDistUsed(disk_total_space('.') - disk_free_space('.')); ?>
</div>
<div class="col-md-2 col-xs-2 alert alert-primary autoshadow">
<div class="col-xs-3 alert alert-primary autoshadow">
剩余空间
<hr />
<?php echo getDistUsed(disk_free_space('.')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
图片占用
<hr />
<?php echo read_total_json('usage_space'); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
当前版本
<hr />
<?php echo $config['version']; ?>
</div>
</div>
<div class="col-md-12 col-xs-12">
<div class="col-md-6 col-xs-12">
<h4>文件统计(张)</h4>
<h4>文件统计(张)</h4>
<canvas id="myBarChart" width="960" height="400"></canvas>
</div>
<div class="col-md-6 col-xs-12">
<h4 class=" col-md-offset-2">硬盘统计:GB</h4>
<h4 class=" col-md-offset-2">硬盘统计:(GB)</h4>
<canvas id="diskPieChart" width="960" height="400"></canvas>
</div>
</div>
<div class="col-sm-12 col-xs-12" style="text-align: center;">
<hr />
<h4>最近30上传趋势与空间占用上传/张 占用/MB</h4>
<h4>最近30上传趋势与空间占用(上传/张 占用/MB)</h4>
<h4 class="text-danger hidden-lg">手机请启用横屏浏览</h4>
<canvas id="myChart" width="1080" height="200"></canvas>
</div>

View File

@@ -58,8 +58,8 @@ function check_api($token)
exit(json_encode($reJson, JSON_UNESCAPED_UNICODE));
}
if (!in_array($token, $tokenList)) {
// Token错误 Token错误
if (!in_array($tokenList[$token], $tokenList)) {
// Token 是否存在
$reJson = array(
"result" => 'failed',
'code' => 202,
@@ -67,4 +67,14 @@ function check_api($token)
);
exit(json_encode($reJson, JSON_UNESCAPED_UNICODE));
}
if ($tokenList[$token]['expired'] < time()) {
// Token 是否过期
$reJson = array(
"result" => 'failed',
'code' => 203,
'message' => 'Token Expired',
);
exit(json_encode($reJson, JSON_UNESCAPED_UNICODE));
}
}

View File

@@ -2,7 +2,6 @@
require_once __DIR__ . '/../application/function.php';
require_once APP_ROOT . '/api/function_API.php';
require_once APP_ROOT . '/application/class.upload.php';
require_once APP_ROOT . '/application/WaterMask.php';
require_once APP_ROOT . '/config/api_key.php';
header('Access-Control-Allow-Origin:*');
@@ -29,7 +28,7 @@ if ($handle->uploaded) {
// 允许上传的mime类型
$handle->allowed = array('image/*');
// 文件命名
$handle->file_new_name_body = imgName($handle->file_src_name_body) . '_' . getID($token);
$handle->file_new_name_body = imgName($handle->file_src_name_body) . '_' . $tokenList[$token]['id'];
// 最大上传限制
$handle->file_max_sizes = $config['maxSize'];
// 最大宽度
@@ -43,65 +42,21 @@ if ($handle->uploaded) {
// 转换图片为指定格式
$handle->image_convert = $config['imgConvert'];
/* 等比例缩减图片 放到前端了
if ($config['imgRatio']) {
$handle->image_resize = true;
$handle->image_x = $config['image_x'];
$handle->image_y = $config['image_y'];
}
*/
// 存储图片路径:images/201807/
$handle->process('../' . config_path());
// 设置水印
if ($config['watermark'] > 0) {
switch ($config['watermark']) {
case 1: // 文字水印 过滤gif
if (isAnimatedGif($handle->file_src_pathname) === 0) {
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => $config['waterText'],
# 水印显示位置
'pos' => $config['waterPosition'],
# 不指定name(会覆盖原图也就是保存成thumb.jpeg)
'name' => $handle->file_dst_pathname,
'font' => $config['textFont'],
'fontSize' => $config['textSize'],
'color' => $config['textColor'],
];
Imgs::setWater($handle->file_dst_pathname, $arr);
}
break;
case 2: // 图片水印
if (isAnimatedGif($handle->file_src_pathname) === 0) {
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => $config['waterImg'],
# 水印显示位置
'pos' => $config['waterPosition'],
# 不指定name(会覆盖原图也就是保存成thumb.jpeg)
'name' => $handle->file_dst_pathname,
];
Imgs::setWater($handle->file_dst_pathname, $arr);
}
break;
default:
echo $handle->error;
break;
}
}
// 图片完整相对路径:/i/2021/05/03/k88e7p.jpg
if ($handle->processed) {
header('Content-type:text/json');
// 上传成功后返回json数据
$imageUrl = $config['imgurl'] . config_path() . $handle->file_dst_name;
$pathIMG = config_path() . $handle->file_dst_name;
$imageUrl = $config['imgurl'] . $pathIMG;
// 关闭上传后显示加密删除链接
if ($config['show_user_hash_del']) {
// 判断PHP版本启用删除
if (PHP_VERSION >= '7') {
$delUrl = $config['domain'] . '/application/del.php?hash=' . urlHash(config_path() . $handle->file_dst_name, 0);
$delUrl = $config['domain'] . '/application/del.php?hash=' . urlHash($pathIMG, 0);
} else {
$delUrl = "Sever PHP version lower 7.0";
}
@@ -110,11 +65,12 @@ if ($handle->uploaded) {
}
$reJson = array(
"result" => "success",
"code" => 200,
"url" => $imageUrl,
"thumb" => $config['domain'] . '/application/thumb.php?img=' . config_path() . $handle->file_dst_name . '&width=258&height=258',
"del" => $delUrl,
"result" => "success",
"code" => 200,
"url" => $imageUrl,
"srcName" => $handle->file_src_name_body,
"thumb" => $config['domain'] . '/application/thumb.php?img=' . $pathIMG,
"del" => $delUrl,
);
echo json_encode($reJson, JSON_UNESCAPED_UNICODE);
$handle->clean();
@@ -129,14 +85,30 @@ if ($handle->uploaded) {
exit(json_encode($reJson, JSON_UNESCAPED_UNICODE));
}
// 后续处理
require_once APP_ROOT . '/application/process.php';
// 日志
if ($config['upload_logs']) {
@write_log(config_path() . $handle->file_dst_name, $handle->file_src_name, $handle->file_dst_pathname, $handle->file_src_size);
/** 后续处理 */
require APP_ROOT . '/application/process.php';
// 使用fastcgi_finish_request操作
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
// 普通模式鉴黄
@process_checkImg($imageUrl);
// 日志
if ($config['upload_logs']) @write_log($pathIMG, $handle->file_src_name, $handle->file_dst_pathname, $handle->file_src_size);
// 水印
@water($handle->file_dst_pathname);
// 压缩
@compress($handle->file_dst_pathname);
} else {
// 普通模式鉴黄
@process_checkImg($imageUrl);
// 日志
if ($config['upload_logs']) write_log($pathIMG, $handle->file_src_name, $handle->file_dst_pathname, $handle->file_src_size);
// 水印
@water($handle->file_dst_pathname);
// 压缩
@compress($handle->file_dst_pathname);
}
// 压缩|鉴黄
process(config_path() . $handle->file_dst_name, $handle->file_dst_pathname);
unset($handle);
}

74
api/public.php Executable file
View File

@@ -0,0 +1,74 @@
<?php
/**
* 图床公共信息查询APi
* 2022年2月22日11:41:38
* @author Icret
*/
require_once '../application/function.php';
require_once '../application/chart.php';
// 检查是否开启查询
if ($config['public'] == 0) die('开放数据接口已关闭!');
// 获得get值
$show = (empty($_GET['show'])) ? die('没有参数!') : htmlspecialchars($_GET['show']);
// 检查是否在允许范围内
if (!in_array($show, $config['public_list'])) die('没有权限或参数错误!');
// 根据请求返回值
switch ($show) {
// 统计时间
case 'time':
echo read_total_json('total_time');
break;
// 今日上传
case 'today':
echo read_total_json('todayUpload');
break;
// 昨日上传
case 'yesterday':
echo read_total_json('yestUpload');
break;
// 总空间
case 'total_space':
echo getDistUsed(disk_total_space('.'));
break;
// 已用空间
case 'used_space':
echo getDistUsed(disk_total_space('.') - disk_free_space('.'));
break;
// 剩余空间
case 'free_space':
echo getDistUsed(disk_free_space('/'));
break;
// 图床使用空间
case 'image_used':
echo read_total_json('usage_space');
break;
// 文件数量
case 'file':
echo read_total_json('filenum');
break;
// 文件夹数量
case 'dir':
echo read_total_json('dirnum');
break;
case 'month':
foreach (read_chart_total()['number'] as $value)
echo $value;
break;
default:
return read_chart_total();
break;
}

1416
application/TimThumb.php Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,6 @@
<?php
require_once __DIR__ . '/function.php';
require_once __DIR__ . '/total_files.php';
/**
* 统计最近一个月上传文件数与空间占用

View File

@@ -1,115 +1,85 @@
<?php
require_once __DIR__ . '/function.php';
// 跳转安装
if (!is_file(APP_ROOT . '/install/install.lock') and is_file(APP_ROOT . '/install/install.php')) {
exit('<script type="text/javascript">window.location.href="' . get_whole_url('/') . '/install/index.php"</script>');
}
/**
* 检测弹窗内容
*/
global $config;
// 扩展检测
$expand = array('fileinfo', 'iconv', 'gd', 'mbstring', 'openssl',);
foreach ($expand as $val) {
if (!extension_loaded($val)) {
echo '
<script>
new $.zui.Messager("扩展:' . $val . '- 未安装,可能导致图片上传失败! 请尽快修复。", {
type: "black", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
</script>
';
}
}
// 检测是否更改默认域名
if (strstr('localhost|127.0.0.1', $_SERVER['HTTP_HOST'])) {
echo '
<script>
new $.zui.Messager("请修改默认域名,可能会导致网站访问异常! ", {type: "black" // 定义颜色主题
}).show();
</script>
';
}
// 检测是否修改默认密码
if ($config['password'] === 'e6e061838856bf47e1de730719fb2609') {
echo '
<script>
new $.zui.Messager("请修改默认密码,否则会有泄露风险! ", {type: "warning" // 定义颜色主题
}).show();
</script>
';
}
// 上部内容
if (!is_file(APP_ROOT . '/config/EasyIamge.lock')) {
echo '
<div class="modal fade" id="myModal-1">
<div class="modal-dialog">
<div class="modal-content">
if (file_exists(APP_ROOT . '/config/EasyIamge.lock')) return; // 查询锁定弹窗文件是否存在
file_put_contents(APP_ROOT . '/config/EasyIamge.lock', '安装环境检测锁定文件,如需再次展示请删除此文件!', FILE_APPEND | LOCK_EX);
?>
<div class="modal fade" id="myModal-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
<i class="icon icon-heart"> </i><a href="https://blog.png.cm/846.html" target="_blank">简单图床-EasyImage2.0</a> 安装环境检测</h4>
<i class="icon icon-heart"> </i><a href="https://blog.png.cm/902.html" target="_blank">简单图床-EasyImage2.0</a> 安装环境检测
</h4>
</div>
<div class="modal-body">
<h4>说明:</h4>
<h5>1. 建议使用<font color="red">PHP7.0</font>及以上版本</h5>
<h5>2. 上传失败大部分是由于<font color="red">upload_max_filesize、post_max_size、文件权限</font>设置不正确</h5>
<h5>3. 本程序主要用到<font color="red">Fileinfo、GD、Openssl</font>扩展,如果缺失会导致无法访问管理面板以及上传/删除图片。</h5>
<h5>1. 建议使用<span style="color:red">PHP7.0</span>及以上版本;</h5>
<h5>2. 上传失败大部分是由于<span style="color:red">upload_max_filesize、post_max_size、文件权限</span>设置不正确;</h5>
<h5>3. 本程序主要用到<span style="color:red">Fileinfo、GD、Openssl</span>扩展,如果缺失会导致无法访问管理面板以及上传/删除图片。</h5>
<hr />
<h4>EasyImage2.0 基础检测:</h4>
当前PHP版本:<font style="color:green">' . phpversion() . '</font><br/>';
echo '<font color="green">upload_max_filesize</font> - PHP上传最大值:' . ini_get('upload_max_filesize');
echo '<br /><font color="green">post_max_size</font> - POST上传最大值:' . ini_get('post_max_size') . '<br />';
// 扩展检测
$expand = array('fileinfo', 'gd', 'openssl', 'imagick');
foreach ($expand as $val) {
if (extension_loaded($val)) {
echo '
<font color="green">' . $val . "</font> - 已安装
<br />";
} else {
echo "
<script language='javascript'>alert('$val - 未安装')</script>";
echo '
<font color="red">' . $val . " - 未安装</font>
<br />";
}
}
// 文件权限检测
$quanxian = substr(base_convert(fileperms("file.php"), 10, 8), 3);
if (IS_WIN) {
echo '
<font style="color:green">file.php 文件可执行</font><br/>
<font style="color:green">/i 目录可读写</font><br/>
';
}
if (!IS_WIN) {
if ($quanxian !== '755' and !is_writable(APP_ROOT . '/i/')) {
echo '
<p style="color:red">file.php 文件不可执行</font>><br/>
<p style="color:red">/i 目录可读写</font>><br/>
';
} else {
echo '
<font style="color:green">file.php 文件可执行</font><br/>
<font style="color:green">/i 目录可读写</font><br/>
';
}
}
echo '</div>
<p>当前PHP版本:<sapn style="color:green"><?php echo phpversion() ?></sapn>
</p>
<p>upload_max_filesize - PHP上传最大值:<sapn style="color:green"><?php echo ini_get('upload_max_filesize'); ?></sapn>
</p>
<p>post_max_size - POST上传最大值:<sapn style="color:green"><?php echo ini_get('post_max_size'); ?></sapn>
</p>
<?php
// 扩展检测 取消检测imagick扩展
$expand = array('fileinfo', 'gd', 'openssl');
foreach ($expand as $val) {
if (extension_loaded($val)) {
echo '
<p style="color:green">' . $val . " - 已安装</p>";
} else {
echo "<script language='javascript'>alert('$val - 未安装')</script>";
echo '<p style="color:red">' . $val . " - 未安装</p>";
}
}
// 文件权限检测
$quanxian = substr(base_convert(fileperms(APP_ROOT . "/application/upload.php"), 10, 8), 3);
if (IS_WIN) {
echo '
<p style="color:green">upload.php 文件可执行</p>
<p style="color:green">/i 目录可读写</p>
';
}
if (!IS_WIN) {
if ($quanxian !== '755' and !is_writable(APP_ROOT . '/i/')) {
echo '
<p style="color:red">upload.php 文件不可执行</font>>
<p style="color:red">/i 目录可读写</font>>
';
} else {
echo '
<p style="color:green">upload.php 文件可执行</p>
<p style="color:green">/i 目录可读写</p>
';
}
}
?>
</div>
<div class="modal-footer" style="text-align:left">
<p class="text-primary">安装环境检测弹窗仅在第一次访问主页时展示弹出后会在<code>config</code>目录下生成<code>EasyIamge.lock</code>文件,如需再次弹出请删除<code>EasyIamge.lock</code>文件。</p>
<p class="text-primary">刷新或按<kbd>ESC</kbd>关闭安装环境检测弹窗。</p>
<p class="text-primary">安装环境检测弹窗仅在第一次访问主页时展示,弹出后会在<code>config</code>目录下生成<code>EasyIamge.lock</code>文件,如需再次弹出请删除<code>EasyIamge.lock</code>文件。</p>
<p class="text-primary">刷新或按<kbd>ESC</kbd>关闭安装环境检测弹窗。</p>
</div>
</div>
</div>
</div>
<script>
$("#myModal-1").modal({
keyboard: true,
moveable: true,
backdrop: "static",//点击空白处不关闭对话框
show: true
})
alert("初次打开会检测环境配置请仔细看!!");
</script>
';
file_put_contents(APP_ROOT . '/config/EasyIamge.lock', '安装环境检测锁定文件,如需再次展示请删除此文件!', FILE_APPEND | LOCK_EX);
clearstatcache();
}
<script>
$("#myModal-1").modal({
keyboard: true,
moveable: true,
backdrop: "static", //点击空白处不关闭对话框
show: true
})
alert("初次打开会检测环境配置,请仔细看!!");
</script>

92
application/check_admin.inc.php Executable file
View File

@@ -0,0 +1,92 @@
<?php
// 扩展检测
$expand = array('fileinfo', 'iconv', 'gd', 'mbstring', 'openssl',);
foreach ($expand as $val) {
if (!extension_loaded($val)) {
echo '
<script>
new $.zui.Messager("扩展:' . $val . '- 未安装,可能导致图片上传失败! 请尽快修复。",{
type: "black", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
</script>
';
}
}
// 检测是否更改默认域名
if (strstr('localhost|127.0.0.1', $_SERVER['HTTP_HOST'])) {
echo '
<script>
new $.zui.Messager("请修改默认域名,可能会导致网站访问异常! ",{
type: "black" // 定义颜色主题
}).show();
</script>
';
}
// 检测是否修改默认密码
if ($config['password'] === 'e6e061838856bf47e1de730719fb2609') {
echo '
<script>
new $.zui.Messager("请修改默认密码,否则会有泄露风险! ",{
type: "warning", // 定义颜色主题
time:7000
}).show();
</script>
';
}
// 检测监黄接口是否可以访问
if ($configp['checkImg'] !== 0) {
if ($config['checkImg'] == 1) {
if (!@IP_URL_Ping('api.moderatecontent.com', 80, 1)) {
echo '
<script>
new $.zui.Messager("moderatecontent 鉴黄接口无法ping通! ",{
type: "warning" // 定义颜色主题
}).show();
</script>
';
}
}
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 '
<script>
new $.zui.Messager("' . $ip . $port . ' 鉴黄接口无法ping通! ",{
type: "warning" // 定义颜色主题
}).show();
</script>
';
}
} else {
if (!@IP_URL_Ping($ip, 80, 1)) {
echo '
<script>
new $.zui.Messager("' . $ip . ' 鉴黄接口无法ping通! ",{
type: "warning" // 定义颜色主题
}).show();
</script>
';
}
}
}
}
// 检测是否存在.user.ini
if (file_exists(APP_ROOT . '/.user.ini')) {
echo '
<script>
new $.zui.Messager("请关闭防跨目录读写或删除.user.ini文件 ",{
type: "danger", // 定义颜色主题
time:10000
}).show();
</script>
';
}

View File

@@ -95,7 +95,7 @@ class Imgcompress
private function _saveImage($dstImgName)
{
if (empty($dstImgName)) return false;
$allowImgs = array('.jpg', '.jpeg', '.png', '.bmp', '.wbmp', '.gif','webp'); //如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
$allowImgs = array('.jpg', '.jpeg', '.png', '.bmp', '.wbmp', '.gif','.webp'); // 如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
$dstExt = strrchr($dstImgName, ".");
$sourseExt = strrchr($this->src, ".");
if (!empty($dstExt)) $dstExt = strtolower($dstExt);

View File

@@ -39,14 +39,57 @@ if (empty($_REQUEST)) {
if (isset($_GET['hash'])) {
$delHash = $_GET['hash'];
$delHash = urlHash($delHash, 1);
getDel($delHash, 'hash');
// getDel($delHash, 'hash');
if ($config['image_recycl']) {
// 如果开启回收站则进入回收站
checkImg($delHash, 3, 'recycle/');
echo '
<script>
new $.zui.Messager("删除成功", {
type: "success", // 定义颜色主题
icon: "ok-sign" // 定义消息图标
}).show();
</script>
';
} else {
// 否则直接删除
getDel($delHash, 'url');
}
}
// 检查登录后再处理url删除请求
if (is_who_login('admin')) {
// 删除
if (isset($_GET['url'])) {
getDel($_GET['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 '
@@ -59,7 +102,6 @@ if (is_who_login('admin')) {
window.setTimeout("window.location=\'/../admin/index.php \'",3000);
</script>
';
//header("refresh:2;url=".$config['domain']."/admin/index.php");
}
}

View File

@@ -1,6 +1,8 @@
<?php if ($config['ad_bot']) echo $config['ad_bot_info']; // 底部广告
<?php
defined('APP_ROOT') ?: exit; // 禁止访问
if ($config['ad_bot']) echo $config['ad_bot_info']; // 底部广告
?>
<footer class="text-muted small col-md-12" style="text-align: center;">
<footer class="col-md-12 text-muted small" style="text-align: center;">
<hr>
<!-- 对话框HTML -->
<div class="modal fade" id="myModal">
@@ -18,20 +20,18 @@
</div>
</div>
</div>
<?php if (!empty($config['footer'])) echo $config['footer']; // 页脚信息
?>
<?php /** 页脚信息 */ if (!empty($config['footer'])) echo $config['footer']; ?>
<p>
© 2018-<?php echo date("Y"); ?>
<a href="https://png.cm/" target="_blank"> EasyImage</a>
<a href="https://github.com/icret/EasyImages2.0" target="_blank" rel="nofollow"><?php echo $config['version']; ?></a>
<a href="https://blog.png.cm" target="_blank"> By Icret</a>
<a href="https://github.com/icret/EasyImages2.0" target="_blank" rel="nofollow"><?php echo $config['version']; ?></a> By
<a href="https://blog.png.cm" target="_blank">Icret</a>
<a href="/admin/terms.php" target="_blank"> DMCA</a>
<!-- 二维码对话框触发按钮 -->
<a href="#" data-position="center" data-moveable="inside" data-moveable="true" data-toggle="modal" data-target="#myModal" title="使用手机扫描二维码访问"><i class="icon icon-qrcode hidden-xs inline-block"></i></a>
<?php
// 登录与退出
if (is_who_login('admin')||is_who_login('guest')) {
if (is_who_login('admin') || is_who_login('guest')) {
echo '<a href="' . $config['domain'] . '/admin/index.php?login=logout" title="退出账号"><i class="icon icon-signout"></i></a>';
} else {
echo '<a href="' . $config['domain'] . '/admin/index.php" title="账号登录"><i class="icon icon-user"></i></a>';
@@ -39,14 +39,20 @@
?>
</p>
</footer>
<?php
// 自定义代码
if ($config['customize']) echo $config['customize'];
// 环境检测
checkEnv($config['checkEnv']);
?>
<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>
// NProgress
NProgress.start();
NProgress.done();
// 导航状态
$('.nav-pills').find('a').each(function() {
if (this.href == document.location.href) {
$(this).parent().addClass('active'); // this.className = 'active';
}
});
// js 获取当前网址二维码
var qrcode = new QRCode(document.getElementById("qrcode"), {
text: window.location.href,
@@ -57,9 +63,11 @@ checkEnv($config['checkEnv']);
correctLevel: QRCode.CorrectLevel.H
});
// NProgress
NProgress.start();
NProgress.done();
<?php /** 简繁转换 */ if ($config['language'] == 1) : ?>
$.getScript("<?php static_cdn(); ?>/public/static/i18n/jquery.s2t.js", function() { //加载成功后,并执行回调函数
$('*').s2t();
});
<?php endif; ?>
// console
console.log("%cEasyImage2.0", "background: rgba(252,234,187,1);background: -moz-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%,rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: -webkit-gradient(left top, right top, color-stop(0%, rgba(252,234,187,1)), color-stop(12%, rgba(175,250,77,1)), color-stop(28%, rgba(0,247,49,1)), color-stop(39%, rgba(0,210,247,1)), color-stop(51%, rgba(0,189,247,1)), color-stop(64%, rgba(133,108,217,1)), color-stop(78%, rgba(177,0,247,1)), color-stop(87%, rgba(247,0,189,1)), color-stop(100%, rgba(245,22,52,1)));background: -webkit-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: -o-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: -ms-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: linear-gradient(to right, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fceabb', endColorstr='#f51634', GradientType=1 );font-size:2.34em;font-weight:bold")

View File

@@ -93,6 +93,7 @@ function config_path($path = null)
if (!is_writable($img_path)) {
@chmod($img_path, 0755);
}
return $img_path;
}
@@ -138,7 +139,7 @@ function imgName($source = null)
return sha1(microtime());
break;
default:
return base_convert(date('His') . mt_rand(1024, 9999), 10, 36); // 将上传时间+随机数转换为36进制 例vx77yu
return base_convert(date('His') . mt_rand(1001, 9999), 10, 36); // 将上传时间+随机数转换为36进制 例vx77yu
}
}
@@ -268,7 +269,7 @@ function getFile($dir)
*/
function get_file_by_glob($dir_fileName_suffix, $type = 'list')
{
global $config;
$glob = glob($dir_fileName_suffix, GLOB_BRACE);
// 获取所有文件
@@ -276,6 +277,14 @@ function get_file_by_glob($dir_fileName_suffix, $type = 'list')
foreach ($glob as $v) {
if (is_file($v)) $res[] = basename($v);
}
// 排序
if ($res) {
switch ($config['showSort']) {
case 1:
$res = array_reverse($res);
break;
}
}
}
if ($type == 'number') {
@@ -353,7 +362,7 @@ function getActive($url)
{
$arr = $_SERVER['SCRIPT_NAME'];
if (strpos($arr, $url)) {
return 'class="active;"';
return ' class="active"';
}
}
@@ -464,8 +473,8 @@ function is_who_login($user)
function checkEnv($mode)
{
// 初始化安装
if (!file_exists(APP_ROOT . '/install/install.lock') and file_exists(APP_ROOT . '/install/install.php')) {
exit('<script type="text/javascript">window.location.href="' . get_whole_url('/') . '/install/index.php"</script>');
if (!is_file(APP_ROOT . '/install/install.lock') and is_file(APP_ROOT . '/install/install.php')) {
echo '<script type="text/javascript">window.location.href="' . get_whole_url('/') . '/install/index.php"</script>';
}
if ($mode) {
@@ -581,7 +590,6 @@ function deldir($dir)
}
}
/**
* 图片监黄curl 访问网站并返回解码过的json信息
* @param $img string 图片url
@@ -604,6 +612,7 @@ function moderatecontent_json($img, $url = null)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36');
$output = curl_exec($ch);
curl_close($ch);
@@ -612,42 +621,140 @@ function moderatecontent_json($img, $url = null)
}
/**
* 检查图片是否违规
* @param $imageUrl string 图片url
* 使用curl方式实现get或post请求
* @param $url 请求的url地址
* @param $data 发送的post数据 如果为空则为get方式请求
* return 请求后获取到的数据
*/
function checkImg($imageUrl)
function nsfwjs_json($url, $data = '')
{
global $config;
$response = moderatecontent_json($imageUrl);
if ($response['rating_index'] == 3 or $response['predictions']['adult'] > $config['checkImg_value']) { // (1 = everyone, 2 = teen, 3 = adult)
//$old_path = APP_ROOT . parse_url($imageUrl)['path']; // 提交网址中的文件路径 /i/2021/10/29/p8vypd.png
$old_path = APP_ROOT . str_replace($config['imgurl'], '', $imageUrl); // 提交网址中的文件路径 /i/2021/10/29/p8vypd.png
$name = date('Y_m_d') . '_' . basename($imageUrl); // 文件名 2021_10_30_p8vypd.png
$new_path = APP_ROOT . $config['path'] . 'suspic/' . $name; // 新路径含文件名
$cache_dir = APP_ROOT . $config['path'] . 'suspic/'; // suspic路径
if (empty($config['nsfwjs_url'])) {
exit;
}
if (is_dir($cache_dir)) { // 创建suspic目录并移动
rename($old_path, $new_path);
} else {
mkdir($cache_dir, 0777, true);
rename($old_path, $new_path);
$ch = curl_init();
$params[CURLOPT_URL] = $config['nsfwjs_url'] . $url; //请求url地址
$params[CURLOPT_HEADER] = false; //是否返回响应头信息
$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
$params[CURLOPT_TIMEOUT] = 30; //超时时间
if (!empty($data)) {
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = $data;
}
$params[CURLOPT_SSL_VERIFYPEER] = false; //请求https时设置,还有其他解决方案
$params[CURLOPT_SSL_VERIFYHOST] = false; //请求https时,其他方案查看其他博文
curl_setopt_array($ch, $params); //传入curl参数
$content = curl_exec($ch); //执行
curl_close($ch); //关闭连接
$content = json_decode($content, true);
return $content;
}
/**
* 检查图片是否违规
* @param $imageUrl string 图片url
*/
function checkImg($imageUrl, $type = 1, $dir = 'suspic/')
{
global $config;
/** # 使用moderatecontent */
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;
}
}
/** # 使用nsfwjs */
if ($type == 2) {
/**
* probability概率
* className类型
*
* 上传图片后,总共会返回 5 个维度的数值来鉴别该图片的尺度:
*
* 绘画Drawing—— 无害的艺术,或艺术绘画;
* 变态Hentai—— 色情艺术,不适合大多数工作环境;
* 中立Neutral—— 一般,无害的内容;
* 色情Porn—— 不雅的内容和行为,通常涉及生殖器;
* 性感Sexy—— 不合时宜的挑衅内容。
*
* 当porn评分超过>=0.6左右,就几乎是一张带有色情性质的图片了。
*/
$file = nsfwjs_json($imageUrl);
// 将获取的值删除className后组建数组
for ($i = 0; $i <= count($file); $i++) {
if ($file[$i]['className'] == 'Drawing') {
$res['Drawing'] = $file[$i]['probability'];
}
if ($file[$i]['className'] == 'Hentai') {
$res['Hentai'] = $file[$i]['probability'];
}
if ($file[$i]['className'] == 'Neutral') {
$res['Neutral'] = $file[$i]['probability'];
}
if ($file[$i]['className'] == 'Porn') {
$res['Porn'] = $file[$i]['probability'];
}
if ($file[$i]['className'] == 'Sexy') {
$res['Sexy'] = $file[$i]['probability'];
}
}
// 测试数组是否正确
// foreach ($file as $k => $v) {
// foreach ($v as $k1 => $v1) {
// echo $k1 . '=>' . $v1 . '<br/>';
// }
// }
if ($res['Sexy'] * 100 > $config['checkImg_value'] or $res['Porn'] * 100 > $config['checkImg_value']) {
$bad_pic = true;
}
}
// 移入回收站
if ($type == 3) {
$bad_pic = true;
$dir = 'recycle/';
}
/** # 如果违规则移动图片到违规文件夹 */
if ($bad_pic == true) {
$old_path = APP_ROOT . str_replace($config['imgurl'], '', $imageUrl); // 提交网址中的文件路径 /i/2021/10/29/p8vypd.png
$name = date('Y_m_d') . '_' . basename($imageUrl); // 文件名 2021_10_30_p8vypd.png
$new_path = APP_ROOT . $config['path'] . $dir . $name; // 新路径含文件名
$suspic_dir = APP_ROOT . $config['path'] . $dir; // suspic路径
if (!is_dir($suspic_dir)) { // 创建suspic目录并移动
mkdir($suspic_dir, 0777, true);
}
rename($old_path, $new_path);
}
}
/**
* 还原被审查的图片
* @param $name string 要还原的图片
*/
function re_checkImg($name)
function re_checkImg($name, $dir = 'suspic/')
{
global $config;
$fileToPath = str_replace('_', '/', $name); // 将图片名称还原为带路径的名称eg:2021_11_03_pbmn1a.jpg =>2021/11/03/pbmn1a.jpg
$now_path_file = APP_ROOT . $config['path'] . 'suspic/' . $name; // 当前图片绝对位置 */i/suspic/2021_10_30_p8vypd.png
$to_file = APP_ROOT . $config['path'] . $fileToPath; // 要还原图片的绝对位置 */i/2021/10/30/p8vypd.png
rename($now_path_file, $to_file);
$fileToPath = str_replace('_', '/', $name); // 将图片名称还原为带路径的名称eg:2021_11_03_pbmn1a.jpg =>2021/11/03/pbmn1a.jpg
$now_path_file = APP_ROOT . $config['path'] . $dir . $name; // 当前图片绝对位置 */i/suspic/2021_10_30_p8vypd.png
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); // 移动文件
return true;
}
}
/**
@@ -659,15 +766,15 @@ function creat_thumbnail_images($imgName)
require_once __DIR__ . '/class.thumb.php';
global $config;
$old_img_path = APP_ROOT . config_path() . $imgName; // 获取要创建缩略图文件的绝对路径
$cache_path = APP_ROOT . $config['path'] . 'thumbnails/'; // cache目录的绝对路径
$old_img_path = APP_ROOT . config_path() . $imgName; // 获取要创建缩略图文件的绝对路径
$cache_path = APP_ROOT . $config['path'] . 'thumbnails/'; // cache目录的绝对路径
if (!is_dir($cache_path)) { // 创建cache目录
if (!is_dir($cache_path)) { // 创建cache目录
mkdir($cache_path, 0777, true);
}
if (!isAnimatedGif($old_img_path)) { // 仅针对非gif创建图片缩略图
if (!isAnimatedGif($old_img_path)) { // 仅针对非gif创建图片缩略图
$new_imgName = APP_ROOT . $config['path'] . 'thumbnails/' . date('Y_m_d') . '_' . $imgName; // 缩略图缓存的绝对路径
Thumb::out($old_img_path, $new_imgName, 258, 258); // 保存缩略图
Thumb::out($old_img_path, $new_imgName, 258, 258); // 保存缩略图
}
}
@@ -681,16 +788,16 @@ function return_thumbnail_images($url)
global $config;
$cache_image_file = str_replace($config['imgurl'], '', $url);
if (isAnimatedGif(APP_ROOT . $cache_image_file)) { // 仅读取非gif的缩略图
return $url; // 如果是gif则直接返回url
if (isAnimatedGif(APP_ROOT . $cache_image_file)) { // 仅读取非gif的缩略图
return $url; // 如果是gif则直接返回url
} else {
$cache_image_file = str_replace($config['path'], '', $cache_image_file); // 将网址中的/i/去除
$cache_image_file = str_replace('/', '_', $cache_image_file); // 将文件的/转换为_
$isFile = APP_ROOT . $config['path'] . 'thumbnails/' . $cache_image_file; // 缓存文件的绝对路径
if (file_exists($isFile)) { // 缓存文件是否存在
$cache_image_file = str_replace($config['path'], '', $cache_image_file); // 将网址中的/i/去除
$cache_image_file = str_replace('/', '_', $cache_image_file); // 将文件的/转换为_
$isFile = APP_ROOT . $config['path'] . 'thumbnails/' . $cache_image_file; // 缓存文件的绝对路径
if (file_exists($isFile)) { // 缓存文件是否存在
return $config['imgurl'] . $config['path'] . 'thumbnails/' . $cache_image_file; // 存在则返回缓存文件
} else {
return $url; // 不存在直接返回url
return $url; // 不存在直接返回url
}
}
}
@@ -705,7 +812,7 @@ function get_online_thumbnail($imgUrl)
global $config;
if ($config['thumbnail']) {
$imgUrl = str_replace($config['imgurl'], '', $imgUrl);
return $config['domain'] . '/application/thumb.php?img=' . $imgUrl . '&width=258&height=258';
return $config['domain'] . '/application/thumb.php?img=' . $imgUrl;
} else {
return $imgUrl;
}
@@ -780,13 +887,12 @@ function creat_thumbnail_by_list($imgUrl)
Thumb::out($abPathName, $new_imgName, 258, 258);
// 输出缩略图
// return $new_imgName;
return $imgUrl;
return $new_imgName;
// return $imgUrl;
}
}
}
/**
* 获取当前页面完整URL地址
* https://www.php.cn/php-weizijiaocheng-28181.html
@@ -954,3 +1060,21 @@ function checkIP($ipNow = null, $ipList = null, $model = false)
return true;
}
}
/**
* 测试IP或者url是否可以ping通
* @param $host string ip或网址
* @param $port int 端口
* @param $timeout float 过期时间
* @return bool true|false
*/
function IP_URL_Ping($host, $port, $timeout)
{
$errno = 444;
$errstr = 'fSockOpen 错误';
$fP = fSockOpen($host, $port, $errno, $errstr, $timeout);
if (!$fP) {
return false;
}
return true;
}

View File

@@ -1,7 +1,4 @@
<?php
require_once __DIR__ . '/function.php';
require_once APP_ROOT . '/application/total_files.php';
?>
<?php require_once __DIR__ . '/function.php'; ?>
<!DOCTYPE html>
<html lang="zh-cn">
@@ -10,65 +7,44 @@ require_once APP_ROOT . '/application/total_files.php';
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit" />
<meta name="force-rendering" content="webkit" />
<meta name="author" content="Icret EasyImage2.0">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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 echo $config['domain']; ?>/favicon.ico" type="image/x-icon" />
<link rel="dns-prefetch" href="<?php echo $config['imgurl']; ?>" />
<link rel="dns-prefetch" href="<?php echo $config['static_cdn_url']; ?>" />
<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">
<link href="<?php static_cdn(); ?>/public/static/zui/lib/uploader/zui.uploader.min.css" rel="stylesheet">
<link href="<?php static_cdn(); ?>/public/static/nprogress.min.css" rel="stylesheet">
<script src="<?php static_cdn(); ?>/public/static/zui/lib/jquery/jquery-3.4.1.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/zui/js/zui.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/qrcode.min.js"></script>
<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/lib/clipboard/clipboard.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/nprogress.min.js"></script>
<script 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>
<![endif]-->
<?php /** 自定义代码 */ if ($config['customize']) echo $config['customize']; ?>
</head>
<body class="container">
<?php
if ($config['ad_top']) echo $config['ad_top_info']; ?>
<?php if ($config['ad_top']) echo $config['ad_top_info']; ?>
<div class="page-header">
<ul class="nav nav-pills">
<li <?php echo getActive('index'); ?>>
<a href="<?php echo $config['domain']; ?>">
<i class="icon icon-home"></i> 首页
</a>
</li>
<?php
// 关闭广场非登录状态不显示广场导航
if ($config['showSwitch'] || is_who_login('admin'))
echo '
<li ' . getActive('list') . '>
<a href="' . $config['domain'] . '/application/list.php">
<i class="icon icon-th"></i> 广场 <span class="label label-badge label-success">' . get_file_by_glob(APP_ROOT . config_path(), 'number') . '</span>
</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')) echo '
<li><a href="' . $config['domain'] . '/application/list.php"><i class="icon icon-th"></i> 广场<span class="label label-badge label-primary">' . get_file_by_glob(APP_ROOT . config_path(), 'number') . '</span></a></li>';
// 登陆状态显示设置页面
if (is_who_login('admin')) {
echo '
<li ' . getActive('admin.inc') . ';><a href="' . $config['domain'] . '/admin/admin.inc.php' . '">
<i class="icon icon-cogs"></i> 设置</a>
</li>
';
echo '
<li><a href="' . $config['domain'] . '/admin/admin.inc.php' . '"><i class="icon icon-cogs"></i> 设置</a></li>';
// 登陆状态下开启统计页面与导航
if ($config['chart_on'])
echo '
<li ' . getActive('chart') . '><a href="' . $config['domain'] . '/admin/chart.php' . '">
<i class="icon icon-pie-chart"></i> 统计</a>
</li>
';
}
?>
if ($config['chart_on']) echo '
<li><a href="' . $config['domain'] . '/admin/chart.php' . '"><i class="icon icon-pie-chart"></i> 统计</a>
</li>';
} ?>
</ul>
</div>
<!-- 顶部导航栏END -->

View File

@@ -87,7 +87,7 @@ clearstatcache();
</div>
</div>
</div>
<script src="<?php static_cdn(); ?>/public/static/exif.js"></script>
<script src="<?php static_cdn(); ?>/public/static/exif/exif.js"></script>
<script src="<?php static_cdn(); ?>/public/static/EasyImage.js"></script>
<script>
// 获取图片长宽
@@ -143,7 +143,7 @@ clearstatcache();
});
}
// 更改网页标题
document.title = "图片<?php echo basename($img); ?>的Exif信息 - <?php echo $config['title']; ?>"
document.title = "图片<?php echo basename($img); ?>的详细信息 - <?php echo $config['title']; ?>"
</script>
<?php
include_once __DIR__ . "/footer.php";

View File

@@ -1,63 +1,10 @@
<?php
require_once __DIR__ . '/header.php';
<?php require_once __DIR__ . '/header.php'; ?>
echo '<div class="col-md-12">';
if (!$config['showSwitch'] && !is_who_login('admin')) {
echo '<div class="alert alert-info">管理员关闭了预览哦~~</div>';
} else {
$path = isset($_GET['date']) ? $_GET['date'] : date('Y/m/d/'); // 获取指定目录
$path = preg_replace("/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s", "", trim($path)); // 过滤非日期,删除空格
$keyNum = isset($_GET['num']) ? $_GET['num'] : $config['listNumber']; // 获取指定浏览数量
$keyNum = preg_replace("/[\W]/", "", trim($keyNum)); // 过滤非数字,删除空格
// $fileArr = getFile(APP_ROOT . config_path($path)); // 获取当日上传列表
$fileType = isset($_GET['search']) ? '*.' . preg_replace("/[\W]/", "", $_GET['search']) : '*.*'; // 按照图片格式
$fileArr = get_file_by_glob(APP_ROOT . config_path($path) . $fileType, 'list'); // 获取当日上传列表
echo '
<ul id="dowebok">
<div class="cards listNum">';
if ($fileArr[0]) {
foreach ($fileArr as $key => $value) {
if ($key < $keyNum) {
$imgUrl = $config['imgurl'] . config_path($path) . $value;
echo '
<div class="col-md-4 col-sm-6 col-lg-3">
<div class="card">
<li><img data-image="' . creat_thumbnail_by_list($imgUrl) . '" src="../public/images/loading.svg" data-original="' . $imgUrl . '" alt="简单图床-EasyImage"></li>
<div class="bottom">
<a href="' . $imgUrl . '" target="_blank"><i class="icon icon-picture" title="打开原图" style="margin-left:10px;"></i></a>
<a href="#" class="copy" data-clipboard-text="' . $imgUrl . '" title="复制文件" style="margin-left:10px;"><i class="icon icon-copy"></i></a>
<a href="/application/info.php?img=' . $imgUrl . '" title="Exif信息" target="_blank" style="margin-left:10px;"><i class="icon icon-info-sign"></i></a>
<a href="' . $config['domain'] . '/application/del.php?url=' . $imgUrl . '" target="_blank" title="删除文件" style="margin-left:10px;"><i class="icon icon-trash"></i></a>
<label style="margin-left:10px;" class="text-primary"><input type="checkbox" style="margin: left 200px;" id="url" name="checkbox" value="' . $imgUrl . '" > 选择</label>
</div>
</div>
</div>
';
}
}
echo '</div>';
} else {
echo '<div class="alert alert-danger">今天还没有上传的图片哟~~ <br />快来上传第一张吧~!</div>';
}
echo '</ul>';
}
// 当前日期全部上传
$allUploud = isset($_GET['date']) ? $_GET['date'] : date('Y/m/d/');
$allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number');
// 组合url
@$httpUrl = array('date' => $path, 'num' => getFileNumber(APP_ROOT . config_path($path)));
?>
</div>
<script src="<?php static_cdn(); ?>/public/static/lazyload.js"></script>
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/viewjs/viewer.min.css">
<script src="<?php static_cdn(); ?>/public/static/viewjs/viewer.min.js"></script>
<link href="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.css" rel="stylesheet">
<script src="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.js"></script>
<link rel="stylesheet" href="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.css">
<style>
/** 图片列表*/
@media screen and (min-width:960px) {
.listNum img {
width: 258px;
@@ -72,15 +19,6 @@ $allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number')
}
}
.card .bottom {
width: 100%;
position: absolute;
left: 0;
bottom: 0px;
background-color: rgba(0, 0, 0, 0.5);
color: white;
}
/** 返回顶部*/
* {
list-style: none;
@@ -127,7 +65,87 @@ $allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number')
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: 10px;
}
img {
cursor: pointer;
transition: all 0.6s;
}
img:hover {
transform: scale(1.5);
position: relative;
z-index: 100;
}
.bottom-bar {
width: 100%;
position: absolute;
left: 0;
bottom: 0px;
background-color: rgba(0, 0, 0, 0.5);
}
</style>
<div class="col-md-12">
<?php
if (!$config['showSwitch'] && !is_who_login('admin')) {
echo '<div class="alert alert-info">管理员关闭了预览哦~~</div>';
} else {
$path = isset($_GET['date']) ? $_GET['date'] : date('Y/m/d/'); // 获取指定目录
$path = preg_replace("/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s", "", trim($path)); // 过滤非日期,删除空格
$keyNum = isset($_GET['num']) ? $_GET['num'] : $config['listNumber']; // 获取指定浏览数量
$keyNum = preg_replace("/[\W]/", "", trim($keyNum)); // 过滤非数字,删除空格
// $fileArr = getFile(APP_ROOT . config_path($path)); // 获取当日上传列表
$fileType = isset($_GET['search']) ? '*.' . preg_replace("/[\W]/", "", $_GET['search']) : '*.*'; // 按照图片格式
$fileArr = get_file_by_glob(APP_ROOT . config_path($path) . $fileType, 'list'); // 获取当日上传列表
echo '
<ul id="viewjs">
<div class="cards listNum">';
if ($fileArr[0]) {
foreach ($fileArr as $key => $value) {
if ($key < $keyNum) {
$imgUrl = $config['imgurl'] . config_path($path) . $value;
echo '
<div class="col-md-4 col-sm-6 col-lg-3">
<div class="card">
<li><img src="../public/images/loading.svg" data-image="' . creat_thumbnail_by_list($imgUrl) . '" data-original="' . $imgUrl . '" alt="简单图床-EasyImage"></li>
<div class="bottom-bar">
<a href="' . $imgUrl . '" target="_blank"><i class="icon icon-picture" data-toggle="tooltip" title="原图" style="margin-left:10px;"></i></a>
<a href="#" class="copy" data-clipboard-text="' . $imgUrl . '" data-toggle="tooltip" title="复制" style="margin-left:10px;"><i class="icon icon-copy"></i></a>
<a href="/application/info.php?img=' . $imgUrl . '" data-toggle="tooltip" title="信息" target="_blank" style="margin-left:10px;"><i class="icon icon-info-sign"></i></a>
<a href="' . $config['domain'] . '/application/del.php?recycle_url=' . $imgUrl . '" target="_blank" data-toggle="tooltip" title="回收" style="margin-left:10px;"><i class="icon icon-undo"></i></a>
<a href="' . $config['domain'] . '/application/del.php?url=' . $imgUrl . '" target="_blank" data-toggle="tooltip" title="删除" style="margin-left:10px;"><i class="icon icon-trash"></i></a>
<label style="margin-left:10px;" class="text-primary"><input type="checkbox" style="margin: left 200px;" id="url" name="checkbox" value="' . $imgUrl . '"> 选择</label>
</div>
</div>
</div>
';
}
}
echo '</div>';
} else {
echo '<div class="alert alert-danger">今天还没有上传的图片哟~~ <br />快来上传第一张吧~!</div>';
}
echo '</ul>';
}
// 当前日期全部上传
$allUploud = isset($_GET['date']) ? $_GET['date'] : date('Y/m/d/');
$allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number');
// 组合url
@$httpUrl = array('date' => $path, 'num' => getFileNumber(APP_ROOT . config_path($path)));
?>
</div>
<div class="col-md-12">
<hr />
<div class="col-md-8 col-xs-12" style="padding-bottom:5px">
@@ -146,7 +164,8 @@ $allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number')
<a class="btn btn-mini" onclick="opcheckboxed('checkbox', 'checkall')">全选</a>
<a class="btn btn-mini" onclick="opcheckboxed('checkbox', 'reversecheck')">反选</a>
<a class="btn btn-mini" onclick="opcheckboxed('checkbox', 'uncheckall')">取消</a>
<a class="btn btn-mini" onclick="fun()">删除</a>
<a class="btn btn-mini" onclick="recycle_img()">回收</a>
<a class="btn btn-mini" onclick="delete_img()">删除</a>
</div>
</div>
</div>
@@ -194,11 +213,19 @@ $allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number')
<div style="opacity:0;display: block;" class="level-2"></div>
<div class="level-3"></div>
</div>
<script src="<?php static_cdn(); ?>/public/static/lazyload/lazyload.js"></script>
<script src="<?php static_cdn(); ?>/public/static/viewjs/viewer.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.js"></script>
<script>
//viewjs
var viewer = new Viewer(document.getElementById('dowebok'), {
// tips提示
$('[data-toggle="tooltip"]').tooltip({
placement: 'top',
tipClass: 'tooltip-primary'
});
// viewjs
new Viewer(document.getElementById('viewjs'), {
url: 'data-original',
backdrop: true
});
// 复制url
@@ -235,40 +262,78 @@ $allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number')
}
}
}
//获取所有的 checkbox 属性的 input标签
function fun() {
confirm('确认要删除?\n* 删除文件夹后将无法恢复!');
obj = document.getElementsByName("checkbox");
check_val = [];
for (k in obj) {
//判断复选框是否被选中
if (obj[k].checked)
//获取被选中的复选框的值
check_val.push(obj[k].value);
console.log(check_val);
// 回收图片
function recycle_img() {
var r = confirm("确认要放入回收站?\n* 可在可疑图片中恢复!")
if (r == true) {
obj = document.getElementsByName("checkbox");
check_val = [];
for (k in obj) {
//判断复选框是否被选中
if (obj[k].checked)
//获取被选中的复选框的值
check_val.push(obj[k].value);
console.log(check_val);
}
$.post("./post_del.php", {
'recycle_url_array': check_val
}, );
new $.zui.Messager("放入回收站成功", {
type: "success", // 定义颜色主题
icon: "ok-sign" // 定义消息图标
}).show();
// 延时2秒刷新
window.setTimeout(function() {
window.location.reload();
}, 1500)
} else {
new $.zui.Messager("取消回收", {
type: "primary", // 定义颜色主题
icon: "info-sign" // 定义消息图标
}).show();
}
}
// 删除图片
function delete_img() {
var r = confirm("确认要删除?\n* 删除文件夹后将无法恢复!")
if (r == true) {
obj = document.getElementsByName("checkbox");
check_val = [];
for (k in obj) {
//判断复选框是否被选中
if (obj[k].checked)
//获取被选中的复选框的值
check_val.push(obj[k].value);
console.log(check_val);
}
$.post("./post_del.php", {
'del_url_array': check_val
},
function(data) {
if (data.search('success') > 0) {
new $.zui.Messager("删除成功", {
type: "success", // 定义颜色主题
icon: "ok-sign" // 定义消息图标
}).show();
// 延时2秒刷新
window.setTimeout(function() {
window.location.reload();
}, 1500)
} else {
new $.zui.Messager("删除失败 请登录后再删除!", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
// 延时2s跳转
window.setTimeout("window.location=\'/../admin/index.php \'", 2000);
}
});
} else {
new $.zui.Messager("取消删除", {
type: "primary", // 定义颜色主题
icon: "info-sign" // 定义消息图标
}).show();
}
$.post("./post_del.php", {
'del_url_array': check_val
},
function(data) {
if (data.search('success') > 0) {
new $.zui.Messager("删除成功", {
type: "success", // 定义颜色主题
icon: "ok-sign" // 定义消息图标
}).show();
// 延时2秒刷新
window.setTimeout(function() {
window.location.reload();
}, 1500)
} else {
new $.zui.Messager("删除失败 请登录后再删除!", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
// 延时2s跳转
window.setTimeout("window.location=\'/../admin/index.php \'", 2000);
}
});
}
// 返回顶部
@@ -357,6 +422,6 @@ $allUploud = get_file_by_glob(APP_ROOT . $config['path'] . $allUploud, 'number')
endDate: new Date() // 只能选当前日期之前
});
// 更改网页标题
document.title = "图床广场 今日上传<?php get_file_by_glob(APP_ROOT . config_path() . '*.*', 'number'); ?>张 昨日<?php echo get_file_by_glob(APP_ROOT . $config['path'] . date("Y/m/d/", strtotime("-1 day")) . '*.*', 'number'); ?>张 - <?php echo $config['title']; ?>"
document.title = "图床广场 - 今日上传<?php echo get_file_by_glob(APP_ROOT . config_path(), 'number'); ?>张 昨日<?php echo get_file_by_glob(APP_ROOT . $config['path'] . date("Y/m/d/", strtotime("-1 day")) . '*.*', 'number'); ?>张 - <?php echo $config['title']; ?>"
</script>
<?php require_once APP_ROOT . '/application/footer.php';

View File

@@ -1,7 +1,9 @@
<?php
/**
* 删除文件页面
* 删除/回收文件页面
* @author Icret
* 2022-2-23 11:01:52
*/
require_once __DIR__ . '/function.php';
@@ -9,26 +11,20 @@ if (!is_who_login('admin')) {
exit('Not Logged!');
}
$del_url_array = isset($_POST['del_url_array']) ? $_POST['del_url_array'] : exit;
$del_num = count($del_url_array);
for ($i = 0; $i < $del_num; $i++) {
getDel($del_url_array[$i], 'url');
// 删除文件
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');
}
}
$path = '/i/cache/';
if (deldir($path)) {
echo '
<script> new $.zui.Messager("删除成功!", {
type: "success", // 定义颜色主题
icon: "ok-sign" // 定义消息图标
}).show();</script>';
header("refresh:1;"); // 1s后刷新当前页面
} else {
echo '
<script> new $.zui.Messager("删除失败!", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();</script>';
header("refresh:1;"); // 1s后刷新当前页面
// 回收文件
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);
}
}

View File

@@ -1,9 +1,10 @@
<?php
require_once __DIR__ . '/function.php';
require_once __DIR__ . '/WaterMask.php';
// 压缩图片与图片鉴黄
function process($filePath, $absolutePath)
function compress($absolutePath)
{
global $config;
// 压缩图片 后压缩模式,不影响前台输出速度
@@ -18,11 +19,59 @@ function process($filePath, $absolutePath)
flush();
}
}
}
// 设置水印
function water($source)
{
global $config;
// 文字水印
if ($config['watermark'] == 1) {
// 过滤gif
if (isAnimatedGif($source) === 0) {
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => $config['waterText'],
# 水印显示位置
'pos' => $config['waterPosition'],
# 不指定name(会覆盖原图也就是保存成thumb.jpeg)
'name' => $source,
'font' => APP_ROOT . $config['textFont'],
'fontSize' => $config['textSize'],
'color' => $config['textColor'],
];
Imgs::setWater($source, $arr);
}
}
// 图片水印
if ($config['watermark'] == 2) {
// 过滤gif
if (isAnimatedGif($source) === 0) {
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => APP_ROOT . $config['waterImg'],
# 水印显示位置
'pos' => $config['waterPosition'],
# 不指定name(会覆盖原图也就是保存成thumb.jpeg)
'name' => $source,
];
Imgs::setWater($source, $arr);
}
}
}
function process_checkImg($imgurl)
{
global $config;
// 图片违规检查
if ($config['checkImg']) {
require_once APP_ROOT . '/config/api_key.php';
@checkImg($config['imgurl'] . $filePath);
if ($config['checkImg'] == 1) {
checkImg($imgurl, 1);
}
if ($config['checkImg'] == 2) {
checkImg($imgurl, 2);
}
}
@@ -68,9 +117,14 @@ function write_log($filePath, $sourceName, $absolutePath, $fileSize, $from = "We
$log = json_encode($log, JSON_UNESCAPED_UNICODE);
file_put_contents($logFileName, PHP_EOL . $log, FILE_APPEND | LOCK_EX);
}
/*
for ($i = 0; $i < 100000; $i++) {
write_log('/i/2021/11/13/12der8s.jpg', '/i/cache/2021_11_13_12der8s.jpg');
}
*/
/* 以数组存放 并发会丢日志
if (!is_file($logFileName)) {
file_put_contents($logFileName, '<?php $logs=Array();?>');
}
include $logFileName;
$log = array_replace($logs, $log);
cache_write($logFileName, $log, 'logs');
*/
}

View File

@@ -1,4 +1,5 @@
<?php
/*
// +----------------------------------------------------------------------
// | 把大图缩略到缩略图指定的范围内,不留白(原图会剪切掉不符合比例的右边和下边)
@@ -21,3 +22,66 @@ $w = isset($_GET['width']) ? $_GET['width'] : 258; // 预生成缩略图的宽
$h = isset($_GET['height']) ? $_GET['height'] : 258; // 预生成缩略图的高
Thumb::show($src, $w, $h);
*/
/**
* 使用新的TimThumb.php生成缩略图
* TimThumb.php EasyImage修改版 by Icret
* form https://github.com/podipod/TimThumb
* 2022-1-30 06:35:08
*
* TimThumb参数指南
* 命令 作用 参数 描述
* src 源 图像URL 告诉TimThumb调整哪个图片
* w 宽度 宽度调整 调整输出图像的宽度
* h 高度 高度调整 调整输出图像的高度
* q 质量 0 - 100 压缩质量值越大质量越高。不建议高于95
* a 对齐 c, t, l, r, b, tl, tr, bl, br 图像对齐。 c = center, t = top, b = bottom, r = right, l = left。 可以创建对角位置
* zc 缩放/裁剪 0、1、2、3 0根据传入的值进行缩放不裁剪 1以最合适的比例裁剪和调整大小裁剪 2按比例调整大小并添加边框裁剪3按比例调整大小不添加边框裁剪
* f 过滤器 太多了 可以改变亮度/对比度;甚至模糊图像
* s 锐化 锐化 使得按比例缩小图片看起来有点;更清晰
* cc 画布上的颜色 十六进制的颜色值(# ffffff) 改变背景颜色。 大多数更改缩放和作物设置时使用,进而可以添加图像边界。
* ct 画布的透明度 true (1) 使用透明而忽略背景颜色
*/
require_once __DIR__ . '/function.php';
// 中文翻译 https://my.oschina.net/whrlmc/blog/81739
define('LOCAL_FILE_BASE_DIRECTORY', APP_ROOT);
define('MEMORY_LIMIT', '128M');
define('DEFAULT_WIDTH', 258);
define('DEFAULT_HEIGHT', 258);
define('FILE_CACHE_PREFIX', 'EasyImage');
define('DEFAULT_ZC', 0);
define('MAX_WIDTH', 10240);
define('MAX_HEIGHT', 10240);
define('FILE_CACHE_DIRECTORY', APP_ROOT . $config['path'] . 'thumbnails');
define('NOT_FOUND_IMAGE', $config['imgurl'] . '/public/images/404.png');
define('ERROR_IMAGE', $config['imgurl'] . '/public/images/404.png');
define('DISPLAY_ERROR_MESSAGES', false);
define('MAX_FILE_SIZE', 10485760); // 10 Megs 是 10485760。这是我们将处理的最大内部或外部文件大小。
define('FILE_CACHE_TIME_BETWEEN_CLEANS', 86400); // 多久清理一次缓存
define('FILE_CACHE_MAX_FILE_AGE', 86400); // 文件必须从缓存中删除多长时间
define('BROWSER_CACHE_MAX_AGE', 864000); // 浏览器缓存时间
global $ALLOWED_SITES;
$ALLOWED_SITES = array(
$config['domain'],
$config['imgurl'],
'flickr.com',
'staticflickr.com',
'picasa.com',
'img.youtube.com',
'upload.wikimedia.org',
'photobucket.com',
'imgur.com',
'imageshack.us',
'tinypic.com',
'mind.sh',
'mindsharelabs.com',
'mindsharestudios.com'
);
require_once __DIR__ . '/TimThumb.php';
timthumb::start();

View File

@@ -51,7 +51,7 @@ function creat_json() // 创建json文件
$yestUpload = getFileNumber(APP_ROOT . $config['path'] . date("Y/m/d/", strtotime("-1 day"))); // 昨日上传数量
$totalJsonInfo = [
'filename' => $totalJsonMD5, // 统计文件名称
'filename' => $totalJsonMD5, // 统计文件名称
'date' => date('YmdH'), // 识别日期格式
'total_time' => date('Y-m-d H:i:s'), // 统计时间
'dirnum' => $dirn, // 文件夹数量

View File

@@ -1,13 +1,11 @@
<?php
require __DIR__ . '/application/function.php';
require APP_ROOT . '/application/class.upload.php';
require APP_ROOT . '/application/WaterMask.php';
require __DIR__ . '/function.php';
require __DIR__ . '/class.upload.php';
// 检查登录
if ($config['mustLogin']) {
checkLogin();
exit;
}
// 黑/白IP名单上传
@@ -53,44 +51,6 @@ if ($handle->uploaded) {
// 存储图片路径:images/201807/
$handle->process(APP_ROOT . config_path());
// 设置水印
if ($config['watermark'] > 0) {
switch ($config['watermark']) {
case 1: // 文字水印 过滤gif
if (isAnimatedGif($handle->file_src_pathname) === 0) {
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => $config['waterText'],
# 水印显示位置
'pos' => $config['waterPosition'],
# 不指定name(会覆盖原图也就是保存成thumb.jpeg)
'name' => $handle->file_dst_pathname,
'font' => APP_ROOT . $config['textFont'],
'fontSize' => $config['textSize'],
'color' => $config['textColor'],
];
Imgs::setWater($handle->file_dst_pathname, $arr);
}
break;
case 2: // 图片水印
if (isAnimatedGif($handle->file_src_pathname) === 0) {
$arr = [
# 水印图片路径(如果不存在将会被当成是字符串水印)
'res' => APP_ROOT . $config['waterImg'],
# 水印显示位置
'pos' => $config['waterPosition'],
# 不指定name(会覆盖原图也就是保存成thumb.jpeg)
'name' => $handle->file_dst_pathname,
];
Imgs::setWater($handle->file_dst_pathname, $arr);
}
break;
default:
echo $handle->error;
break;
}
}
/*
// 创建缩略图 开启后会个别返回文件失败暂时没找到替代方案如果启用此项目需要将list.php中的get_online_thumbnail改成return_thumbnail_images函数
if ($config['thumbnail']) {
@@ -101,14 +61,16 @@ if ($handle->uploaded) {
// 图片完整相对路径:/i/2021/05/03/k88e7p.jpg
if ($handle->processed) {
header('Content-type:text/json');
// 上传成功后返回json数据
$imageUrl = $config['imgurl'] . config_path() . $handle->file_dst_name;
$pathIMG = config_path() . $handle->file_dst_name;
$imageUrl = $config['imgurl'] . $pathIMG;
// 关闭上传后显示加密删除链接
if ($config['show_user_hash_del']) {
// 判断PHP版本启用删除
if (PHP_VERSION >= '7') {
$delUrl = $config['domain'] . '/application/del.php?hash=' . urlHash(config_path() . $handle->file_dst_name, 0);
$delUrl = $config['domain'] . '/application/del.php?hash=' . urlHash($pathIMG, 0);
} else {
$delUrl = "Sever PHP version lower 7.0";
}
@@ -117,10 +79,12 @@ if ($handle->uploaded) {
}
$reJson = array(
"result" => "success",
"code" => 200,
"url" => $imageUrl,
"del" => $delUrl,
"result" => "success",
"code" => 200,
"url" => $imageUrl,
"srcName" => $handle->file_src_name_body,
"thumb" => $config['domain'] . '/application/thumb.php?img=' . $pathIMG,
"del" => $delUrl,
);
echo json_encode($reJson);
$handle->clean();
@@ -133,17 +97,33 @@ if ($handle->uploaded) {
);
unset($handle);
header('Content-Type:application/json; charset=utf-8');
unset($handle);
exit(json_encode($reJson, JSON_UNESCAPED_UNICODE));
}
// 后续处理
require_once APP_ROOT . '/application/process.php';
// 日志
if ($config['upload_logs']) {
@write_log(config_path() . $handle->file_dst_name, $handle->file_src_name, $handle->file_dst_pathname, $handle->file_src_size);
/** 后续处理 */
require __DIR__ . '/process.php';
// 使用fastcgi_finish_request操作
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
// 普通模式鉴黄
@process_checkImg($imageUrl);
// 日志
if ($config['upload_logs']) @write_log($pathIMG, $handle->file_src_name, $handle->file_dst_pathname, $handle->file_src_size);
// 水印
@water($handle->file_dst_pathname);
// 压缩
@compress($handle->file_dst_pathname);
} else {
// 普通模式鉴黄
@process_checkImg($imageUrl);
// 日志
if ($config['upload_logs']) write_log($pathIMG, $handle->file_src_name, $handle->file_dst_pathname, $handle->file_src_size);
// 水印
@water($handle->file_dst_pathname);
// 压缩
@compress($handle->file_dst_pathname);
}
// 压缩|鉴黄
process(config_path() . $handle->file_dst_name, $handle->file_dst_pathname);
unset($handle);
}

View File

@@ -1,17 +1,21 @@
<?php
/**
* 此文件用来存放API Key
* 2021-11-6 14:36:35
*/
/*
* Token list 请在此填写需要配置Token的用户 前边编号有助于识别上传者ID
* 格式: ID数字需要从0开始,顺序添加)=> Token注意后边',')
*/
$tokenList = array(
0 => '8337effca0ddfcd9c5899f3509b23657',
1 => '1c17b11693cb5ec63859b091c5b9c1b2',
);
$tokenList=Array
(
'8337effca0ddfcd9c5899f3509b23657'=>Array
(
'id'=>0,
'expired'=>3373722730,
'add_time'=>1645722730
),
'1c17b11693cb5ec63859b091c5b9c1b2'=>Array
(
'id'=>1,
'expired'=>2509722743,
'add_time'=>1645722743
),
'3e2246984b5047c25dcf08dc41c367b8'=>Array
(
'id'=>0,
'expired'=>1645765606
)
);

View File

@@ -12,16 +12,16 @@ $config=Array
'user'=>'admin',
'password'=>'e6e061838856bf47e1de730719fb2609',
'mustLogin'=>1,
'apiStatus'=>0,
'apiStatus'=>1,
'path'=>'/i/',
'imgName'=>'default',
'maxSize'=>10485760,
'maxUploadFiles'=>30,
'maxUploadFiles'=>100,
'watermark'=>0,
'waterText'=>'简单图床 - ww.png.cm',
'waterText'=>'简单图床 - png.cm',
'waterPosition'=>0,
'textColor'=>'255,0,0,1',
'textSize'=>16,
'textSize'=>50,
'textFont'=>'/public/static/hkxzy.ttf',
'waterImg'=>'/public/images/watermark.png',
'extensions'=>'gif,jpeg,png,tif,bmp,tif,svg,webp,jpg,tga,svg,ico',
@@ -41,35 +41,37 @@ $config=Array
'imgRatio_preserve_headers'=>1,
'static_cdn'=>0,
'theme'=>'default',
'static_cdn_url'=>'https://cdn.jsdelivr.net/gh/icret/EasyImages2.0',
'static_cdn_url'=>'https://cdn.jsdelivr.net/gh/icret/EasyImages2.0@2.5.4',
'TinyPng_key'=>'',
'moderatecontent_key'=>'',
'footer'=>'<a href="/admin/terms.php" target="_blank">请勿上传违反中国政策的图片</a>',
'ad_top'=>0,
'ad_top_info'=>' <!--广告 按照这个范例替换相应链接,如果想多几个广告,就多复制几个-->
<div class="col-md-12" style="text-align: center;margin:2px;">
<a href="https://app.cloudcone.com.cn/?ref=3521" target="_blank"><img src="/public/images/EasyImage2.0.png" /></a>
</div>',
'ad_bot'=>0,
'ad_bot_info'=>' <!--广告 按照这个范例替换相应链接,如果想多几个广告,就多复制几个-->
<div class="col-md-12" style="text-align: center;margin:2px;">
<a href="https://app.cloudcone.com.cn/?ref=3521" target="_blank"><img src="/public/images/EasyImage2.0.png" /></a>
</div>',
'showSwitch'=>1,
'listNumber'=>20,
'customize'=>' <!-- 百度统计代码-->
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?5320b69f4f1caa9328dfada73c8e6a75";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>',
'checkEnv'=>1,
'checkImg'=>0,
'checkImg_value'=>50,
'moderatecontent_key'=>'',
'nsfwjs_url'=>'',
'footer'=>'<a href="/admin/terms.php" target="_blank">请勿上传违反中国政策的图片</a>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?c790ac2bdc2f385757ecd0183206108d";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>',
'ad_top'=>0,
'ad_top_info'=>' <!--广告 按照这个范例替换相应链接,如果想多几个广告,就多复制几个-->
<div class="col-md-12" style="text-align: center;margin:2px;">
<a href="https://app.cloudcone.com.cn/?ref=3521" target="_blank"><img src="/public/images/EasyImage2.0.png" /></a>
</div>',
'ad_bot'=>0,
'ad_bot_info'=>'<div class="col-md-12" style="text-align: center;margin:12px;">
<a href="../public/images/wechat.jpg" title="您的赞美是我开发的动力!" data-toggle="lightbox" class="btn btn-mini" style="color:#329d38;" data-lightbox-group="group1644998953432"><i class="icon icon-wechat"></i> 打赏作者</a>
<a href="../public/images/alipay.jpg" title="您的赞美是我开发的动力!" data-toggle="lightbox" class="btn btn-mini" style="color:#1970fc;" data-lightbox-group="group1644998953432"><i class="icon icon-zhifubao"></i> 打赏作者</a>
</div>',
'showSwitch'=>1,
'showSort'=>1,
'listNumber'=>20,
'customize'=>'',
'checkEnv'=>1,
'upload_logs'=>1,
'cache_freq'=>2,
'upload_first_show'=>1,
@@ -79,6 +81,107 @@ $config=Array
'check_ip'=>0,
'check_ip_model'=>0,
'check_ip_list'=>'',
'version'=>'2.4.7 dev',
'form'=>'2022-01-27 17:20:14'
'public'=>0,
'public_list'=>Array
(
0=>'time',
1=>'today',
2=>'yesterday',
3=>'total_space',
4=>'used_space',
5=>'free_space',
6=>'image_used',
7=>'file',
8=>'dir',
9=>'month'
),
'language'=>0,
'image_recycl'=>1,
'version'=>'2.5.4',
'update'=>'2022-02-27 15:00:09',
'terms'=>'<div class="container">
<div class="row">
<div class="col-xs-3">
<ul class="nav nav-tabs nav-stacked">
<li class="active">
<a href="#Terms" data-target="#tab3Content1" data-toggle="tab">服务条款</a>
</li>
<li>
<a href="#Privacy" data-target="#tab3Content2" data-toggle="tab">隐私政策</a>
</li>
<li>
<a href="#DMCA" data-target="#tab3Content3" data-toggle="tab">DMCA</a>
</li>
</ul>
</div>
<div class="col-xs-9">
<div class="tab-content col-xs-9">
<div class="tab-pane fade active in" id="tab3Content1">
<h4>服务条款</h4>
<hr>
<p>访问我们网站除主页和本“条款”页面以外的任何页面,即表示您同意这些使用条款和我们的隐私政策。如果您不同意,请不要使用我们的网站。</p>
<ol>
<li>您使用我们的网站进行除简单访问/查看之外的任何事情(即上传、下载、评论等),不仅构成您的同意,而且构成您的电子签名,这意味着您受这些条款的合同约束,并且通过我们的隐私政策。</li>
<li>我们保留在使用过多带宽或以其他方式滥用系统的用户帐户上禁用直接链接的权利。
<li>请勿上传儿童色情内容或威胁、骚扰、诽谤或鼓励非法行为的材料。不要使用本网站作为内容交付网络。如果你这样做(我们将成为法官),或者如果你做了任何违法的事情,除了我们可能拥有的任何其他合法权利之外,我们将禁止你以及你从中盗链的网站,删除你的所有图片,报告如有必要,您可以向当局报告,并阻止您查看本网站上托管的任何图像。我们是认真的。</li>
<li>用户必须同意遵守适用于其所在地的所有法律,包括版权和商标法。不允许使用侵犯版权或商标的图片。如果有人对您提出侵权索赔,您将被要求删除受版权保护的文件,直到问题得到解决。如果本网站的参与者之间存在争议,我们没有义务参与其中。</li>
<li>您可以匿名上传图像,并与您的朋友、家人、在线站点以及社交网络在线共享。</li>
<li>如果您在我们的网站上看到任何不应该出现的内容,因为它违反了我们的政策或出于任何其他原因,请通过电子邮件联系告知我们</li>
<li>声明通知中的信息准确无误,否则会受到伪证处罚。为此,请包括以下声明: “我发誓,通知中的信息准确无误,并且我是(版权)所有者或被授权代表专有权的所有者行事,在作伪证的处罚下涉嫌侵权”。</li>
</ol>
<p>如果发生调查,本网站承诺与任何和所有法律机构合作。</p>
</div>
<div class="tab-pane fade" id="tab3Content2">
<h4>隐私政策</h4>
<hr>
<h4>一般: </h4>
<p>当您访问本网站或使用本政策中进一步概述的服务(“服务”)时,本网站致力于保护您的隐私。作为使用本网站服务的条件,您同意向本网站提供某些个人信息。该信息包括但不限于: 电子邮件地址和您计算机的唯一 IP 地址(如果有)、财务信息(您的 Paypal 帐户使用的电子邮件地址)和人口统计信息(例如,邮政编码、邮政编码、家乡、性别、购买历史信息和年龄以及不是您计算机独有的 IP 地址)。请注意,我们不会在本网站的任何地方故意收集 13 岁以下儿童的联系信息或财务信息。请定期查看本隐私政策,因为我们可能会不时对其进行更新。本隐私政策的最后修订日期为 2021年10月25日。您每次访问本网站、使用服务或向我们提供信息时,即表示您当时接受本隐私政策中描述的做法。您同意,通过使用本网站,您明确并肯定地同意我们使用和披露您提供的信息,并同意接收电子邮件,如下面的隐私政策所述。</p>
<h4>隐私政策变更: </h4>
<p>随着新功能添加到网站或我们纳入用户的建议,本政策可能会随着时间的推移进行修订。如果我们打算以与我们收集信息时声明的方式大不相同的方式使用或披露您的个人身份信息,您将可以选择我们是否以这种新方式使用或披露您的信息。我们还将在我们的网站显着位置发布隐私政策已修订的通知,以便您可以随时查看我们收集的信息、我们将如何使用该信息以及在何种条件下我们将向任何人披露这些信息。</p>
<h4>如何使用您的信息: </h4>
<p>我们使用联系信息(即您的电子邮件地址)来帮助我们有效地执行帐户任务(更改密码、找回丢失的密码)、提供您请求的服务、执行质量保证、销售分析和其他业务分析,并就相关事宜与您联系与您向我们下的任何订单。除非满足任何法律、法规、政府要求或司法命令,否则不会将您的财务信息用于其他用途。当您通过本网站进行购买或在本网站注册时,您将向我们提供一个电子邮件地址,我们或这些服务提供商可能会出于本段所述目的与您联系。</p>
<h4>联系您获取优惠和促销信息: </h4>
<p>您同意,考虑到我们提供的服务的使用,允许我们使用您的个人信息向您发送营销和促销材料。我们也可能向您发送宣传第三方产品的营销和宣传材料。我们不会出租或出售您的个人信息以供第三方使用。这些材料可能包括但不限于: 向您提供有关如何使用服务的附加信息的时事通讯,以及来自我们或第三方的商品和服务的促销优惠。</p>
<h4>人口统计信息的使用: </h4>
<p>我们可能会使用您的人口统计信息进行业务分析或根据您的兴趣定制网站和通讯。我们可能会与广告商和其他第三方共享匿名的汇总人口统计信息,以便他们可以针对适当的受众定制广告和通信。在本隐私政策允许我们共享您的联系信息或财务信息的任何时候,我们也可能会同时共享您的人口统计信息。</p>
<h4>向政府实体披露: </h4>
<p>当我们确定此类披露是遵守法律、与执法部门合作或寻求执法协助或保护我们或网站其他访问者或用户的利益或安全时,我们可能会披露特定的联系信息。服务。此外,如果我们发生合并、收购、合并、剥离或破产,您的联系信息可能会传递给第三方。</p>
<h4>Cookie 和其他网站跟踪数据的使用: </h4>
<p>Cookies : “cookie”是我们保存在您计算机硬盘上的包含非个人信息的小文件。这些 cookie 有助于让您更快地访问您已经访问过的页面。它们还允许您个性化您的页面,并优化您在我们网站上的体验。我们还使用 cookie 来帮助我们了解有多少人访问了我们的网站、他们访问了我们的哪些网页以及他们在那里停留的时间。此信息可帮助我们确定我们的哪些网络功能非常成功以及哪些网站可能需要改进。您可以通过在浏览器的首选项或选项菜单中指明这一点来禁用计算机上的 cookie。大多数浏览器会自动接受 cookie,但允许您禁用它们。禁用 cookie 可能会阻止您正确使用服务或访问网站。</p>
<h4>会话 ID: </h4>
<p>“会话 ID”允许我们在多个网页请求中识别特定用户。此会话 ID 会尽可能保存在您的 cookie 文件中。如果 cookie 未启用,或者如果用户的 Internet 浏览器程序不支持 cookie,则我们将在请求的网页中放置会话 ID。这使最终用户不必为每个网页请求不断地重新输入某些信息,例如帐户名和密码。每当用户关闭其 Internet 浏览器时,此会话 ID 就会过期。</p>
<h4>网站跟踪、报告: </h4>
<p>我们的许多网页还包含特殊的电子图像(称为“单像素 gif”或“gif”),使我们能够仅收集非个人身份的流量统计数据和有关我们网站访问者的其他汇总信息。IMX.to(通过自身或第三方)使用此技术收集和积累匿名数据,帮助我们了解和分析访问我们网站的人的体验,并连同您提供的其他信息,定制您未来的访问并改进我们的网站网站。例如,我们捕获有关所用浏览器类型、操作系统软件(例如 Windows 95 与 98 或 Macintosh)、cookie 偏好(用户是否打开或关闭它们)和搜索引擎关键字(哪些关键字做了什么)的数据。访问者用于访问我们的网站)。我们还记录了访问次数,所采取的路径,以及在我们网站内的站点和页面上花费的时间。请记住,这些信息都不是个人身份信息,我们只将这些信息分发给我们的内部员工以及与我们签署了保密协议的合作伙伴。我们与合作伙伴共享的任何信息都反映了整个网站或 Internet 使用趋势,而不是个别信息。</p>
<h4>IP地址: </h4>
<p>每次您访问本网站时,我们都会自动收集您的 IP 地址和您来自的网页。为了为您管理和优化站点并诊断我们站点的问题,我们使用您的 IP 地址来帮助识别您的身份并收集有关您的广泛人口统计信息。</p>
<h4>来自其他网站的信息: </h4>
<p>我们可能会放置指向其他方运营的其他网站的链接,并且可能会不时在我们的促销电子邮件中包含指向第三方网站的信息和链接。其中一些其他网站包含我们的品牌名称和商标以及我们拥有的其他知识产权;其他人没有。当您点击这些链接并访问这些其他网站时,无论它们是否包含我们的品牌名称、商标和其他知识产权,您都需要注意,我们不控制这些其他网站或这些其他网站”商业惯例,并且本隐私政策不适用于这些其他网站。因此,这些其他网站的运营商可能会收集有关您的不同类型的信息,并且可能以不同于我们在网站上收集信息的方式使用和披露该信息。我们鼓励您查看他们的隐私政策,并提醒您我们不对他们的行为负责。</p>
<h4>信息存储: </h4>
<p>您理解并同意我们在服务器上存储和处理您的信息,并且通过向我们提供任何数据,您同意将此类信息传输到网站服务器。当您从我们帐户中删除文件时,您与该文件之间将不再存在任何链接。删除的文件可能会缓存在我们服务器中以节省带宽,以防其他人请求它们。</p>
<h4>如何联系我们: </h4>
<p>如果您对您提交给我们这个隐私政策或信息有任何疑问,您可以通过邮件方式联系我们</p>
</div>
<div class="tab-pane fade" id="tab3Content3">
<h4>数字千年版权法案</h4>
<hr>
<p>要向我们提交版权侵权通知,您需要发送书面通知,其中包含《数字千年版权法》第 512(c)(3) 条要求和规定的信息。</p>
<p>要撰写适当的 DMCA 通知,请说明以下信息: </p>
<ol>
<li>表明自己是您认为受到侵犯的版权作品或专有权的所有者,或代表此类所有者行事的人,并提供物理签名(纸质形式时)或电子签名(电子形式时) )。</li>
<li>指明您认为受到侵权的受版权保护的作品,或者如果有大量作品受到侵权,请提供作品的代表性清单。</li>
<li>通过在我们站点上提供包含这些材料的 Web URL,确定侵犯您的版权作品的材料的位置。请不要发送附加的图像、pdf 或其他文件格式的文件,而只能发送包含我们网址的列表。在信函正文中提供所有 URL 是帮助我们快速处理您的请求的最佳方式。</li>
<li>说明您的联系信息,包括您的姓名、街道地址、电话号码和电子邮件地址。如果您代表版权所有者行事,请同时说明您与版权所有者的关系(例如律师、供应商、代理人)。</li>
<li>声明您“真诚地相信上述材料的使用未经版权所有者、其代理人或法律授权”。</li>
<li>声明通知中的信息准确无误,否则会受到伪证处罚。为此,请包括以下声明: “我发誓,通知中的信息准确无误,并且我是(版权)所有者或被授权代表专有权的所有者行事,在作伪证的处罚下涉嫌侵权”。</li>
<li>请用中文书写,所有电子邮件是任何其他语言都将被忽略。</li>
<li>要行使您的 DMCA 权利,您必须将适当的 DMCA 通知发送至我们的指定代理至电子邮件。</li>
</ol>
<p>未能包含上述所有信息可能会导致 DMCA 通知的处理延迟。请注意,根据 DMCA 第 512(f) 条,任何故意歪曲材料或活动侵权的人都可能需要承担责任。</p>
<p>如果我们收到声称侵犯版权的适当通知,它将通过删除或禁止访问声称侵权或成为侵权活动主题的材料迅速做出回应。请注意,我们不一定会向报告者发送有关删除操作的确认。</p>
</div>
</div>
</div>
</div>
</div>',
'delDir'=>'thumbnails/'
);

View File

@@ -1,38 +1,31 @@
<?php
require_once 'application/header.php';
// 公告
if (!empty($config['tips'])) echo '
<div class="marquee">
<div class="wrap">
<div id="marquee2">
' . $config['tips'] . '
</div>
</div>
</div>
';
// 检查登录
mustLogin();
?>
<div class="col-md-12">
<div id='upShowID' class="uploader col-md-10 col-md-offset-1" data-ride="uploader" data-url="file.php">
<!-- 公告 -->
<div class="marquee">
<div class="wrap">
<div id="marquee2">
<?php if (!empty($config['tips'])) echo $config['tips']; ?>
</div>
</div>
</div>
<div id='upShowID' class="uploader col-md-10 col-md-offset-1 clo-xs-12" data-ride="uploader" data-url="/application/upload.php">
<div class="uploader-message text-center">
<div class="content"></div>
<button type="button" class="close">x</button>
</div>
<div class="uploader-files file-list file-list-lg" data-drag-placeholder="Ctrl+V粘贴/选择文件/将图片直接拖拽至此处" style="min-height: 160px; border-style: dashed;"></div>
<div class="uploader-files file-list file-list-lg file-rename-by-click" data-drag-placeholder="Ctrl+V粘贴/选择文件/将图片直接拖拽至此处" style="min-height: 160px; border-style: dashed;"></div>
<div class="uploader-actions">
<div class="uploader-status pull-right text-muted"></div>
<button type="button" class="btn btn-link uploader-btn-browse">
<i class="icon icon-plus"></i>选择文件</button>
<button type="button" class="btn btn-link uploader-btn-start">
<i class="icon icon-cloud-upload"></i>开始上传</button>
<button type="button" class="btn btn-link uploader-btn-stop">
<i class="icon icon-pause"></i>暂停上传</button>
<button type="button" class="btn btn-link uploader-btn-browse"><i class="icon icon-plus"></i> 选择文件</button>
<button type="button" class="btn btn-link uploader-btn-start"><i class="icon icon-cloud-upload"></i> 开始上传</button>
<button type="button" class="btn btn-link uploader-btn-stop"><i class="icon icon-pause"></i>暂停上传</button>
</div>
</div>
<div class="col-md-10 col-md-offset-1">
<div class="col-md-10 col-md-offset-1 clo-xs-12">
<ul class="nav nav-tabs">
<li <?php if ($config['upload_first_show'] == 1) echo 'class="active"'; ?>>
<a href="#" data-target="#tab2Content1" data-toggle="tab"><i class="icon icon-link"></i> 直链</a>
@@ -53,28 +46,28 @@ 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" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
<button id="btnLinks" class="btn copyBtn1" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
<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>
</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" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
<button id="btnBbscode" class="btn copyBtn2" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
<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>
</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" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
<button id="btnMarkDown" class="btn copyBtn3" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
<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>
</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" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
<button id="btnHtml" class="btn copyBtn4" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
<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>
</div>
<div class="tab-pane fade <?php if ($config['upload_first_show'] == 5) echo 'active in'; ?>" id="tab2Content5">
<pre><textarea class="form-control" rows="5" id="del" readonly></textarea></pre>
<button class="btn" style="margin-top:10px;" onclick="location.reload()"><i class="icon icon-undo"></i> 刷新</button>
<button id="btndel" class="btn copyBtn5" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
<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 copyBtn5" data-loading-text="已经复制链接..." style="margin-top:10px;"><i class="icon icon-copy"></i> 复制</button>
</div>
</div>
</div>
@@ -90,13 +83,17 @@ mustLogin();
// 自动上传
autoUpload: false,
// 文件上传提交地址
url: 'file.php',
url: '/application/upload.php',
// 最大支持的上传文件
max_file_size: <?php echo $config['maxSize']; ?>,
// 分片上传 0为不分片 分片容易使图片上传失败
chunk_size: 0,
// 点击文件列表上传文件
browseByClickList: true,
// flash 上传组件地址
flash_swf_url: '<?php static_cdn(); ?>/public/static/zui/lib/uploader/Moxie.swf',
// silverlight 上传组件地址
flash_swf_url: '<?php static_cdn(); ?>/public/static/zui/lib/uploader/Moxie.xap',
// 预览图尺寸
previewImageSize: {
'width': 80,
@@ -117,30 +114,21 @@ mustLogin();
},
// 限制文件上传数目
limitFilesCount: <?php echo $config['maxUploadFiles']; ?>,
// 自动上传失败的文件
// 重置上传失败的文件
autoResetFails: true,
<?php echo imgRatio(); ?>,
responseHandler: function(responseObject, file) {
var obj = JSON.parse(responseObject.response); //由JSON字符串转换为JSON对象
console.log(obj); // 输出log
console.log(file); // 输出log
if (obj.result === 'success') {
var links = document.getElementById("links");
links.innerHTML += obj.url + "\n";
var bbscode = document.getElementById("bbscode");
bbscode.innerHTML += "[img]" + obj.url + "[/img]\n";
var markdown = document.getElementById("markdown");
markdown.innerHTML += "![简单图床 - EasyImage](" + obj.url + ")\n";
var html = document.getElementById("html");
html.innerHTML += "&lt;img src=\"" + obj.url + "\" alt=\"简单图床 - EasyImage\" /&#62;\n";
var del = document.getElementById("del");
del.innerHTML += obj.del + "\n";
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("del").innerHTML += obj.del + "\r\n";
} else {
return '上传失败,服务器返回错误:' + obj.message;
return '上传失败,错误信息:' + obj.message;
}
}
});
@@ -165,4 +153,5 @@ mustLogin();
})();
</script>
<?php
/** 环境检测 */ if ($config['checkEnv']) require_once APP_ROOT . '/application/check.php';
require_once APP_ROOT . '/application/footer.php';

View File

@@ -12,7 +12,7 @@ if (isset($_POST['password'])) {
$config['user'] = $_POST['user'];
} else {
exit('<script>window.alert("两次密码不一致请重新输入");location.href="./index.php";</script>');
exit('<script>window.alert("两次密码不一致请重新输入!");location.href="./index.php";</script>');
}
}
@@ -32,26 +32,27 @@ file_put_contents(APP_ROOT . '/install/install.lock', '安装程序锁定文件
// 删除安装目录
if (isset($_POST['del_install'])) {
if ($_POST['del_install'] == "del") {
deldir(APP_ROOT . "/install/");
deldir(APP_ROOT . "/install");
}
}
// 删除多余文件
// 删除多余文件.whitesource
if (isset($_POST['del_extra_files'])) {
if ($_POST['del_extra_files'] == "del") {
@unlink(APP_ROOT . '/CODE_OF_CONDUCT.md');
@unlink(APP_ROOT . '/LICENSE');
@unlink(APP_ROOT . '/README.md');
@unlink(APP_ROOT . '/.whitesource');
@unlink(APP_ROOT . '/CODE_OF_CONDUCT.md');
@unlink(APP_ROOT . '/config/EasyIamge.lock');
@deldir(APP_ROOT . "/.github/");
@deldir(APP_ROOT . "/.git/");
@deldir(APP_ROOT . "/.github");
@deldir(APP_ROOT . "/.git");
}
}
// 跳转主页
echo '
<script>
window.alert("安装成功即将为您跳转到登陆界面");
window.alert("安装成功,即将为您跳转到登陆界面!");
location.href="../admin/index.php";
</script>
';

View File

@@ -1,5 +1,6 @@
<?php
require_once __DIR__ . '/../application/function.php';
clearstatcache();
// 存在程序锁则跳转主页
if (file_exists(APP_ROOT . '/install/install.lock')) {
exit(header("Location:/../index.php"));
@@ -9,7 +10,7 @@ $fileinfo = extension_loaded('fileinfo') ? true : false;
$gd = extension_loaded('gd') ? true : false;
$openssl = extension_loaded('openssl') ? true : false;
$file = substr(base_convert(fileperms(APP_ROOT . "/file.php"), 10, 8), 3);
$file = substr(base_convert(fileperms(APP_ROOT . "/application/upload.php"), 10, 8), 3);
if (IS_WIN) {
$file_php = true;
$i_wjj = true;
@@ -27,6 +28,8 @@ if (!IS_WIN) {
}
}
$userINI = is_file(APP_ROOT . '/.user.ini') ? false : true; // user.ini
function checkPASS($name)
{
if ($name) {
@@ -49,12 +52,13 @@ function checkPASS($name)
<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">
<script src="./../public/static/zui/lib/jquery/jquery-3.4.1.min.js?v3.4.1"></script>
<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.min.js?v2.0"></script>
<script src="./../public/static/qrcode/qrcode.min.js?v2.0"></script>
<script src="./../public/static/nprogress/nprogress.min.js"></script>
</head>
<body class="container">
<!-- install header html end -->
@@ -75,22 +79,22 @@ function checkPASS($name)
</tr>
<tr>
<td>Fileinfo</td>
<td>必须支持</td>
<td>必须支持 | 安装后重启PHP</td>
<td> <?php checkPASS($fileinfo); ?></td>
</tr>
<tr>
<td>GD</td>
<td>必须支持</td>
<td>必须支持 | 安装后重启PHP</td>
<td> <?php checkPASS($gd); ?></td>
</tr>
<tr>
<td>openssl</td>
<td>建议支持(用于删除文件,PHP>7.0</td>
<td>建议支持 | 生成加密删除url,需PHP>7.0</td>
<td> <?php checkPASS($openssl); ?></td>
</tr>
<tr>
<td>file.php</td>
<td>0755可执行权限非windows系统</td>
<td>upload.php</td>
<td>0755可执行权限 | 非windows系统</td>
<td> <?php checkPASS($file_php); ?></td>
</tr>
<tr>
@@ -98,14 +102,17 @@ function checkPASS($name)
<td>可写</td>
<td><?php checkPASS($i_wjj); ?></td>
</tr>
<tr>
<td>.user.ini</td>
<td>防跨目录读写文件 | 删除方法:<a href="https://lnmp.org/faq/lnmp-vhost-add-howto.html#user.ini" target="_blank"> LNMP</a> | <a href="https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=36605&page=1#pid122035" target="_blank">BT宝塔</a></td>
<td><?php checkPASS($userINI); ?></td>
</tr>
</tbody>
</table>
<?php
$checkres = array($phpEnv, $fileinfo, $gd, $i_wjj, $file_php);
$checkres = array($phpEnv, $fileinfo, $gd, $i_wjj, $file_php, $userINI);
if (in_array(false, $checkres)) {
echo '<p class="text-danger">如果你的PHP版本较低或者不想安装上述PHP扩展请删除<code>install</code>目录</p>
@@ -125,7 +132,7 @@ function checkPASS($name)
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span>
<span aria-hidden="true">x</span>
<span class="sr-only">关闭</span></button>
<h4 class="modal-title icon icon-mobile" style="text-align: center">扫描二维码使用手机上传</h4>
</div>
@@ -141,6 +148,13 @@ function checkPASS($name)
</div>
</div>
<script>
// NProgress
NProgress.configure({
showSpinner: false
});
NProgress.set(0.0);
NProgress.set(0.5);
// js二维码 获取当前网址并赋值给id=text的value
document.getElementById("text").value = window.location.href;
var qrcode = new QRCode(document.getElementById("qrcode"), {
@@ -170,7 +184,6 @@ function checkPASS($name)
</script>
<footer class="text-muted small col-md-12" style="text-align: center;margin-bottom: 10px">
<hr>
<p><a href="/../admin/terms.php" target="_blank">请勿上传违反中国政策的图片</a><i class="icon icon-smile"></i></p>
<div>
<!-- 对话框触发按钮 -->
<a href="#" data-position="center" data-moveable="inside" data-moveable="true" data-toggle="modal" data-target="#myModal">

View File

@@ -17,16 +17,18 @@ if ($state !== 'checked') {
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EasyIamge 2.0 即将完成安装</title>
<title>EasyIamge 2.0 即将完成安装!</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="keywords" content="EasyIamge 2.0 即将完成安装" />
<meta name="description" content="EasyIamge 2.0 即将完成安装" />
<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">
<script src="./../public/static/zui/lib/jquery/jquery-3.4.1.min.js?v3.4.1"></script>
<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.min.js?v2.0"></script>
<script src="./../public/static/qrcode/qrcode.min.js?v2.0"></script>
<script src="./../public/static/nprogress/nprogress.min.js"></script>
<style>
.message {
font-size: 12px;
@@ -52,7 +54,7 @@ if ($state !== 'checked') {
<div class="form-group">
<label class="col-sm-2">网站域名,末尾不加"/"</label>
<div class="col-md-6 col-sm-10">
<input type="url" class="form-control" name="domain" value="<?php echo get_whole_url('/install/install.php'); ?>" required="required" onkeyup="this.value=this.value.replace(/\s/g,'')" placeholder="网站域名与图片链接域名可以不同比如A域名上传可以返回B域名图片链接如果不变的话下边2个填写成一样的" title="网站域名与图片链接域名可以不同比如A域名上传可以返回B域名图片链接如果不变的话下边2个填写成一样的">
<input type="url" class="form-control" name="domain" value="<?php echo get_whole_url('/install/install.php'); ?>" required="required" onkeyup="this.value=this.value.replace(/\s/g,'')" placeholder="网站域名与图片链接域名可以不同比如A域名上传可以返回B域名图片链接如果不变的话下边2个填写成一样的!" title="网站域名与图片链接域名可以不同比如A域名上传可以返回B域名图片链接如果不变的话下边2个填写成一样的!">
</div>
</div>
<div class="form-group">
@@ -74,6 +76,7 @@ if ($state !== 'checked') {
<input type="text" class="form-control inp" name="password" value="" required="required" placeholder="请使用英文输入法输入密码并不小于8位数" onkeyup="this.value=this.value.replace(/\s/g,'')">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 ">确认密码</label>
<div class="col-md-6 col-sm-10">
@@ -84,7 +87,7 @@ if ($state !== 'checked') {
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" name="del_extra_files" value="del" checked><span style="font-weight: bold;color:green;" title="删除Github/Gitee下载的多余文件">删除多余文件</span>
<input type="checkbox" name="del_extra_files" value="del" checked><span style="font-weight: bold;color:green;" title="删除Github|Gitee下载的多余文件">删除多余文件</span>
</label>
<label>
<input type="checkbox" name="del_install" value="del"><span style="font-weight: bold;color:red;">删除安装目录</span>
@@ -94,20 +97,19 @@ if ($state !== 'checked') {
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-success">准备就绪,开始安装!</button>
<a class="btn btn" href="index.php">上一步</a>
<button type="submit" class="btn btn-success">开始安装</button>
</div>
</div>
</form>
</div>
<script>
var password = document.querySelector('.inp');
var message = document.querySelector('.message');
password.onblur = function() {
if (this.value.length < 8 || this.value.length > 18) {
message.innerHTML = '密码长度错误应为8~18位';
message.innerHTML = '密码长度错误,应为8~18位';
message.className = 'message wrong';
} else {
message.innerHTML = '密码长度正确';
@@ -115,15 +117,13 @@ if ($state !== 'checked') {
}
}
</script>
<!-- install bottom HTML start -->
<div class="modal fade" id="myModal">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span>
<span aria-hidden="true">x</span>
<span class="sr-only">关闭</span></button>
<h4 class="modal-title icon icon-mobile" style="text-align: center">扫描二维码使用手机上传</h4>
</div>
@@ -139,6 +139,12 @@ if ($state !== 'checked') {
</div>
</div>
<script>
// NProgress
NProgress.configure({
showSpinner: false
});
NProgress.set(0.5);
NProgress.set(0.9);
// js二维码 获取当前网址并赋值给id=text的value
document.getElementById("text").value = window.location.href;
var qrcode = new QRCode(document.getElementById("qrcode"), {
@@ -168,7 +174,6 @@ if ($state !== 'checked') {
</script>
<footer class="text-muted small col-md-12" style="text-align: center;margin-bottom: 10px">
<hr>
<p><a href="/../admin/terms.php" target="_blank">请勿上传违反中国政策的图片</a><i class="icon icon-smile"></i></p>
<div>
<!-- 对话框触发按钮 -->
<a href="#" data-position="center" data-moveable="inside" data-moveable="true" data-toggle="modal" data-target="#myModal">

View File

@@ -180,7 +180,7 @@ $('#btndel').on('click', function () {
}
if (!file) {
alert('粘贴内容非图片');
alert('粘贴内容非图片!');
return;
}
var formData = new FormData();
@@ -216,17 +216,15 @@ $('#btndel').on('click', function () {
xhr.onerror = function () {
alert('上传失败3');
};
xhr.open('POST', './file.php', true);
xhr.open('POST', './application/upload.php', true);
xhr.send(formData);
});
})();
/****************************************************************
*
*/
/******************************************************************/
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?5320b69f4f1caa9328dfada73c8e6a75";
hm.src = "https://hm.baidu.com/hm.js?c790ac2bdc2f385757ecd0183206108d";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
})();

194
public/static/i18n/jquery.s2t.js Executable file

File diff suppressed because one or more lines are too long

View File

@@ -1,13 +0,0 @@
/* InstantClick 3.1.0 | (C) 2014 Alexandre Dieulot | http://instantclick.io/license */
var InstantClick=function(d,e){function w(a){var b=a.indexOf("#");return 0>b?a:a.substr(0,b)}function z(a){for(;a&&"A"!=a.nodeName;)a=a.parentNode;return a}function A(a){var b=e.protocol+"//"+e.host;if(!(b=a.target||a.hasAttribute("download")||0!=a.href.indexOf(b+"/")||-1<a.href.indexOf("#")&&w(a.href)==k)){if(J){a:{do{if(!a.hasAttribute)break;if(a.hasAttribute("data-no-instant"))break;if(a.hasAttribute("data-instant")){a=!0;break a}}while(a=a.parentNode);a=!1}a=!a}else a:{do{if(!a.hasAttribute)break;
if(a.hasAttribute("data-instant"))break;if(a.hasAttribute("data-no-instant")){a=!0;break a}}while(a=a.parentNode);a=!1}b=a}return b?!1:!0}function t(a,b,c,g){for(var d=!1,e=0;e<B[a].length;e++)if("receive"==a){var f=B[a][e](b,c,g);f&&("body"in f&&(c=f.body),"title"in f&&(g=f.title),d=f)}else B[a][e](b,c,g);return d}function K(a,b,c,g){d.documentElement.replaceChild(b,d.body);if(c){history.pushState(null,null,c);b=c.indexOf("#");b=-1<b&&d.getElementById(c.substr(b+1));g=0;if(b)for(;b.offsetParent;)g+=
b.offsetTop,b=b.offsetParent;scrollTo(0,g);k=w(c)}else scrollTo(0,g);d.title=S&&d.title==a?a+String.fromCharCode(160):a;L();C.done();t("change",!1);a=d.createEvent("HTMLEvents");a.initEvent("instantclick:newpage",!0,!0);dispatchEvent(a)}function M(a){G>+new Date-500||(a=z(a.target))&&A(a)&&x(a.href)}function N(a){G>+new Date-500||(a=z(a.target))&&A(a)&&(a.addEventListener("mouseout",T),H?(O=a.href,l=setTimeout(x,H)):x(a.href))}function U(a){G=+new Date;(a=z(a.target))&&A(a)&&(D?a.removeEventListener("mousedown",
M):a.removeEventListener("mouseover",N),x(a.href))}function V(a){var b=z(a.target);!b||!A(b)||1<a.which||a.metaKey||a.ctrlKey||(a.preventDefault(),P(b.href))}function T(){l?(clearTimeout(l),l=!1):v&&!m&&(p.abort(),m=v=!1)}function W(){if(!(4>p.readyState)&&0!=p.status){q.ready=+new Date-q.start;if(p.getResponseHeader("Content-Type").match(/\/(x|ht|xht)ml/)){var a=d.implementation.createHTMLDocument("");a.documentElement.innerHTML=p.responseText.replace(/<noscript[\s\S]+<\/noscript>/gi,"");y=a.title;
u=a.body;var b=t("receive",r,u,y);b&&("body"in b&&(u=b.body),"title"in b&&(y=b.title));b=w(r);h[b]={body:u,title:y,scrollY:b in h?h[b].scrollY:0};for(var a=a.head.children,b=0,c,g=a.length-1;0<=g;g--)if(c=a[g],c.hasAttribute("data-instant-track")){c=c.getAttribute("href")||c.getAttribute("src")||c.innerHTML;for(var e=E.length-1;0<=e;e--)E[e]==c&&b++}b!=E.length&&(F=!0)}else F=!0;m&&(m=!1,P(r))}}function L(a){d.body.addEventListener("touchstart",U,!0);D?d.body.addEventListener("mousedown",M,!0):d.body.addEventListener("mouseover",
N,!0);d.body.addEventListener("click",V,!0);if(!a){a=d.body.getElementsByTagName("script");var b,c,g,e;i=0;for(j=a.length;i<j;i++)b=a[i],b.hasAttribute("data-no-instant")||(c=d.createElement("script"),b.src&&(c.src=b.src),b.innerHTML&&(c.innerHTML=b.innerHTML),g=b.parentNode,e=b.nextSibling,g.removeChild(b),g.insertBefore(c,e))}}function x(a){!D&&"display"in q&&100>+new Date-(q.start+q.display)||(l&&(clearTimeout(l),l=!1),a||(a=O),v&&(a==r||m))||(v=!0,m=!1,r=a,F=u=!1,q={start:+new Date},t("fetch"),
p.open("GET",a),p.send())}function P(a){"display"in q||(q.display=+new Date-q.start);l||!v?l&&r&&r!=a?e.href=a:(x(a),C.start(0,!0),t("wait"),m=!0):m?e.href=a:F?e.href=r:u?(h[k].scrollY=pageYOffset,m=v=!1,K(y,u,r)):(C.start(0,!0),t("wait"),m=!0)}var I=navigator.userAgent,S=-1<I.indexOf(" CriOS/"),Q="createTouch"in d,k,O,l,G,h={},p,r=!1,y=!1,F=!1,u=!1,q={},v=!1,m=!1,E=[],J,D,H,B={fetch:[],receive:[],wait:[],change:[]},C=function(){function a(a,e){n=a;d.getElementById(f.id)&&d.body.removeChild(f);f.style.opacity=
"1";d.getElementById(f.id)&&d.body.removeChild(f);g();e&&setTimeout(b,0);clearTimeout(l);l=setTimeout(c,500)}function b(){n=10;g()}function c(){n+=1+2*Math.random();98<=n?n=98:l=setTimeout(c,500);g()}function g(){h.style[k]="translate("+n+"%)";d.getElementById(f.id)||d.body.appendChild(f)}function e(){d.getElementById(f.id)?(clearTimeout(l),n=100,g(),f.style.opacity="0"):(a(100==n?0:n),setTimeout(e,0))}function m(){f.style.left=pageXOffset+"px";f.style.width=innerWidth+"px";f.style.top=pageYOffset+
"px";var a="orientation"in window&&90==Math.abs(orientation);f.style[k]="scaleY("+innerWidth/screen[a?"height":"width"]*2+")"}var f,h,k,n,l;return{init:function(){f=d.createElement("div");f.id="instantclick";h=d.createElement("div");h.id="instantclick-bar";h.className="instantclick-bar";f.appendChild(h);var a=["Webkit","Moz","O"];k="transform";if(!(k in h.style))for(var b=0;3>b;b++)a[b]+"Transform"in h.style&&(k=a[b]+"Transform");var c="transition";if(!(c in h.style))for(b=0;3>b;b++)a[b]+"Transition"in
h.style&&(c="-"+a[b].toLowerCase()+"-"+c);a=d.createElement("style");a.innerHTML="#instantclick{position:"+(Q?"absolute":"fixed")+";top:0;left:0;width:100%;pointer-events:none;z-index:2147483647;"+c+":opacity .25s .1s}.instantclick-bar{background:#29d;width:100%;margin-left:-100%;height:2px;"+c+":all .25s}";d.head.appendChild(a);Q&&(m(),addEventListener("resize",m),addEventListener("scroll",m))},start:a,done:e}}(),R="pushState"in history&&(!I.match("Android")||I.match("Chrome/"))&&"file:"!=e.protocol;
return{supported:R,init:function(){if(!k)if(R){for(var a=arguments.length-1;0<=a;a--){var b=arguments[a];!0===b?J=!0:"mousedown"==b?D=!0:"number"==typeof b&&(H=b)}k=w(e.href);h[k]={body:d.body,title:d.title,scrollY:pageYOffset};for(var b=d.head.children,c,a=b.length-1;0<=a;a--)c=b[a],c.hasAttribute("data-instant-track")&&(c=c.getAttribute("href")||c.getAttribute("src")||c.innerHTML,E.push(c));p=new XMLHttpRequest;p.addEventListener("readystatechange",W);L(!0);C.init();t("change",!0);addEventListener("popstate",
function(){var a=w(e.href);a!=k&&(a in h?(h[k].scrollY=pageYOffset,k=a,K(h[a].title,h[a].body,!1,h[a].scrollY)):e.href=e.href)})}else t("change",!0)},on:function(a,b){B[a].push(b)}}}(document,location);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long