- 增加文档

pull/141/head
icret 2023-02-06 01:40:22 +08:00
parent ee0abc2bb6
commit fb61891a03
55 changed files with 1264 additions and 789 deletions

743
README.md
View File

@ -1,9 +1,4 @@
## EasyImage 简单图床 2.0
> 始于2018年7月支持多文件上传,简单无数据库,返回图片url,markdown,bbscode,html的一款图床程序
演示地址:[https://png.cm/](https://png.cm/)
之前一直用的图床程序是:[PHP多图长传程序2.4.3](https://www.jb51.net/codes/40544.html)
由于版本过老并且使用falsh上传在当前html5流行大势所趋下遂利用基础知识新写了一个以html5为默认上传并且支持flash,向下兼容至IE9。
***本程序环境要求极低,适用于单一场景(游客上传)和个人使用,不适于多用户复杂场景***
## EasyImage2.0 简单图床
[![EasyImage2.0 GitHub's stars](https://img.shields.io/github/stars/icret/easyImage2.0?style=social)](https://github.com/icret/EasyImages2.0/stargazers)
[![EasyImage2.0 GitHub's forks](https://img.shields.io/github/forks/icret/easyimage2.0?style=social)](https://github.com/icret/EasyImages2.0/network/members)
@ -12,720 +7,64 @@
[![jsdelivr](https://data.jsdelivr.com/v1/package/gh/icret/EasyImages2.0/badge)](https://cdn.jsdelivr.net/gh/icret/EasyImages2.0@EasyImage2.0/)
[![License](https://img.shields.io/badge/license-GPL_V2.0-yellowgreen.svg)](https://github.com/icret/EasyImages2.0/blob/master/LICENSE)
[![QQ group](https://pub.idqqimg.com/wpa/images/group.png)](https://jq.qq.com/?_wv=1027&k=jfXRHU8Y)
<!--
[![stargazers](https://img.shields.io/github/stars/icret/EasyImages2.0)](https://github.com/icret/EasyImages2.0/stargazers)
[![Issues](https://img.shields.io/github/issues/icret/EasyImages2.0)](https://github.com/icret/EasyImages2.0/issues)
[![Code size](https://img.shields.io/github/languages/code-size/icret/EasyImages2.0?color=blueviolet)](https://github.com/icret/EasyImages2.0)
-->
>[演示](https://png.cm/) | [Chrome/Edge 插件](https://github.com/icret/EasyImage-Browser-Extension) | [使用手册](https://www.kancloud.cn/easyimage/easyimage/) | [社区讨论](https://github.com/icret/EasyImages2.0/discussions) | [Telegram](https://t.me/Easy_Image)
>
[演示](https://png.cm/) · [手册](https://www.kancloud.cn/easyimage/easyimage/) · [社区](https://github.com/icret/EasyImages2.0/discussions) · [Telegram](https://t.me/Easy_Image) - 插件: [Chrome](/doc/Chrome插件.md) · [Edge](/doc/Edge插件.md) · [PicGo](/doc/使用PicGo上传.md) · [ShareX](/doc/使用ShareX上传.md)
目录: [安装](/doc/安装图床.md) | [安全](/doc/安全配置.md) | [API](/doc/API.md) | [鉴黄](/doc/鉴黄.md) | [升级](/doc/图床更新升级.md) | [常见问题](/doc/常见问题.md) | [环境/兼容](#环境要求) | [更新日志](/doc/更新日志.md) | [打赏开发者](/doc/打赏开发者.md) | [鸣谢](#鸣谢) | [许可证](#开源许可)
> 始于2018年7月支持多文件上传,简单无数据库,返回图片url,markdown,bbscode,html的一款图床程序
演示地址:[https://png.cm/](https://png.cm/)
之前一直用的图床程序是:[PHP多图长传程序2.4.3](https://www.jb51.net/codes/40544.html)
由于版本过老并且使用falsh上传在当前html5流行大势所趋下遂利用基础知识新写了一个以html5为默认上传并且支持flash,向下兼容至IE9。
***本程序环境要求极低,适用于单一场景(游客上传)和个人使用,不适于多用户复杂场景***
>本人善写bug 发现bug可提交 [issues](https://github.com/icret/EasyImages2.0/issues) 追求稳定请下载 [稳定版](https://github.com/icret/EasyImages2.0/releases)
## 目录
[特点](#特点)-[注意](#常见问题)-[安装](#安装)-[升级](#程序升级)-[安全](#安全配置)-[API](#API上传)-[鉴黄](#鉴黄)-[更新日志](#更新日志)-[支持开发者](#支持开发者)-[界面演示](#界面演示)-[兼容](#兼容)-[鸣谢](#鸣谢)-[许可证](#开源许可)
## 特点
- [x] 支持仅登录后上传
- [x] 支持设置图片质量
- [x] 支持文字/图片水印
- [x] 支持设置图片指定宽/高
- [x] 支持上传图片转换为指定格式
- [x] 支持限制最低宽度/高度上传
- [x] 支持API
- [x] 在线管理图片
- [x] 支持网站统计
- [x] 支持设置广告
- [x] 支持图片鉴黄
- [x] 支持自定义代码
- [x] 支持上传IP黑白名单
- [x] 支持创建仅上传用户
- [x] 对于安装环境要求极低
- [x] 更多功能支持请安装尝试···
## 安装
> 推荐环境Nginx + PHP≥7.0 + linux
#### windows:
- 下载简单图床 [最新版](https://github.com/icret/EasyImages2.0/archive/refs/heads/master.zip)|[稳定版](https://github.com/icret/EasyImages2.0/releases) 上传至web根目录
#### Linux:
- `git clone https://github.com/icret/EasyImages2.0.git` 至安装目录
- 赋予安装目录www:www和0755权限:
```shell
chmod -R 755 /安装目录
chown -R www:www /安装目录
```
#### BT宝塔面板
- 安装环境 Ngixn(推荐) / Apache + PHP(推荐≥7.0)
- 软件商店搜索`简单图床`一键部署
>更多安装方式和问题请查阅->[使用手册](https://www.kancloud.cn/easyimage/easyimage/2625222)
## 常见问题
1. 请将所有文件赋予`0755`和`www`权限
2. 对`PHP`不太熟悉的请不要将图床程序放置于二级目录
3. 请关闭防跨站或删除域名文件夹内的`user.ini`文件 如`宝塔面板`|`军哥lnmp`
4. 网站域名与图片域名必须填写,如果只有一个域名请填写成一样的
5. 首次使用会执行安装程序并并在`config`目录生成`install.lock` 跳过安装流程请删除`install`目录
6. 首次访问首页会检查环境并在`config`目录下生成`EasyImage.lock`
7. 可以使用谷歌浏览器的调试模式查看错误`F12->console`
8. 提示 `upload File size exceeds the maximum value` 调整`PHP`上传大小
9. 提示 `undefined function imagecreatefromwebp()`GD没安装webp, 以此类推
10. 提示 `Warning: is_dir(): open_basedir restriction in effect`解决方法同`3`
11. 无法上传/访问/不显示验证码: 1. 权限问题见问题`1` 2. CDN缓存了 3. 防火墙拦截
12. 宝塔或者其他环境安装成功但是上传失败,多数原因是防火墙拦截上传,取消拦截即可
13. `Fatal error: Allowed memory size......`主机内存或分配给PHP的内存不够 解决方法百度
14. 开启原图保护功能后打开图片链接显示`404`是因为`nginx`或`Apache`页面缓存导致的,`Nginx`解决办法:
```Nginx
# 把Nginx这段配置删掉
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
```
#### API上传
<details><summary>通过API上传示例</summary>
- html示例
```html
<form action="http://127.0.0.1/api/index.php" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*">
<input type="text" name="token" placeholder="在tokenList文件找到token并输入" /> <input type="submit" />
</form>
```
- Python示例
```python
import requests
url = "https://png.cm/api/index.php"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n8337effca0ddfcd9c5899f3509b23657\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n195124.jpg\r\n-----011000010111000001101001--\r\n\r\n"
headers = {"content-type": "multipart/form-data; boundary=---011000010111000001101001"}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
```
- curl示例
```curl
curl --request POST \
--url https://png.cm/api/index.php \
--header 'content-type: multipart/form-data' \
--form token=8337effca0ddfcd9c5899f3509b23657 \
--form image=@195124.jpg
```
- JQuery示例
```jQuery
const form = new FormData();
form.append("token", "8337effca0ddfcd9c5899f3509b23657");
form.append("image", "195124.jpg");
const settings = {
"async": true,
"crossDomain": true,
"url": "https://png.cm/api/index.php",
"method": "POST",
"headers": {},
"processData": false,
"contentType": false,
"mimeType": "multipart/form-data",
"data": form
};
$.ajax(settings).done(function (response) {
console.log(response);
});
```
</details>
- 需要开启图床安全->API上传示例
- 上传成功后返回JSON
```json
{
"result":"success","code":200,
"url":"https:\/\/i2.100024.xyz\/2023\/01\/24\/10gwv0y-0.webp",
"srcName":"195124",
"thumb":"https:\/\/png.cm\/application\/thumb.php?img=\/i\/2023\/01\/24\/10gwv0y-0.webp",
"del":"https:\/\/png.cm\/application\/del.php?hash=bW8vWG4vcG8yM2pLQzRJUGI0dHlTZkN4L2grVmtwUTFhd1A4czJsbHlMST0="
}
```
## 程序升级
- 备份`config`目录(没有增加上传用户和api可以只保留`config.php`文件)和`上传文件目录`
- 将新程序下载至网站目录解压覆盖,然后将备份的文件替换既完成升级
- 如果出现错误请在设置中把所有设置中底部按钮 `保存` 一次
## 安全配置
- Apache环境在上传目录添加配置文件`.htaccess` 使上传目录不可运行PHP程序默认已经存在)
```Apache
<FilesMatch "\.(?i:php|php3|php4|php5)">
Order allow,deny
Deny from all
</FilesMatch>
```
- Nginx环境禁止多个目录运行`PHP`程序:
```Nginx
# "i|public"是你要禁止的目录 放到listen段落之后才生效
location ~* ^/(i|public)/.*\.(php|php5)$
{
deny all;
}
```
- Lighthttpd环境禁止多个目录运行`PHP`程序:
```Lighthttpd
$HTTP["url"] =~ "^/(i|public)/" {
fastcgi.server = ()
}
```
## 鉴黄
图床支持moderatecontent和nsfwjs方式鉴黄
- moderatecontent
1. 注册[moderatecontent](https://client.moderatecontent.com/)并获取Token
2. 后台API设置中填入Moderate Key
3. 后台图片安全图片鉴黄以moderatecontent方式
- nsfwjs [nsfwjs docker](https://hub.docker.com/r/icret/nsfw_restful_api)
1. 确定已安装`docker`和`docker-compose`
2. 拉取镜像 `docker pull icret/nsfw_restful_api:latest` 或者直接 `docker run -p 3307:3307 -d icret/nsfw_restful_api`
3. 后台API设置中填入网址 比如:`http://IP:3307/api/nsfw/classify?url=`
4. 后台图片安全图片鉴黄以nsfwjs方式
5. 如果你使用别的nsfwjs api,必须返回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
}]
```
## 更新日志
<details><summary>点击查看2.0版更新日志</summary>
* 2023-02-05 v2.7.4 dev
- 此版本将作为优化和修复bugs
* 2023-02-05 v2.7.3
- 修复设置中手动压缩失败!
- 优化排版
* 2023-02-05 v2.7.2
- 增加删除单条历史上传记录
- 增加 [web-indexr](https://github.com/rehiy/web-indexr) 文件管理, 正在实验中
- - 作为 [Tinyfilemanager](https://github.com/prasathmani/tinyfilemanager) 的替代品 更轻量化 简单化
- 修复开启登录上传后,上传者账号上传失败 [#87](https://github.com/icret/EasyImages2.0/issues/87#issue-1569794639)
- 修复检测登录状态错误
- 优化排版和移动端显示
* 2023-02-01 v2.7.1
- 更新版本号
* 2023-02-01 v2.7.0
- 增加限制游客上传
- 增加上传历史记录
- 增加粘贴上传状态
- 增加广场非图片图标
- 增加前端显示缩略图链接
- 增加每日获取Bing图片背景
- 增加图片详细信息管理登录后显示更多信息
- 增加解析上传IP地址 (使用方法参考提示信息)
- 修复图片详细信息中随机图片排版混乱
- 替换访问生成缩略图代码
- 更新一些组件
- 调整前端显示
- 优化代码
* 2023-01-21 v2.6.9 Happy New Year
- 修复BMP格式无法增加水印(不建议开启,非常耗时)
- 修复上传用户组会串联变成管理员权限 [#61](https://github.com/icret/EasyImages2.0/issues/61)
- 增加了上传提示和登录提示
- 增加自定义存储分类路径 设置方法参考 [PHP date() 函数](https://www.runoob.com/php/php-date.html)
- 更改后台部分管理设置的位置
- 优化操作逻辑和信息提示
* 2022-12-30 v2.6.8
- 上传组件支持到 PHP 8.2
- 修复下载任意文件漏洞 [#75](https://github.com/icret/EasyImages2.0/issues/75)
- 增加自定义底部信息
- 增加自定义管理提示
- 增加图床模式
- 危险:除图片外不验证文件是否正常,也代表可以上传任意指定格式!
- 增加上传时生成缩略图(仅设置直链缩略图时生效)低配vps负载较大,影响前端上传速度!
- 其他一些优化
* 2022-09-20 v2.6.7
- 优化后台显示
- 增加控制缩略图尺寸
- 修复启用Opcache带来的问题 [#57](https://github.com/icret/EasyImages2.0/issues/57)
* 2022-07-10 v2.6.6
- 增加文件uuid命名
- 界面美化
* 2022-07-10 v2.6.6
- 增加图片信息显示随机图片
- 增加文件雪花命名
- 增加举报入口
- 更新组件
* 2022-05-27 v2.6.5
- 更改文件位置
* 2022-05-26 v2.6.4
- 更改版本显示方式
* 2022-05-26 v2.6.3
- 增加图片下载
- 增加简单暗黑模式
- 增加读取上传日志
- 增加广场浏览往日限制
- 有助于防爬虫抓取
- 增加登陆验证码开关(默认关闭)
- 删除图片详情页Exif信息
- 文件管理中图片使用缩略图显示
- 更改广场->信息中图片长宽获取方式
- 优化图片详情页/广场UI/日志/用户/api 列表
* 2022-05-04 v2.6.2
- 增加API/用户文件浏览和删除
- 增加转换webp后也会添加水印
- 转换成webp后不建议开启水印,会增大图片体积
- webp水印消耗更多PHP内存,PHP8以上有很大概率失败
- 更改广场页面返回顶部
- 优化了管理界面UI
- 修复一些bug
* 2022-05-03 v2.6.1
- 增加登陆用户有效期
- 增加管理员/登陆用户/Token专用目录
- 增加转换图片格式后压缩图片(不建议同时开启后端压缩)
- 增加隐藏存储路径(网站域名与图片域名不同且图片域名需绑定到图片目录)
- 直链缩略图支持bmp,webp
- 本次更新较大,建议重新安装!
* 2022-04-29 v2.6.0
- 修复源图缺陷
- 修复API回收不能还原问题
- 布局修改
- 登录页美化
- 屏蔽登陆页面chrome类浏览器自动填充
* 2022-04-02 v2.5.9
- 增加安装提示
- 增加忘记密码提示
- 增加检测水印图片/水印字体是否存在
- 修复登陆逻辑
- 修复广场重复显示图片
- 修改广场删除/回收样式
- 调整了广告的位置
- 调整后台设置分表
* 2022-04-02 v2.5.8
- 修复在PHP8环境下的bugs
- 修复删除token产生的bug
- 更改顶部广告位置
- 更改广场样式
* 2022-3-30 v2.5.7
- 增加弹窗公告
- 恢复文件管理
- 微调了广场样式
- 微调了删除文件
- 删除了base.php
- 日志记录上传IP端口
- 日志记录通过API上传的ID
- 修复管理页面短标签bug [#30](https://github.com/icret/EasyImages2.0/issues/30#issue-1185821542)
- 修复图片回收中批量删除失败
- 修复广场预览ico格式文件失败
- 修复个别浏览器显示二维遮住网页 [#28](https://github.com/icret/EasyImages2.0/issues/28#issue-1180675728)
- 缩略图最大生成与用户设置最大上传关联
- 安全检测中检测本地域名改为检测局域网
* 2022-3-13 v2.5.6
- 修复加密删除后不能正确提示
- 修复webp转换其他格式失败
- 修复文字水印透明度不生效
- 修复jscolor显示不正确
- 增加原图保护
- 增加检测版本
* 2022-3-4 v2.5.5
- 增加设置页面检测是否开启登录上传
- 将footer固定在底部
- 移除function_API.php
- 修复TimThumb不支持bmp格式的bug
- 修复TimThumb不支持webp动态图片bug
* 2022-2-29 v2.5.4
- 增加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
- 优化页面排版
- 更改部分命名
- 增加后端压缩率
- 增加可以显示多条公告
- 增加上传后是否显示删除
- 增加可以关闭广场/统计导航|页面
- 调整登录和退出文件位置
- 调整二维码内容为每个页面
- 更换验证码库并不再区分大小写
- 修复一处有概率暴露图片绝对路径的bug
* 2022-1-22 v2.4.6
- 视图优化
- 删除重复内容
- 增加图片信息页面
- 增加上传黑/白名单
- 修复因关闭上传日志而导致的无法鉴黄和后端压缩图片
- 修复安装时更改管理员账号失败
- 修复更改管理员账户后无法退出
* 2022-1-13 v2.4.5
- 修复一处权限问题
- 修复恢复可疑图片
- 增加复制提示
- 增加默认上传后首选显示链接
* 2022-1-3 v2.4.5 beta
- 增加复制提示
- 更新安装代码
- 更改前端样式
- 更新上传格式
- 重构了密码验证
- 使用md5存储密码
- 增加后台设置提示
- 增加更改网站配色
- 增加缩略图索引格式
- 调整后台分类及位置
- 增加在线修改账号密码
- 增加以源文件名称命名
- 增加缩略图两种生成方式和开关
- 修复开启前端压缩导致的上传图片异常
- 屏蔽因缺少PHP扩展而不能生成缩略图的格式
* 2021-12-25 v2.4.4
- 更改favicon.ico
- 修复缩略图数量统计
- 增加缩略图生成开关
- 日志增加更多文件信息
- 前端增加裁剪和压缩质量
- 上传失败将会输出更多信息
- 修复前端压缩图片不能关闭问题
- 修复上传设置中错误和页面显示
- 调整网站设置->上传设置的排序
- 将快捷操作中心转移到网站设置中
- 修复因生成缩略图导致的前端数据返回失败
- 增加简单图床chrome浏览器插件可自行配置网站->[EasyImage-Browser-Extension](https://github.com/icret/EasyImage-Browser-Extension)
* 2021-11-17 v2.4.3
- 增加登录验证码
- 二级目录安装
- 一些优化
* 2021-11-14 v2.4.2
- 增加上传日志
* 2021-11-12 v2.4.1
- 增加缓存周期配置
- 增加上传统计
- 增加viewjs
- 更新依赖件
- 修复统计错误
* 2021-11-9 v2.4.0
- 增加统计缓存
- 增加最近30天上传统计与占用空间图表
- 增加初始化安装可能会不支持二级目录安装可删除install文件夹初始化)
- 增加在线编辑配置(之前是需要修改config.php文件现在可以直接网站端修改了)
- 删除广场会导致浏览速度变慢的代码
- 删除快捷配置会导致浏览速度变慢的代码
* 2021-11-3 v2.3.2
- 增加广场图片缓存
- 重构广场样式
* 2021-11-3 v2.3.1
- 增加监黄接口
- 增加审核违规图片
- 修复对php5.6的支持
- 修复二级目录的安装
* 2021-10-24 v2.3.0
- 将服务器环境监测改为第一次打开时自动检测如需再次展示需删除config目录下的EasyImage.lock
- 增加快捷操作中心显示服务信息
- 增加对上传文件的命名方式详见config.php文件里的注释
- 增加隐私政策、服务条款、DMCA
- 增加自定义静态文件CDN源
- 增加dns-prefetch
- 删除了tinyfilemanager文件管理感觉没什么用
- 一些bug得以修复
* 2021-5-22 v2.2.0
- 增加根目录静态属性
- 增加浏览页面懒加载
- 增加浏览页面启用选定日期查看图片
- 增加版本检测 ***每月10日06点和25日01点检测Github是否更新***
- 增加上传压缩 ***此压缩有可能使图片变大!特别是小图片 也有一定概率改变图片方向***
- 增加批量压缩目录 ***TinyPng或本机压缩本机压缩出现的问题***
- 修复title
- 修复二级目录安装
- 修复对PHP5.6的兼容 ***建议使用php7.0及以上!***
* 2021-5-8 v2.1.1
- 修复上传界面上传失败提示信息bug
- 浏览页面重构
- 删除页面添加登录删除
- 调整首页显示
- 将调整图片长宽放置前端,减小资源开销
- 其他小调整
* 2021-5-2 v2.1
- 将tinyfilemanager配置文件简单翻译并集成到config.php
- 增加底部自定义信息
- 增加检测PHP环境给与提示
- 增加删除图片url服务器不会保存删除链接
- 恢复随机浏览20张上传图片 可以设定浏览数量和关闭浏览
- - 随机浏览图片可以在线删除
- 可以使用 https://png.cm/libs/list.php?num=100 定义浏览数量
- 修复一些调用
- 更改二维码显示方式
- 开启api 需要token验证上传
- 重构并修复check.php相关文件
- 重构部分代码
- 更改目录结构
- 增加安全性配置
- * Apache配置文件默认设置上传目录不可运行
```Apache
RewriteEngine on RewriteCond % !^$
RewriteRule i/(.*).(php)$ [F]
RewriteRule public/(.*).(php)$ [F]
RewriteRule config/(.*).(php)$ [F]
```
- * Nginx请在Nginx配置
```Nginx
# 禁止运行php的目录
location ~* ^/(i|public|config)/.*\.(php|php5)$
{
deny all;
}
```
- - 或者参考https://blog.png.cm/939.html
- 一些精简
* 2021-4-14 v2.0.2.1 Dev1
- 更新静态文件版本
- 请所有更新过2.0.2.1版本升级到此版本
- 更改一些描述
- md5提交登录验证
- 登录上传也显示公告
* 2021-03-28 v2.0.2.1
- 更新管理程序,修复部分漏洞
- 修复不能等比例缩小图片
- 支持php8
* 2019-6-26 v2.0.2.0
- 精简压缩代码,使得不再压缩后反而变大
- 删除异域上传功能,不再支持异域上传
- 修复开启登录后无法粘贴密码
- 后台控制上传数量,上传格式
- 其他一些优化
* 2019-6-14 v2.0.1.9
- 增加复制链接按钮
- 增加暂停上传按钮
- 增加QQ截图剪切板上传
- 增加文字/图片水印透明度
- 恢复开启/关闭api上传
- 恢复支持水印文字颜色
- 恢复支持远程上传图片
- 修复安装时候的权限
- 修复管理无法多选的问题
- 修复上传透明png背景变为纯黑的问题
- 修复成功上传图片但前端无法获取链接
- 修复在centos64 lnmp1.6 php7.1环境下的图片信息读取问题
- 修改图片压缩方式速度更快相比之前提高5倍以上
- 更改管理路径
- 更改上传路径,文件名更短
- 更改上传显示方式为缩略图
- 关闭添加图片后自动上传
- 纪念一下2019年将版本号改为2.0.1.9
* 2019-5-23 v2.0
- 在继承上个版本1.6.4)的基础上进行了全新优化
- 修复上传经常失败的问题
- 删除一些不常用但会增加功耗的过程
- 全新的压缩 将文件继续缩小
- 全新的目录系统,精简代码
- 设置仅允许在config.php修改注释更加明了即使没有代码基础也可以操作
- 增加新的文件管理系统,感谢 tinyfilemanager
- ~~支持文字/图片水印 可自定义文字颜色~~
- ~~支持文字水印背景颜色~~
- ~~支持文字水印透明度~~
- ~~支持删除远程上传文件~~ -> 不再支持删除远程文件
- ~~(支持开启/关闭api自定义文字水印)~~
- ~~支持删除自定义删除图片(仅管理员)~~
</details>
<details><summary>与1.6.4版本差别</summary>
##### 不建议再使用 [EasyImage 1.6.4版本](https://github.com/icret/easyImages)
- 在继承上个版本([1.6.4](https://github.com/icret/easyImages "1.6.4"))的基础上进行了全新优化
- 修复上传经常失败的问题
- 删除一些不常用但会增加功耗的过程 (删除的在下边会有标记)
- 全新的压缩 将文件继续缩小
- 全新的目录系统,精简代码
- 设置仅允许在config.php修改注释更加明了即使没有代码基础也可以操作
- 增加新的文件管理系统,感谢 tinyfilemanager
- ~~支持文字/图片水印 可自定义文字颜色~~
- ~~支持文字水印背景颜色~~
- ~~支持文字水印透明度~~
- ~~支持删除远程上传文件~~ -> 不再支持删除远程文件
- ~~(支持开启/关闭api自定义文字水印)~~
- ~~支持删除自定义删除图片(仅管理员)~~
</details>
## 支持开发者
| 支付宝支持 | 微信支持 |
| :---------------------------------------: | :-------------------------------------: |
| ![支付宝支持](./public/images/alipay.jpg) | ![微信支持](./public/images/wechat.jpg) |
* [x] 支持仅登录后上传
* [x] 支持设置图片质量
* [x] 支持文字/图片水印
* [x] 支持设置图片指定宽/高
* [x] 支持上传图片转换为指定格式
* [x] 支持限制最低宽度/高度上传
* [x] 支持API
* [x] 在线管理图片
* [x] 支持网站统计
* [x] 支持设置广告
* [x] 支持图片鉴黄
* [x] 支持自定义代码
* [x] 支持上传IP黑白名单
* [x] 支持创建仅上传用户
* [x] 对于安装环境要求极低
* [x] 更多功能支持请安装尝试···
## 界面演示
![简单图床 - 上传界面](./install/README/674074848.png)
![简单图床 - 广场界面](./install/README/3053540273.png)
![简单图床 - 后台界面](./install/README/2657944724.png)
![简单图床 - 统计界面](./install/README/1305032567.png)
![简单图床 - 图片信息](./install/README/info.png)
![简单图床 - 上传日志](./install/README/log.png)
![简单图床 - 上传界面](./docs/images/README/674074848.png)
![简单图床 - 广场界面](./docs/images/README/3053540273.png)
![简单图床 - 后台界面](./docs/images/README/2657944724.png)
![简单图床 - 统计界面](./docs/images/README/1305032567.png)
![简单图床 - 图片信息](./docs/images/README/info.png)
![简单图床 - 上传日志](./docs/images/README/log.png)
## 环境要求
> 推荐环境Nginx + PHP≥7.0 + linux
## 兼容
- ##### 兼容
- 最低`PHP 5.6`,推荐`PHP≥7.0`及以上版本需要PHP支持`Fileinfo,iconv,zip,mbstring,openssl`扩展,如果缺失会导致无法上传/删除图片
- 文件上传视图提供文件列表管理和文件批量上传功能,允许拖拽(需要`HTML5`支持)来添加上传文件,支持上传大图片,优先使用`HTML5`旧得浏览器自动使用`Flash和Silverlight`的方式兼容
>最低`PHP 5.6`,推荐`PHP≥7.0`及以上版本需要PHP支持`Fileinfo,iconv,zip,mbstring,openssl`扩展,如果缺失会导致无法上传/删除图片
文件上传视图提供文件列表管理和文件批量上传功能,允许拖拽(需要`HTML5`支持)来添加上传文件,支持上传大图片,优先使用`HTML5`旧得浏览器自动使用`Flash和Silverlight`的方式兼容
## 鸣谢
- [verot](https://github.com/verot/class.upload.php "verot" )
- [ZUI](https://github.com/easysoft/zui "ZUI" )
- [verot](https://github.com/verot/class.upload.php "verot" )
- [ZUI](https://github.com/easysoft/zui "ZUI" )
## 开源许可
- [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 Developer By [Icret](https://github.com/icret)
* have fun!
* have fun!
[![项目状态](https://repobeats.axiom.co/api/embed/0922803f14091f0686de26fee5196b9984b106a4.svg "Repobeats analytics image")](https://png.cm)
[![Stargazers over time](https://starchart.cc/icret/EasyImages2.0.svg)](https://github.com/icret/EasyImages2.0/stargazers)

View File

@ -11,19 +11,38 @@ require_once APP_ROOT . '/config/config.guest.php';
if (!is_who_login('admin')) {
echo '
<script> new $.zui.Messager("请使用管理员账户登录! ", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();</script>';
header("refresh:2;url=" . $config['domain'] . "/admin/index.php");
require_once APP_ROOT . '/application/footer.php';
exit;
}
// 定义文件位置
$config_file = APP_ROOT . '/config/config.php'; // config.php
$api_key_file = APP_ROOT . '/config/api_key.php'; // api_key.php
$guest_config_file = APP_ROOT . '/config/config.guest.php'; // config.guest.php
// 修改config配置
if (isset($_POST['update'])) {
$postArr = $_POST;
if (isset($postArr['user'])) {
if ($postArr['user'] == $guestConfig[$postArr['user']])
echo '
<script>
new $.zui.Messager("管理员账号不能与上传者账号相同!", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
</script>
';
exit(header("refresh:1;"));
}
$new_config = array_replace($config, $postArr);
$config_file = APP_ROOT . '/config/config.php';
cache_write($config_file, $new_config);
echo '
<script>
@ -49,8 +68,7 @@ if (isset($_POST['add_token_id'])) {
)
);
$new_config = array_replace($tokenList, $postArr);
$config_file = APP_ROOT . '/config/api_key.php';
cache_write($config_file, $new_config, 'tokenList');
cache_write($api_key_file, $new_config, 'tokenList');
echo '
<script>
new $.zui.Messager("API Token 添加成功!", {
@ -73,8 +91,7 @@ if (isset($_GET['stop_token'])) {
)
);
$new_config = array_replace($tokenList, $postArr);
$config_file = APP_ROOT . '/config/api_key.php';
cache_write($config_file, $new_config, 'tokenList');
cache_write($api_key_file, $new_config, 'tokenList');
echo '
<script>
new $.zui.Messager("禁用 API Token 成功!", {
@ -89,8 +106,7 @@ if (isset($_GET['stop_token'])) {
// 删除Token
if (isset($_GET['delete_token'])) {
unset($tokenList[$_GET['delete_token']]);
$config_file = APP_ROOT . '/config/api_key.php';
cache_write($config_file, $tokenList, 'tokenList');
cache_write($api_key_file, $tokenList, 'tokenList');
echo '
<script>
new $.zui.Messager("删除 API Token 成功!", {
@ -113,8 +129,7 @@ if (isset($_GET['stop_guest'])) {
)
);
$new_config = array_replace($guestConfig, $postArr);
$config_file = APP_ROOT . '/config/config.guest.php';
cache_write($config_file, $new_config, 'guestConfig');
cache_write($guest_config_file, $new_config, 'guestConfig');
echo '
<script>
new $.zui.Messager("禁用上传用户成功!", {
@ -130,8 +145,7 @@ if (isset($_GET['stop_guest'])) {
// 删除用户
if (isset($_GET['delete_guest'])) {
unset($guestConfig[$_GET['delete_guest']]);
$config_file = APP_ROOT . '/config/config.guest.php';
cache_write($config_file, $guestConfig, 'guestConfig');
cache_write($guest_config_file, $guestConfig, 'guestConfig');
echo '
<script>
new $.zui.Messager("删除上传用户成功!", {
@ -143,19 +157,48 @@ if (isset($_GET['delete_guest'])) {
header("refresh:1;url=/admin/admin.inc.php");
}
// 添加管理员修改config.php
if (isset($_POST['admin_form'])) {
$postArr = $_POST;
if (isset($guestConfig[$postArr['user']])) {
echo '
<script>
new $.zui.Messager("管理员账号不能与上传者账号相同!", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
</script>
';
exit(header("refresh:3;"));
}
$postArr = array('user' => $postArr['user'], 'password' => $postArr['password']);
$new_config = array_replace($config, $postArr);
cache_write($config_file, $new_config);
echo '
<script>
new $.zui.Messager("保存成功", {
type: "primary", // 定义颜色主题
icon: "ok-sign" // 定义消息图标
}).show();
</script>
';
header("refresh:1;");
}
// 添加上传账号 修改config.guest.php
if (isset($_POST['uploader_form'])) {
// 禁止与管理员登录名相同
if ($_POST['uploader_user'] == $config['user']) {
echo '
<script>
new $.zui.Messager("上传用户不能与管理员用户名相同!", {
new $.zui.Messager("上传用户账号不能与管理员账号相同!", {
type: "danger", // 定义颜色主题
icon: "exclamation-sign" // 定义消息图标
}).show();
</script>
';
exit(header("refresh:1;"));
exit(header("refresh:3;"));
}
// 写入上传者用户数据
$postArr = array(
@ -166,8 +209,7 @@ if (isset($_POST['uploader_form'])) {
)
);
$new_config = array_replace($guestConfig, $postArr);
$config_file = APP_ROOT . '/config/config.guest.php';
cache_write($config_file, $new_config, 'guestConfig');
cache_write($guest_config_file, $new_config, 'guestConfig');
echo '
<script>
new $.zui.Messager("上传用户添加成功!", {
@ -428,7 +470,6 @@ if (isset($_POST['del_version_file'])) {
</div>
</form>
</div>
<div class="tab-pane fade" id="Content3">
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<div class="form-group">
@ -462,7 +503,7 @@ if (isset($_POST['del_version_file'])) {
<div class="tab-pane fade " id="Content4">
<form action="../application/compressing.php" method="post" target="_blank">
<h5 class="header-dividing">压缩文件夹</h5>
<div class=" col-md-12">
<div class="col-md-12">
<div class="form-group col-md-4">
<input type="text" class="form-control form-date" placeholder="" name="folder" value="<?php echo date('Y/m/d/'); ?>" readonly="">
</div>
@ -483,7 +524,7 @@ if (isset($_POST['del_version_file'])) {
</div>
</form>
</div>
<div class="tab-pane fade " id="Content5">
<div class="tab-pane fade" id="Content5">
<h5 class="header-dividing">外部KEY</h5>
<form class="form-condensed" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post" style="margin-bottom: 10px;">
<div class="form-group col-md-4">
@ -502,7 +543,7 @@ if (isset($_POST['del_version_file'])) {
<input type="hidden" class="form-control" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
<button type="submit" class="btn btn-primary">保存KEY</button>
</form>
<h5 class="page-header">Token列表: <?php if (!$config['token_path_status']) echo '<small>* 部分按钮需开启Token分离才能激活, 删除后不可恢复</small>'; ?></h5>
<h5 class="page-header">Token API 管理: <?php if (!$config['token_path_status']) echo '<small>* 部分按钮需开启Token分离才能激活, 删除后不可恢复</small>'; ?></h5>
<p class="text-primary">API调用地址: <code><?php echo $config['domain']; ?>/api/index.php</code></p>
<div id="myDataGrid" class="datagrid table-bordered">
<div class="input-control search-box search-box-circle has-icon-left has-icon-right" id="searchboxExample2" style="margin-bottom: 10px;">
@ -574,7 +615,7 @@ if (isset($_POST['del_version_file'])) {
</div>
<div class="form-group">
<label for="report" data-toggle="tooltip" title="举报地址支持Zoho表单、金数据、表单大师等<br/>(推荐ZOHO)留空则不显示">举报地址 <a href="https://store.zoho.com.cn/referral.do?servicename=ZohoForms&category=ZohoForms&ref=52f8a4e98a7a7d4c2475713784605af0dc842f6cc9732dd77f37b87f2959149e212e550f50a869f70360f15b80a4abc6" target="_blank"><i class="icon icon-external-link"></i></a></label>
<input type="text" class="form-control" id="report" name="report" value="<? if ($config['report']) echo $config['report']; ?>" placeholder="可以是网址或邮箱" onkeyup="this.value=this.value.replace(/\s/g,'')">
<input type="text" class="form-control" id="report" name="report" value="<? if (isset($config['report'])) echo $config['report']; ?>" placeholder="可以是网址或邮箱" onkeyup="this.value=this.value.replace(/\s/g,'')">
</div>
<div class="form-group">
<div class="switch switch-inline">
@ -1061,24 +1102,26 @@ if (isset($_POST['del_version_file'])) {
</div>
<div class="form-group col-md-4">
<div class="input-control has-icon-left">
<input type="text" name="password" id="password" class="form-control" value="<?php echo $config['password']; ?>" required="required" placeholder="更改管理密码" onkeyup="this.value=this.value.replace(/\s/g,'')">
<input type="text" name="password" id="password" class="form-control" value="" required="required" placeholder="更改管理密码" onkeyup="this.value=this.value.replace(/\s/g,'')">
<input type="hidden" name="password" id="md5_password">
<label for="password" class="input-control-icon-left"><i class="icon icon-key"></i></label>
</div>
</div>
<div class="form-group col-md-4">
<input type="hidden" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
<button type="submit" class="btn btn-primary">更改管理员 账号/密码</button>
<input type="hidden" name="admin_form" value="" placeholder="隐藏的保存">
<button type="submit" class="btn btn-primary">更改管理员 账号|密码</button>
</div>
</div>
<div class="alert alert-primary with-icon col-xs-8">
<i class="icon-info-sign"></i>
<div class="content">
<p>直接输入账号和密码即可完成修改.</p>
<p>更改后会立即生效并重新登录,请务必牢记账号和密码! </p>
<p>如果忘记账号可以打开-><code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'user'=><strong>admin</strong>'">user</code>对应的键值->填入</p>
<p>如果忘记密码请将密码->转换成MD5小写-><a href="<?php echo $config['domain'] . '/application/md5.php'; ?>" target="_blank" class="text-purple">转换网址</a>->打开<code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'password'=>'<strong>e6e0612609</strong>'">password</code>对应的键值->填入</p>
<ul>
<li>管理员账号不能与上传者账号相同</li>
<li>直接输入账号和密码即可完成修改</li>
<li>更改后会立即生效并重新登录,请务必牢记账号和密码! </li>
<li>如果忘记账号可以打开-><code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'user'=><strong>admin</strong>'">user</code>对应的键值->填入</li>
<li>如果忘记密码请将密码->转换成MD5小写-><a href="<?php echo $config['domain'] . '/application/md5.php'; ?>" target="_blank" class="text-purple">转换网址</a>->打开<code>/config/config.php</code>文件->找到<code data-toggle="tooltip" title="'password'=>'<strong>e6e0612609</strong>'">password</code>对应的键值->填入</li>
</ul>
</div>
</div>
</form>
@ -1107,17 +1150,20 @@ if (isset($_POST['del_version_file'])) {
</div>
</div>
<div class="form-group col-md-3">
<input type="hidden" name="uploader_form" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">
<button type="submit" class="btn btn-danger">添加/更改 上传者 账号/密码</button>
<input type="hidden" name="uploader_form" value="" placeholder="隐藏的保存">
<button type="submit" class="btn btn-danger">添加|更改 上传者 账号|密码</button>
</div>
</div>
<div class="alert alert-primary with-icon col-xs-8">
<i class="icon-info-sign"></i>
<div class="content">
<p>上传用户的配置文件在<code>config.guest.php</code></p>
<p>开启登录上传后,可以添加一些只能上传的账号</p>
<p>更改后会立即生效并重新登录,请将账号和密码发给使用者</p>
<p>如果忘记密码请填入账号并填写新的密码即可更正密码 | <b class="text-success">与更改管理 账号/密码不同!</b></p>
<ul>
<li>上传用户账号不能与管理员账号相同</li>
<li>上传用户的配置文件在<code>config.guest.php</code></li>
<li>开启登录上传后,可以添加一些只能上传的账号</li>
<li>更改后会立即生效并重新登录,请将账号和密码发给使用者</li>
<li>如果忘记密码请填入账号并填写新的密码即可更正密码 | <b class="text-success">与更改管理 账号/密码不同!</b></li>
</ul>
</div>
</div>
</form>
@ -1196,54 +1242,48 @@ if (isset($_POST['del_version_file'])) {
</div>
<div class="tab-pane fade" id="Content12">
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<div class="col-md-12">
<div class="form-group col-md-6">
<label>水印方式</label>
<select class="chosen-select form-control" name="watermark">
<option value="0" <?php if (!$config['watermark']) echo 'selected'; ?>>关闭水印</option>
<option value="1" <?php if ($config['watermark'] == 1) echo 'selected'; ?>>文字水印</option>
<option value="2" <?php if ($config['watermark'] == 2) echo 'selected'; ?>>图片水印</option>
</select>
</div>
<div class="form-group col-md-6">
<label data-toggle="tooltip" title="不开启水印方式不生效">水印位置</label>
<select class="chosen-select form-control" name="waterPosition">
<option value="0" <?php if (!$config['waterPosition']) echo 'selected'; ?>>随机位置</option>
<option value="1" <?php if ($config['waterPosition'] == 1) echo 'selected'; ?>>顶部居左</option>
<option value="2" <?php if ($config['waterPosition'] == 2) echo 'selected'; ?>>顶部居中</option>
<option value="3" <?php if ($config['waterPosition'] == 3) echo 'selected'; ?>>顶部居右</option>
<option value="4" <?php if ($config['waterPosition'] == 4) echo 'selected'; ?>>左边居中</option>
<option value="5" <?php if ($config['waterPosition'] == 5) echo 'selected'; ?>>图片中心</option>
<option value="6" <?php if ($config['waterPosition'] == 6) echo 'selected'; ?>>右边居中</option>
<option value="7" <?php if ($config['waterPosition'] == 7) echo 'selected'; ?>>底部居左</option>
<option value="8" <?php if ($config['waterPosition'] == 8) echo 'selected'; ?>>底部居中</option>
<option value="9" <?php if ($config['waterPosition'] == 9) echo 'selected'; ?>>底部居右</option>
</select>
</div>
<div class="form-group col-md-6">
<label>水印方式</label>
<select class="chosen-select form-control" name="watermark">
<option value="0" <?php if (!$config['watermark']) echo 'selected'; ?>>关闭水印</option>
<option value="1" <?php if ($config['watermark'] == 1) echo 'selected'; ?>>文字水印</option>
<option value="2" <?php if ($config['watermark'] == 2) echo 'selected'; ?>>图片水印</option>
</select>
</div>
<div class="col-md-12">
<div class="form-group col-md-6">
<label data-toggle="tooltip" title="支持GIF,JPG,BMP,PNG和PNG alpha">图片水印路径</label>
<input type="text" class="form-control" name="waterImg" required="required" value="<?php echo $config['waterImg']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
</div>
<div class="form-group col-md-6">
<label data-toggle="tooltip" title="水印中含有中文的,请选用符合GB/2312的字体">文字水印字体路径</label>
<input type="text" class="form-control" name="textFont" required="required" value="<?php echo $config['textFont']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
</div>
<div class="form-group col-md-6">
<label data-toggle="tooltip" title="不开启水印方式不生效">水印位置</label>
<select class="chosen-select form-control" name="waterPosition">
<option value="0" <?php if (!$config['waterPosition']) echo 'selected'; ?>>随机位置</option>
<option value="1" <?php if ($config['waterPosition'] == 1) echo 'selected'; ?>>顶部居左</option>
<option value="2" <?php if ($config['waterPosition'] == 2) echo 'selected'; ?>>顶部居中</option>
<option value="3" <?php if ($config['waterPosition'] == 3) echo 'selected'; ?>>顶部居右</option>
<option value="4" <?php if ($config['waterPosition'] == 4) echo 'selected'; ?>>左边居中</option>
<option value="5" <?php if ($config['waterPosition'] == 5) echo 'selected'; ?>>图片中心</option>
<option value="6" <?php if ($config['waterPosition'] == 6) echo 'selected'; ?>>右边居中</option>
<option value="7" <?php if ($config['waterPosition'] == 7) echo 'selected'; ?>>底部居左</option>
<option value="8" <?php if ($config['waterPosition'] == 8) echo 'selected'; ?>>底部居中</option>
<option value="9" <?php if ($config['waterPosition'] == 9) echo 'selected'; ?>>底部居右</option>
</select>
</div>
<div class="col-md-12">
<div class="form-group col-md-3">
<label>文字水印</label>
<input type="text" class="form-control" name="waterText" required="required" value="<?php echo $config['waterText']; ?>" onkeyup="this.value=this.value.trim()">
</div>
<div class="form-group col-md-3">
<label data-toggle="tooltip" title="格式RGBA 末尾为透明度0-127 0为不透明,仅支持文字水印">水印颜色</label>
<input type="text" name="textColor" class="form-control" value="" readonly data-jscolor="{preset:'myPreset'}">
</div>
<div class="form-group col-md-6">
<label>文字水印大小 | 当前: </label><label id="textSize"><?php echo $config['textSize']; ?></label><label>px</label>
<input type="range" class="form-control" name="textSize" value="<?php echo $config['textSize']; ?>" min="10" max="300" step="5" onchange="document.getElementById('textSize').innerHTML=value">
</div>
<div class="form-group col-md-6">
<label data-toggle="tooltip" title="支持GIF,JPG,BMP,PNG和PNG alpha">图片水印路径</label>
<input type="text" class="form-control" name="waterImg" required="required" value="<?php echo $config['waterImg']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
</div>
<div class="form-group col-md-6">
<label data-toggle="tooltip" title="水印中含有中文的,请选用符合GB/2312的字体">文字水印字体路径</label>
<input type="text" class="form-control" name="textFont" required="required" value="<?php echo $config['textFont']; ?>" onkeyup="this.value=this.value.replace(/\s/g,'')">
</div>
<div class="form-group col-md-3">
<label>文字水印</label>
<input type="text" class="form-control" name="waterText" required="required" value="<?php echo $config['waterText']; ?>" onkeyup="this.value=this.value.trim()">
</div>
<div class="form-group col-md-3">
<label data-toggle="tooltip" title="格式RGBA 末尾为透明度0-127 0为不透明,仅支持文字水印">水印颜色</label>
<input type="text" name="textColor" class="form-control" value="" readonly data-jscolor="{preset:'myPreset'}">
</div>
<div class="form-group col-md-6">
<label>文字水印大小 | 当前: </label><label id="textSize"><?php echo $config['textSize']; ?></label><label>px</label>
<input type="range" class="form-control" name="textSize" value="<?php echo $config['textSize']; ?>" min="10" max="300" step="5" onchange="document.getElementById('textSize').innerHTML=value">
</div>
<div class="form-group">
<input type="hidden" class="form-control" name="update" value="<?php echo date("Y-m-d H:i:s"); ?>" placeholder="隐藏的保存">

View File

@ -115,7 +115,7 @@ $config=Array
'guest_path_status'=>0,
'token_path_status'=>0,
'admin_path'=>'u',
'update'=>'2023-02-05 13:22:16',
'update'=>'2023-02-06 01:31:43',
'footer'=>'<a href="https://github.com/icret/EasyImages2.0" target="_blank" rel="nofollow" data-toggle="tooltip" title="Since 2018 - Github">© Since 2018</a>
<a href="https://png.cm/" target="_blank" data-toggle="tooltip" title="EasyImage 简单图床">EasyImage</a>
<a href="/admin/terms.php" target="_blank" data-toggle="tooltip" title="使用协议">DMCA</a>

0
docs/.nojekyll Normal file
View File

66
docs/API.md Normal file
View File

@ -0,0 +1,66 @@
- 上传成功后返回JSON
```json
{
"result":"success","code":200,
"url":"https:\/\/i2.100024.xyz\/2023\/01\/24\/10gwv0y-0.webp",
"srcName":"195124",
"thumb":"https:\/\/png.cm\/application\/thumb.php?img=\/i\/2023\/01\/24\/10gwv0y-0.webp",
"del":"https:\/\/png.cm\/application\/del.php?hash=bW8vWG4vcG8yM2pLQzRJUGI0dHlTZkN4L2grVmtwUTFhd1A4czJsbHlMST0="
}
```
- html示例
```html
<form action="http://127.0.0.1/api/index.php" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*">
<input type="text" name="token" placeholder="在tokenList文件找到token并输入" /> <input type="submit" />
</form>
```
- Python示例
```python
import requests
url = "https://png.cm/api/index.php"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n8337effca0ddfcd9c5899f3509b23657\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n195124.jpg\r\n-----011000010111000001101001--\r\n\r\n"
headers = {"content-type": "multipart/form-data; boundary=---011000010111000001101001"}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
```
- curl示例
```curl
curl --request POST \
--url https://png.cm/api/index.php \
--header 'content-type: multipart/form-data' \
--form token=8337effca0ddfcd9c5899f3509b23657 \
--form image=@195124.jpg
```
- JQuery示例
```jQuery
const form = new FormData();
form.append("token", "8337effca0ddfcd9c5899f3509b23657");
form.append("image", "195124.jpg");
const settings = {
"async": true,
"crossDomain": true,
"url": "https://png.cm/api/index.php",
"method": "POST",
"headers": {},
"processData": false,
"contentType": false,
"mimeType": "multipart/form-data",
"data": form
};
$.ajax(settings).done(function (response) {
console.log(response);
});
```

17
docs/Chrome插件.md Normal file
View File

@ -0,0 +1,17 @@
1. 确定你的图床开启了`API`并且有可用`Token`
2. 下载 [Chrome.crx](https://raw.githubusercontent.com/icret/EasyImage-Browser-Extension/main/Chrome.crx) | [开源地址](https://github.com/icret/EasyImage-Browser-Extension)
- - 方法1请点击chome浏览器最右侧的按钮 -> 更多工具 -> 扩展程序 (或者地址栏输入`chrome://extensions/`)把下载下来的 `Chrome.crx` 文件拖进去就可以了。
- - 方法2把下载下来的 `Chrome.crx` 文件拖进浏览器随便一个页面就可以了,Chrome插件同样也可以用于其他 Chromium 内核浏览器什么360急速啊猎豹啊什么的都是一样的
3. 安装完毕后会弹出初始化配置(详见界面演示第三张图片),在配置中写入你的`API`网址和`Token`
4. 登录图床后台->图床安全->高级设置->开启API上传
### 注意事项
- 安装时开启`Chrome`插件的开发者模式
- 使用`chrome`的同学注意了,因为不是商店的版本,所以直接安装会提示非商店的版本不能安装
* [该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的解决办法](https://zhuanlan.zhihu.com/p/106343392)
### 界面演示:
![简单图床配置中心](images/QQ截图20220430022000.png)
![简单图床谷歌插件上传界面](images/225906016.png)
![简单图床配置中心](images/2532516028.png)

8
docs/Edge插件.md Normal file
View File

@ -0,0 +1,8 @@
1. 使用Edge浏览器的[扩展中心](https://microsoftedge.microsoft.com),搜索 `简单图床` 安装后初始化配置即可使用 直达->[简单图床 Edge版](https://microsoftedge.microsoft.com/addons/detail/hdafcoenpmebcjjcccojdlhfnndelefk)
2. 直接下载[Edge.crx](https://raw.githubusercontent.com/icret/EasyImage-Browser-Extension/main/Edge.crx) 然后拖入Edge浏览器内 | [开源地址](https://github.com/icret/EasyImage-Browser-Extension)
3. 登录图床后台->图床安全->高级设置->开启API上传
### 界面演示:
![简单图床配置中心](images/QQ截图20220430022000.png)
![简单图床谷歌插件上传界面](images/225906016.png)
![简单图床配置中心](images/2532516028.png)

70
docs/README.md Normal file
View File

@ -0,0 +1,70 @@
## EasyImage2.0 简单图床
[![EasyImage2.0 GitHub's stars](https://img.shields.io/github/stars/icret/easyImage2.0?style=social)](https://github.com/icret/EasyImages2.0/stargazers)
[![EasyImage2.0 GitHub's forks](https://img.shields.io/github/forks/icret/easyimage2.0?style=social)](https://github.com/icret/EasyImages2.0/network/members)
[![PHP](https://img.shields.io/badge/php-5.6%20--%208.0-blue.svg)](http://php.net)
[![Release](https://img.shields.io/github/v/release/icret/EasyImages2.0)](https://github.com/icret/EasyImages2.0/releases)
[![jsdelivr](https://data.jsdelivr.com/v1/package/gh/icret/EasyImages2.0/badge)](https://cdn.jsdelivr.net/gh/icret/EasyImages2.0@EasyImage2.0/)
[![License](https://img.shields.io/badge/license-GPL_V2.0-yellowgreen.svg)](https://github.com/icret/EasyImages2.0/blob/master/LICENSE)
[![QQ group](https://pub.idqqimg.com/wpa/images/group.png)](https://jq.qq.com/?_wv=1027&k=jfXRHU8Y)
[演示](https://png.cm/) · [手册](https://www.kancloud.cn/easyimage/easyimage/) · [社区](https://github.com/icret/EasyImages2.0/discussions) · [Telegram](https://t.me/Easy_Image) - 插件: [Chrome](/Chrome插件.md) · [Edge](/Edge插件.md) · [PicGo](/使用PicGo上传.md) · [ShareX](/使用ShareX上传.md)
目录: [安装](/安装图床.md) | [安全](/安全配置.md) | [API](/API.md) | [鉴黄](/鉴黄.md) | [升级](/图床更新升级.md) | [常见问题](/常见问题.md) | [环境/兼容](#环境要求) | [更新日志](/更新日志.md) | [打赏开发者](/打赏开发者.md) | [鸣谢](#鸣谢) | [许可证](#开源许可)
> 始于2018年7月支持多文件上传,简单无数据库,返回图片url,markdown,bbscode,html的一款图床程序
演示地址:[https://png.cm/](https://png.cm/)
之前一直用的图床程序是:[PHP多图长传程序2.4.3](https://www.jb51.net/codes/40544.html)
由于版本过老并且使用falsh上传在当前html5流行大势所趋下遂利用基础知识新写了一个以html5为默认上传并且支持flash,向下兼容至IE9。
***本程序环境要求极低,适用于单一场景(游客上传)和个人使用,不适于多用户复杂场景***
>本人善写bug 发现bug可提交 [issues](https://github.com/icret/EasyImages2.0/issues) 追求稳定请下载 [稳定版](https://github.com/icret/EasyImages2.0/releases)
## 特点
* [x] 支持仅登录后上传
* [x] 支持设置图片质量
* [x] 支持文字/图片水印
* [x] 支持设置图片指定宽/高
* [x] 支持上传图片转换为指定格式
* [x] 支持限制最低宽度/高度上传
* [x] 支持API
* [x] 在线管理图片
* [x] 支持网站统计
* [x] 支持设置广告
* [x] 支持图片鉴黄
* [x] 支持自定义代码
* [x] 支持上传IP黑白名单
* [x] 支持创建仅上传用户
* [x] 对于安装环境要求极低
* [x] 更多功能支持请安装尝试···
## 界面演示
![简单图床 - 上传界面](images/README/674074848.png)
![简单图床 - 广场界面](images/README/3053540273.png)
![简单图床 - 后台界面](images/README/2657944724.png)
![简单图床 - 统计界面](images/README/1305032567.png)
![简单图床 - 图片信息](images/README/info.png)
![简单图床 - 上传日志](images/README/log.png)
## 环境要求
> 推荐环境Nginx + PHP≥7.0 + linux
- ##### 兼容
>最低`PHP 5.6`,推荐`PHP≥7.0`及以上版本需要PHP支持`Fileinfo,iconv,zip,mbstring,openssl`扩展,如果缺失会导致无法上传/删除图片
文件上传视图提供文件列表管理和文件批量上传功能,允许拖拽(需要`HTML5`支持)来添加上传文件,支持上传大图片,优先使用`HTML5`旧得浏览器自动使用`Flash和Silverlight`的方式兼容
## 鸣谢
- [verot](https://github.com/verot/class.upload.php "verot" )
- [ZUI](https://github.com/easysoft/zui "ZUI" )
## 开源许可
- [GPL-2.0](https://github.com/icret/EasyImages2.0/blob/master/LICENSE)
- Copyright © 2018 EasyImage Developer 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)

23
docs/SUMMARY.md Normal file
View File

@ -0,0 +1,23 @@
* [简介](简介.md)
* [安装扩展](安装扩展.md)
* [安装图床](安装图床.md)
* [三方安装指南](三方安装指南.md)
* [跳过安装引导](跳过安装引导.md)
* [安全配置](安全配置.md)
* [后台管理](后台管理.md)
* [API](API.md)
* [鉴黄](鉴黄.md)
* [公共查询](公共查询.md)
* [分离相关](分离相关.md1)
* [Edge插件](Edge插件.md)
* [Chrome插件](Chrome插件.md)
* [使用PicGo上传](使用PicGo上传.md)
* [使用ShareX上传](使用ShareX上传.md)
* [苹果快捷指令上传](苹果快捷指令上传.md)
* [隐藏存储路径](隐藏存储路径.md)
* [图床更新升级](图床更新升级.md)
* [更改域名/服务器](更改域名/服务器.md)
* [常见问题与环境要求](常见问题与环境要求.md)
* [打赏开发者](打赏开发者.md)
* [更新日志](更新日志.md)
* [许可证](许可证.md)

29
docs/_sidebar.md Normal file
View File

@ -0,0 +1,29 @@
<!-- docs/_sidebar.md -->
<!-- * [首页](/) -->
* [安装扩展](./安装扩展.md)
* [安装图床](./安装图床.md)
* [三方安装指南](./三方安装指南.md)
* [跳过安装引导](./跳过安装引导.md)
* [安全配置](./安全配置.md)
* [后台管理](./后台管理.md)
* [API](./API.md)
* [鉴黄](./鉴黄.md)
* [公共查询](./公共查询.md)
* [分离相关](./分离相关.md)
* [Edge插件](./Edge插件.md)
* [Chrome插件](./Chrome插件.md)
* [使用PicGo上传](./使用PicGo上传.md)
* [使用ShareX上传](./使用ShareX上传.md)
* [苹果快捷指令上传](./苹果快捷指令上传.md)
* [隐藏存储路径](./隐藏存储路径.md)
* [图床更新升级](./图床更新升级.md)
* [更改域名/服务器](./更改域名-服务器.md)
* [常见问题与环境要求](./常见问题.md)
* [打赏开发者](./打赏开发者.md)
* [更新日志](./update.md)
* [许可证](./许可证.md)

BIN
docs/images/1-001.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/images/1-002.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
docs/images/1-003.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
docs/images/225906016.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
docs/images/2532516028.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
docs/images/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
docs/images/4128197507.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 170 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/images/README/info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

0
install/README/log.png → docs/images/README/log.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

59
docs/index.html Normal file
View File

@ -0,0 +1,59 @@
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta charset="UTF-8" />
<link rel="stylesheet" href="//fastly.jsdelivr.net/npm/docsify/themes/vue.css">
</head>
<body>
<div id="app">EasyImage2.0 简单图床文档...</div>
<script>
window.$docsify = {
name: '简单图床 | 文档',
// homepage: '../README.md',
repo: 'icret/EasyImages2.0',//渲染github挂件 配置本地或线上地址
search: 'auto', //默认的全局搜索 详细参数请看插件文档
loadSidebar: true, //开启侧边栏 使用_sidebar.md
subMaxLevel: 1, //侧边栏层级最大层级2
loadNavbar: true, //加载导航栏 需要编写_navbar.md
autoHeader: true, //配合loadSidebar 自动添加标题
copyCode: {
buttonText: '复制',
errorText: '错误',
successText: '复制成功'
},
count: {
countable: true,
fontsize: '0.9em',
color: 'rgb(90,90,90)',
language: 'chinese'
},
}
// 离线模式
if (typeof navigator.serviceWorker !== 'undefined') {
navigator.serviceWorker.register('sw.js')
}
</script>
<!-- 全文搜索插件 -->
<script src="//unpkg.com/docsify/lib/plugins/search.min.js"></script>
<!-- 图片缩放插件 -->
<script src="//fastly.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.min.js"></script>
<!-- 代码拷贝插件 -->
<script src="//fastly.jsdelivr.net/npm/docsify-copy-code"></script>
<!-- emoji -->
<script src="//fastly.jsdelivr.net/npm/docsify/lib/plugins/emoji.min.js"></script>
<!-- 外链脚本 -->
<script src="//fastly.jsdelivr.net/npm/docsify/lib/plugins/external-script.min.js"></script>
<!-- 字数统计 -->
<script src="//unpkg.com/docsify-count/dist/countable.js"></script>
<script src="//fastly.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
</body>
</html>

83
docs/sw.js Normal file
View File

@ -0,0 +1,83 @@
/* ===========================================================
* docsify sw.js
* ===========================================================
* Copyright 2016 @huxpro
* Licensed under Apache 2.0
* Register service worker.
* ========================================================== */
const RUNTIME = 'docsify'
const HOSTNAME_WHITELIST = [
self.location.hostname,
'fonts.gstatic.com',
'fonts.googleapis.com',
'cdn.jsdelivr.net'
]
// The Util Function to hack URLs of intercepted requests
const getFixedUrl = (req) => {
var now = Date.now()
var url = new URL(req.url)
// 1. fixed http URL
// Just keep syncing with location.protocol
// fetch(httpURL) belongs to active mixed content.
// And fetch(httpRequest) is not supported yet.
url.protocol = self.location.protocol
// 2. add query for caching-busting.
// Github Pages served with Cache-Control: max-age=600
// max-age on mutable content is error-prone, with SW life of bugs can even extend.
// Until cache mode of Fetch API landed, we have to workaround cache-busting with query string.
// Cache-Control-Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=453190
if (url.hostname === self.location.hostname) {
url.search += (url.search ? '&' : '?') + 'cache-bust=' + now
}
return url.href
}
/**
* @Lifecycle Activate
* New one activated when old isnt being used.
*
* waitUntil(): activating ====> activated
*/
self.addEventListener('activate', event => {
event.waitUntil(self.clients.claim())
})
/**
* @Functional Fetch
* All network requests are being intercepted here.
*
* void respondWith(Promise<Response> r)
*/
self.addEventListener('fetch', event => {
// Skip some of cross-origin requests, like those for Google Analytics.
if (HOSTNAME_WHITELIST.indexOf(new URL(event.request.url).hostname) > -1) {
// Stale-while-revalidate
// similar to HTTP's stale-while-revalidate: https://www.mnot.net/blog/2007/12/12/stale
// Upgrade from Jake's to Surma's: https://gist.github.com/surma/eb441223daaedf880801ad80006389f1
const cached = caches.match(event.request)
const fixedUrl = getFixedUrl(event.request)
const fetched = fetch(fixedUrl, { cache: 'no-store' })
const fetchedCopy = fetched.then(resp => resp.clone())
// Call respondWith() with whatever we get first.
// If the fetch fails (e.g disconnected), wait for the cache.
// If theres nothing in cache, wait for the fetch.
// If neither yields a response, return offline pages.
event.respondWith(
Promise.race([fetched.catch(_ => cached), cached])
.then(resp => resp || fetched)
.catch(_ => { /* eat any errors */ })
)
// Update the cache with the version we fetched (only for ok status)
event.waitUntil(
Promise.all([fetchedCopy, caches.open(RUNTIME)])
.then(([response, cache]) => response.ok && cache.put(event.request, response))
.catch(_ => { /* eat any errors */ })
)
}
})

464
docs/update.md Normal file
View File

@ -0,0 +1,464 @@
![项目状态](https://repobeats.axiom.co/api/embed/0922803f14091f0686de26fee5196b9984b106a4.svg "Repobeats analytics image")
* 2023-02-05 v2.7.4 dev
- 此版本将作为优化和修复bugs
* 2023-02-05 v2.7.3
- 修复设置中手动压缩失败!
- 优化排版
* 2023-02-05 v2.7.2
- 增加删除单条历史上传记录
- 增加 [web-indexr](https://github.com/rehiy/web-indexr) 文件管理, 正在实验中
- - 作为 [Tinyfilemanager](https://github.com/prasathmani/tinyfilemanager) 的替代品 更轻量化 简单化
- 修复开启登录上传后,上传者账号上传失败 [#87](https://github.com/icret/EasyImages2.0/issues/87#issue-1569794639)
- 修复检测登录状态错误
- 优化排版和移动端显示
* 2023-02-01 v2.7.1
- 更新版本号
* 2023-02-01 v2.7.0
- 增加限制游客上传
- 增加上传历史记录
- 增加粘贴上传状态
- 增加广场非图片图标
- 增加前端显示缩略图链接
- 增加每日获取Bing图片背景
- 增加图片详细信息管理登录后显示更多信息
- 增加解析上传IP地址 (使用方法参考提示信息)
- 修复图片详细信息中随机图片排版混乱
- 替换访问生成缩略图代码
- 更新一些组件
- 调整前端显示
- 优化代码
* 2023-01-21 v2.6.9 Happy New Year
- 修复BMP格式无法增加水印(不建议开启,非常耗时)
- 修复上传用户组会串联变成管理员权限 [#61](https://github.com/icret/EasyImages2.0/issues/61)
- 增加了上传提示和登录提示
- 增加自定义存储分类路径 设置方法参考 [PHP date() 函数](https://www.runoob.com/php/php-date.html)
- 更改后台部分管理设置的位置
- 优化操作逻辑和信息提示
* 2022-12-30 v2.6.8
- 上传组件支持到 PHP 8.2
- 修复下载任意文件漏洞 [#75](https://github.com/icret/EasyImages2.0/issues/75)
- 增加自定义底部信息
- 增加自定义管理提示
- 增加图床模式
- 危险:除图片外不验证文件是否正常,也代表可以上传任意指定格式!
- 增加上传时生成缩略图(仅设置直链缩略图时生效)低配vps负载较大,影响前端上传速度!
- 其他一些优化
* 2022-09-20 v2.6.7
- 优化后台显示
- 增加控制缩略图尺寸
- 修复启用Opcache带来的问题 [#57](https://github.com/icret/EasyImages2.0/issues/57)
* 2022-07-10 v2.6.6
- 增加文件uuid命名
- 界面美化
* 2022-07-10 v2.6.6
- 增加图片信息显示随机图片
- 增加文件雪花命名
- 增加举报入口
- 更新组件
* 2022-05-27 v2.6.5
- 更改文件位置
* 2022-05-26 v2.6.4
- 更改版本显示方式
* 2022-05-26 v2.6.3
- 增加图片下载
- 增加简单暗黑模式
- 增加读取上传日志
- 增加广场浏览往日限制
- 有助于防爬虫抓取
- 增加登陆验证码开关(默认关闭)
- 删除图片详情页Exif信息
- 文件管理中图片使用缩略图显示
- 更改广场->信息中图片长宽获取方式
- 优化图片详情页/广场UI/日志/用户/api 列表
* 2022-05-04 v2.6.2
- 增加API/用户文件浏览和删除
- 增加转换webp后也会添加水印
- 转换成webp后不建议开启水印,会增大图片体积
- webp水印消耗更多PHP内存,PHP8以上有很大概率失败
- 更改广场页面返回顶部
- 优化了管理界面UI
- 修复一些bug
* 2022-05-03 v2.6.1
- 增加登陆用户有效期
- 增加管理员/登陆用户/Token专用目录
- 增加转换图片格式后压缩图片(不建议同时开启后端压缩)
- 增加隐藏存储路径(网站域名与图片域名不同且图片域名需绑定到图片目录)
- 直链缩略图支持bmp,webp
- 本次更新较大,建议重新安装!
* 2022-04-29 v2.6.0
- 修复源图缺陷
- 修复API回收不能还原问题
- 布局修改
- 登录页美化
- 屏蔽登陆页面chrome类浏览器自动填充
* 2022-04-02 v2.5.9
- 增加安装提示
- 增加忘记密码提示
- 增加检测水印图片/水印字体是否存在
- 修复登陆逻辑
- 修复广场重复显示图片
- 修改广场删除/回收样式
- 调整了广告的位置
- 调整后台设置分表
* 2022-04-02 v2.5.8
- 修复在PHP8环境下的bugs
- 修复删除token产生的bug
- 更改顶部广告位置
- 更改广场样式
* 2022-3-30 v2.5.7
- 增加弹窗公告
- 恢复文件管理
- 微调了广场样式
- 微调了删除文件
- 删除了base.php
- 日志记录上传IP端口
- 日志记录通过API上传的ID
- 修复管理页面短标签bug [#30](https://github.com/icret/EasyImages2.0/issues/30#issue-1185821542)
- 修复图片回收中批量删除失败
- 修复广场预览ico格式文件失败
- 修复个别浏览器显示二维遮住网页 [#28](https://github.com/icret/EasyImages2.0/issues/28#issue-1180675728)
- 缩略图最大生成与用户设置最大上传关联
- 安全检测中检测本地域名改为检测局域网
* 2022-3-13 v2.5.6
- 修复加密删除后不能正确提示
- 修复webp转换其他格式失败
- 修复文字水印透明度不生效
- 修复jscolor显示不正确
- 增加原图保护
- 增加检测版本
* 2022-3-4 v2.5.5
- 增加设置页面检测是否开启登录上传
- 将footer固定在底部
- 移除function_API.php
- 修复TimThumb不支持bmp格式的bug
- 修复TimThumb不支持webp动态图片bug
* 2022-2-29 v2.5.4
- 增加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
- 优化页面排版
- 更改部分命名
- 增加后端压缩率
- 增加可以显示多条公告
- 增加上传后是否显示删除
- 增加可以关闭广场/统计导航|页面
- 调整登录和退出文件位置
- 调整二维码内容为每个页面
- 更换验证码库并不再区分大小写
- 修复一处有概率暴露图片绝对路径的bug
* 2022-1-22 v2.4.6
- 视图优化
- 删除重复内容
- 增加图片信息页面
- 增加上传黑/白名单
- 修复因关闭上传日志而导致的无法鉴黄和后端压缩图片
- 修复安装时更改管理员账号失败
- 修复更改管理员账户后无法退出
* 2022-1-13 v2.4.5
- 修复一处权限问题
- 修复恢复可疑图片
- 增加复制提示
- 增加默认上传后首选显示链接
* 2022-1-3 v2.4.5 beta
- 增加复制提示
- 更新安装代码
- 更改前端样式
- 更新上传格式
- 重构了密码验证
- 使用md5存储密码
- 增加后台设置提示
- 增加更改网站配色
- 增加缩略图索引格式
- 调整后台分类及位置
- 增加在线修改账号密码
- 增加以源文件名称命名
- 增加缩略图两种生成方式和开关
- 修复开启前端压缩导致的上传图片异常
- 屏蔽因缺少PHP扩展而不能生成缩略图的格式
* 2021-12-25 v2.4.4
- 更改favicon.ico
- 修复缩略图数量统计
- 增加缩略图生成开关
- 日志增加更多文件信息
- 前端增加裁剪和压缩质量
- 上传失败将会输出更多信息
- 修复前端压缩图片不能关闭问题
- 修复上传设置中错误和页面显示
- 调整网站设置->上传设置的排序
- 将快捷操作中心转移到网站设置中
- 修复因生成缩略图导致的前端数据返回失败
- 增加简单图床chrome浏览器插件可自行配置网站->[EasyImage-Browser-Extension](https://github.com/icret/EasyImage-Browser-Extension)
* 2021-11-17 v2.4.3
- 增加登录验证码
- 二级目录安装
- 一些优化
* 2021-11-14 v2.4.2
- 增加上传日志
* 2021-11-12 v2.4.1
- 增加缓存周期配置
- 增加上传统计
- 增加viewjs
- 更新依赖件
- 修复统计错误
* 2021-11-9 v2.4.0
- 增加统计缓存
- 增加最近30天上传统计与占用空间图表
- 增加初始化安装可能会不支持二级目录安装可删除install文件夹初始化)
- 增加在线编辑配置(之前是需要修改config.php文件现在可以直接网站端修改了)
- 删除广场会导致浏览速度变慢的代码
- 删除快捷配置会导致浏览速度变慢的代码
* 2021-11-3 v2.3.2
- 增加广场图片缓存
- 重构广场样式
* 2021-11-3 v2.3.1
- 增加监黄接口
- 增加审核违规图片
- 修复对php5.6的支持
- 修复二级目录的安装
* 2021-10-24 v2.3.0
- 将服务器环境监测改为第一次打开时自动检测如需再次展示需删除config目录下的EasyImage.lock
- 增加快捷操作中心显示服务信息
- 增加对上传文件的命名方式详见config.php文件里的注释
- 增加隐私政策、服务条款、DMCA
- 增加自定义静态文件CDN源
- 增加dns-prefetch
- 删除了tinyfilemanager文件管理感觉没什么用
- 一些bug得以修复
* 2021-5-22 v2.2.0
- 增加根目录静态属性
- 增加浏览页面懒加载
- 增加浏览页面启用选定日期查看图片
- 增加版本检测 ***每月10日06点和25日01点检测Github是否更新***
- 增加上传压缩 ***此压缩有可能使图片变大!特别是小图片 也有一定概率改变图片方向***
- 增加批量压缩目录 ***TinyPng或本机压缩本机压缩出现的问题***
- 修复title
- 修复二级目录安装
- 修复对PHP5.6的兼容 ***建议使用php7.0及以上!***
* 2021-5-8 v2.1.1
- 修复上传界面上传失败提示信息bug
- 浏览页面重构
- 删除页面添加登录删除
- 调整首页显示
- 将调整图片长宽放置前端,减小资源开销
- 其他小调整
* 2021-5-2 v2.1
- 将tinyfilemanager配置文件简单翻译并集成到config.php
- 增加底部自定义信息
- 增加检测PHP环境给与提示
- 增加删除图片url服务器不会保存删除链接
- 恢复随机浏览20张上传图片 可以设定浏览数量和关闭浏览
- - 随机浏览图片可以在线删除
- 可以使用 https://png.cm/libs/list.php?num=100 定义浏览数量
- 修复一些调用
- 更改二维码显示方式
- 开启api 需要token验证上传
- 重构并修复check.php相关文件
- 重构部分代码
- 更改目录结构
- 增加安全性配置
- * Apache配置文件默认设置上传目录不可运行
```Apache
RewriteEngine on RewriteCond % !^$
RewriteRule i/(.*).(php)$ [F]
RewriteRule public/(.*).(php)$ [F]
RewriteRule config/(.*).(php)$ [F]
```
- * Nginx请在Nginx配置
```Nginx
# 禁止运行php的目录
location ~* ^/(i|public|config)/.*\.(php|php5)$
{
deny all;
}
```
- - 或者参考https://blog.png.cm/939.html
- 一些精简
* 2021-4-14 v2.0.2.1 Dev1
- 更新静态文件版本
- 请所有更新过2.0.2.1版本升级到此版本
- 更改一些描述
- md5提交登录验证
- 登录上传也显示公告
* 2021-03-28 v2.0.2.1
- 更新管理程序,修复部分漏洞
- 修复不能等比例缩小图片
- 支持php8
* 2019-6-26 v2.0.2.0
- 精简压缩代码,使得不再压缩后反而变大
- 删除异域上传功能,不再支持异域上传
- 修复开启登录后无法粘贴密码
- 后台控制上传数量,上传格式
- 其他一些优化
* 2019-6-14 v2.0.1.9
- 增加复制链接按钮
- 增加暂停上传按钮
- 增加QQ截图剪切板上传
- 增加文字/图片水印透明度
- 恢复开启/关闭api上传
- 恢复支持水印文字颜色
- 恢复支持远程上传图片
- 修复安装时候的权限
- 修复管理无法多选的问题
- 修复上传透明png背景变为纯黑的问题
- 修复成功上传图片但前端无法获取链接
- 修复在centos64 lnmp1.6 php7.1环境下的图片信息读取问题
- 修改图片压缩方式速度更快相比之前提高5倍以上
- 更改管理路径
- 更改上传路径,文件名更短
- 更改上传显示方式为缩略图
- 关闭添加图片后自动上传
- 纪念一下2019年将版本号改为2.0.1.9
* 2019-5-23 v2.0
- 在继承上个版本1.6.4)的基础上进行了全新优化
- 修复上传经常失败的问题
- 删除一些不常用但会增加功耗的过程
- 全新的压缩 将文件继续缩小
- 全新的目录系统,精简代码
- 设置仅允许在config.php修改注释更加明了即使没有代码基础也可以操作
- 增加新的文件管理系统,感谢 tinyfilemanager
- ~~支持文字/图片水印 可自定义文字颜色~~
- ~~支持文字水印背景颜色~~
- ~~支持文字水印透明度~~
- ~~支持删除远程上传文件~~ -> 不再支持删除远程文件
- ~~(支持开启/关闭api自定义文字水印)~~
- ~~支持删除自定义删除图片(仅管理员)~~
<details><summary>与1.6.4版本差别</summary>
##### 不建议再使用 [EasyImage 1.6.4版本](https://github.com/icret/easyImages)
- 在继承上个版本([1.6.4](https://github.com/icret/easyImages "1.6.4"))的基础上进行了全新优化
- 修复上传经常失败的问题
- 删除一些不常用但会增加功耗的过程 (删除的在下边会有标记)
- 全新的压缩 将文件继续缩小
- 全新的目录系统,精简代码
- 设置仅允许在config.php修改注释更加明了即使没有代码基础也可以操作
- 增加新的文件管理系统,感谢 tinyfilemanager
- ~~支持文字/图片水印 可自定义文字颜色~~
- ~~支持文字水印背景颜色~~
- ~~支持文字水印透明度~~
- ~~支持删除远程上传文件~~ -> 不再支持删除远程文件
- ~~(支持开启/关闭api自定义文字水印)~~
- ~~支持删除自定义删除图片(仅管理员)~~
</details>

View File

@ -0,0 +1,11 @@
- 由热心TG网友`Derek DDS`制作的`Docker`版本
https://github.com/DDS-Derek/EasyImage-Docker
https://hub.docker.com/r/ddsderek/easyimage
- 由热心网友`咕咕` 制作的使用教程
- 宝塔版使用教程
https://blog.laoda.de/archives/aapanel-install-easyimage
- docker 版使用教程
https://blog.laoda.de/archives/docker-compose-install-easyimage
- 视频安装教程 视频地址 https://www.bilibili.com/video/BV1Ya411e7ES?zw
<iframe src="//player.bilibili.com/player.html?aid=213629191&bvid=BV1Ya411e7ES&cid=710975430&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="768px" height="450px"> </iframe>

18
docs/使用PicGo上传.md Normal file
View File

@ -0,0 +1,18 @@
##### 1. 下载最新版[PicGo-windows版][1]或者[PicGo-mac版][2]我下载的版本是PicGo-Setup-2.3.1-x64
##### 2. 安装后在插件设置中搜索`web-uploader 1.1.1` 并安装(下载插件可能需要[node.js][3]插件)
##### 3. 图床设置-自定义Web图床中按照如下方式填写然后点击确定并设置为默认图床。
##### 4. 登录图床后台->图床安全->高级设置->开启API上传
```json
API地址:https://png.cm/api/index.php // 输入你的网站api地址
POST参数名: image
JSON路径: url
自定义Body: {"token":"1c17b11693cb5ec63859b091c5b9c1b2"} // 这里输入你网站生成的token
```
![EasyImage简单图床使用PicGo上传图片](images/4128197507.png)
[1]: https://github.com/Molunerfinn/PicGo/releases
[2]: https://github.com/Molunerfinn/PicGo/releases
[3]: https://nodejs.org/zh-cn/

View File

@ -0,0 +1,29 @@
- 登录图床后台->图床安全->高级设置->开启API上传
- 下载[ShareX](https://getsharex.com/downloads/),然后打开目标->自定义上传目标->导入下面代码即可上传。
![使用ShareX上传](images/f54adf65a4ds56f.png)
- 需要注意,`RequestURL`需要替换成自己的域名token也需要修改成自己的
```json
{
"Version": "13.5.0",
"Name": "简单图床API图片上传",
"DestinationType": "ImageUploader",
"RequestMethod": "POST",
"RequestURL": "https://png.cm/api/index.php",
"Body": "MultipartFormData",
"Arguments": {
"token": "8337effca0ddfcd9c5899f3509b23657"
},
"FileFormName": "image",
"URL": "$json:url$",
"ThumbnailURL": "$json:thumb$",
"DeletionURL": "$json:del$",
"ErrorMessage": "$json:message$"
}
```
![](images/ShareX_UwVwPnC3MJ.png)
- 上边设置好以后 设置为默认上传
![](images/ShareX_luVGfPaU9E.png)

39
docs/公共查询.md Normal file
View File

@ -0,0 +1,39 @@
可用让网站提供一些可用对外展示的数据
- 首先在`图片安全`开启开放数据
- 根据需要选择要对外展示的数据
![](images/QQ截图20220222162359.png)
现在就可以直接访问指定参数的链接获得数据了。
例如获得已经建立的文件夹http://127.0.0.1/api/public.php?show=dir
![](images/QQ截图20220222162603.png)
jQuery调用演示代码
```html
<span id="public"></span>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
<script>
$.ajax({ //创建ajax对象
url: "http://127.0.0.1/api/public.php",
data: { //发送到服务器的数据
show: "file",
        },
success: function(resp) { //服务器响应成功的数据
//resp服务端响应过来的数据
$("#public").text(resp); //渲染到浏览器上
        }
    });
</script>
```
或者
```html
<p>今日上传<span id="public_today">loading...</span>张图片</p>
<p>本站已托管<span id="public_file">loading...</span>张图片</p>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
<script>
$("#public_today").load("http://127.0.0.1/api/public.php?show=today");$("#public_file").load("http://127.0.0.1/api/public.php?show=file");
</script>
```

10
docs/分离相关.md Normal file
View File

@ -0,0 +1,10 @@
- 用户分离
上传者用户上传的图片与游客上传的图片分别建立文件夹
- Token分离
使用token上传的用户将以Token ID创建文件夹
- 管理分离
为管理员创建单独的上传目录
##### 注意
- 广场仅显示游客上传,不显示`用户分离` `Token分离` `管理分离` 的图片

3
docs/后台管理.md Normal file
View File

@ -0,0 +1,3 @@
- EasyImage的后台管理非常丰富所有的更改均有注明
![配置中心-EasyImage2.0简单图床](images/微信截图_20220427152523.png)

View File

@ -0,0 +1,20 @@
##### 正常升级
1. 备份`config`目录(没有增加上传用户和api可以只保留`config.php`文件)和`上传文件目录`
2. 将新程序下载至网站目录解压覆盖,然后将备份的文件替换既完成升级
3. 如果出现错误请在设置中把所有底部设置点击一次`保存`
##### docker升级
1. 删除容器,镜像
2. 保留挂载在主机上的配置文件
3. 重新执行一边安装代码
##### 更新后显示当前版本与Github版本不一致
- 删除`/admin/logs/verson`文件夹
- 删除后并未获取版本? 答案PHP没装curl或文件权限问题
- 2.6.5 之前的版本:
1. 打开`/config/config.php`文件找到当前版本号替换成最新版本号
*****
- 可以在设置->系统信息->图床信息中查看当前版本和Github最新版本
- 每个月获取2次因为PHP不能定时任务所以不一定能正确获取

26
docs/安全配置.md Normal file
View File

@ -0,0 +1,26 @@
- Apache环境在上传目录添加配置文件`.htaccess` 使上传目录不可运行PHP程序默认已经存在)
```Apache
<FilesMatch "\.(?i:php|php3|php4|php5)">
Order allow,deny
Deny from all
</FilesMatch>
```
- Nginx环境禁止多个目录运行`PHP`程序:
```Nginx
# "i|public"是你要禁止的目录 放到listen段落之后才生效
location ~* ^/(i|public)/.*\.(php|php5)$
{
deny all;
}
```
- Lighthttpd环境禁止多个目录运行`PHP`程序:
```Lighthttpd
$HTTP["url"] =~ "^/(i|public)/" {
fastcgi.server = ()
}
```w

18
docs/安装图床.md Normal file
View File

@ -0,0 +1,18 @@
> 推荐环境Nginx + PHP≥7.0 + linux
#### windows:
- 下载简单图床 [最新版](https://github.com/icret/EasyImages2.0/archive/refs/heads/master.zip)|[稳定版](https://github.com/icret/EasyImages2.0/releases) 上传至web根目录
#### Linux:
- `git clone https://github.com/icret/EasyImages2.0.git` 至安装目录
- 赋予安装目录www:www和0755权限:
```shell
chmod -R 755 /安装目录
chown -R www:www /安装目录
```
#### BT宝塔面板
- 安装环境 Ngixn(推荐) / Apache + PHP(推荐≥7.0)
- 软件商店搜索`简单图床`一键部署

11
docs/安装扩展.md Normal file
View File

@ -0,0 +1,11 @@
- 安装PHP扩展
- Lnmp
[lnmp安装扩展教程](https://www.vpser.net/manage/lnmp-php-install-ext.html)
- 宝塔面板:
打开宝塔后台->软件商店->已安装->选择php->设置->安装Fileinfo、iconv、zip、mbstring、openssl扩展如果没有就是已经安装了
![](images/微信截图_20211029180211.png)

24
docs/常见问题.md Normal file
View File

@ -0,0 +1,24 @@
1. 请将所有文件赋予`0755`和`www`权限
2. 对`PHP`不太熟悉的请不要将图床程序放置于二级目录
3. 请关闭防跨站或删除域名文件夹内的`user.ini`文件 如`宝塔面板`|`军哥lnmp`
4. 网站域名与图片域名必须填写,如果只有一个域名请填写成一样的
5. 首次使用会执行安装程序并并在`config`目录生成`install.lock` 跳过安装流程请删除`install`目录
6. 首次访问首页会检查环境并在`config`目录下生成`EasyImage.lock`
7. 可以使用谷歌浏览器的调试模式查看错误`F12->console`
8. 提示 `upload File size exceeds the maximum value` 调整`PHP`上传大小
9. 提示 `undefined function imagecreatefromwebp()`GD没安装webp, 以此类推
10. 提示 `Warning: is_dir(): open_basedir restriction in effect`解决方法同`3`
11. 无法上传/访问/不显示验证码: 1. 权限问题见问题`1` 2. CDN缓存了 3. 防火墙拦截
12. 宝塔或者其他环境安装成功但是上传失败,多数原因是防火墙拦截上传,取消拦截即可
13. `Fatal error: Allowed memory size......`主机内存或分配给PHP的内存不够 解决方法百度
14. 开启原图保护功能后打开图片链接显示`404`是因为`nginx`或`Apache`页面缓存导致的,`Nginx`解决办法:
```Nginx
# 把Nginx这段配置删掉
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
```

6
docs/打赏开发者.md Normal file
View File

@ -0,0 +1,6 @@
- 使用软件是对作者的最大鼓励,非常感谢你的打赏!
| 支付宝支持 | 微信支持 |
| :---------------------------------------: | :-------------------------------------: |
| ![支付宝支持](../public/images/alipay.jpg) | ![微信支持](../public/images/wechat.jpg) |

View File

@ -0,0 +1,10 @@
- 更改域名
1. 更改图床域名
登录网站后台->网站设置->网站域名->将新域名填入
2. 更改图片域名
登录网站后台->网站设置->图片域名->将新域名填入
- 更改服务器
1. 将域名解析到新服务器
2. 将网站整体搬运至新服务器

View File

@ -0,0 +1,3 @@
- 苹果快捷指令直接访问下面链接即可:
- 登录图床后台->图床安全->高级设置->开启API上传
[https://www.icloud.com/shortcuts/857b1921c1aa4d679470fcfed583cb1c](https://www.icloud.com/shortcuts/857b1921c1aa4d679470fcfed583cb1c)

2
docs/许可证.md Normal file
View File

@ -0,0 +1,2 @@
- [GPL-2.0](https://github.com/icret/EasyImages2.0/blob/master/LICENSE)
- Copyright © 2018 EasyImage Developer By [Icret](https://github.com/icret)

View File

@ -0,0 +1,8 @@
有时候因为虚拟机或者其他的原因无法使用程序提供的安装页面引导,可以跳过安装引导
- 跳过安装引导流程
1. 删除`install`目录
2. 修改`/caonfig/config.php`文件中的`domain`网站网址和`imgurl`图片网址 ,网址末尾不能加`/`
3. 后续更改可以通过访问网站的设置页面修改
4. 虽然不经过安装引导,但是安装页面上所有需要满足的条件必须支持
![图床要求](images/1-001.png)

31
docs/鉴黄.md Normal file
View File

@ -0,0 +1,31 @@
图床支持moderatecontent和nsfwjs方式鉴黄
- moderatecontent
1. 注册[moderatecontent](https://client.moderatecontent.com/)并获取Token
2. 后台API设置中填入Moderate Key
3. 后台图片安全图片鉴黄以moderatecontent方式
- nsfwjs [nsfwjs docker](https://hub.docker.com/r/icret/nsfw_restful_api)
1. 确定已安装`docker`和`docker-compose`
2. 拉取镜像 `docker pull icret/nsfw_restful_api:latest` 或者直接 `docker run -p 3307:3307 -d icret/nsfw_restful_api`
3. 后台API设置中填入网址 比如:`http://IP:3307/api/nsfw/classify?url=`
4. 后台图片安全图片鉴黄以nsfwjs方式
5. 如果你使用别的nsfwjs api,必须返回`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
}]
```

View File

@ -0,0 +1,7 @@
- 默认上传链接格式为: https://i2.100024.xyz/2023/02/06/1w0b5z.webp 其中`/i/`是由上传设置->存储路径设置的;
- 如果想隐藏`/i/`目录,需打开 图床安全->隐藏*目录,然后将图片域名绑定到`/i/`目录
- 注意:
1. 图片链接会隐藏你设置的存储路径 例如`/i/`
2. 网站与图片域名不能相同
3. 图片域名需绑定到存储路径

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

View File

@ -53,6 +53,7 @@ if (isset($_POST['del_extra_files'])) {
@unlink(APP_ROOT . '/config/EasyIamge.lock');
@deldir(APP_ROOT . "/.github");
@deldir(APP_ROOT . "/.git");
@deldir(APP_ROOT . "/docs");
} catch (Exception $e) {
echo $e->getMessage();
}