推荐一款个人向PHP支持水印的图床程序PicUploader

背景

  想快速给图片加上水印,于是进行了一番搜索,发现了该神器,属个人向,强烈推荐!话不多说先上图!这些图都是这个开源程序搞的。它就是PicUploader,非常方便。

  • 首页
    支持多种上传方式!
    image.png
  • 设置页面
    支持众多云存储以及远程sftp存储!我这里没有配置,图片不多,选择了本地存储。
    image.png
  • 历史页
    方便管理,多种链接格式点击即可复制!
    image.png

部署

  环境没啥特别的,比较常规。而且作者的说明非常详细。

环境

  • php (需要安装fileinfo gd cur exif pdo_sqlite这几个扩展)
  • sqlite 做数据库,或者mysql,我用的sqlite。
  • nginx 或者 caddy 啥的
    我这贴一下config.php,非常直观 有这么多存储可以支持。水印,图片路径之类的在配置文件的最后面。
    1
    <?php
    2
    	/**
    3
    	 * Created by PhpStorm.
    4
    	 * User: bruce
    5
    	 * Date: 2018-08-30
    6
    	 * Time: 14:58
    7
    	 */
    8
    	
    9
    	$config = [
    10
    		'storageTypes' => [
    11
    			//Qiniu Cloud
    12
    			'qiniu' => [
    13
    				'name' => '七牛云',
    14
    				//七牛云AppKey
    15
    				'AK' => 'ASG********************************0AoF',
    16
    				//七牛云AppSecret
    17
    				'SK' => 'Uo*********************************lkEy',
    18
    				//七牛云对象存储空间名
    19
    				'bucket' => 'markdown',
    20
    				//必填,七牛云外链域名(域名要自己绑定,因为默认域名30天后会被回收)
    21
    				'domain' => 'http://pe5scgdex.bkt.clouddn.com',
    22
    				//七牛优化参数,直接加在链接后面,但是不会优化原图,只会优化输出的图片,如果不需要可以不配置该项(即注释掉)
    23
    				'optimize' => '?imageMogr2/thumbnail/800x/strip/quality/80',
    24
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    25
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    26
    				'directory' => '',
    27
    			],
    28
    			
    29
    			//Tencent Cloud
    30
    			'tencent' => [
    31
    				'name' => '腾讯云',
    32
    				'appId' => '1*******0',
    33
    				'secretId' => 'AKID*********************************ut33',
    34
    				'secretKey' => 'zlK*********************************tjLn2',
    35
    				'bucket' => 'markdown-*******',
    36
    				'region' => 'ap-guangzhou',
    37
    				//如果不填domain,则自动拼接腾讯给的域名
    38
    				'domain' => '',
    39
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    40
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    41
    				'directory' => '',
    42
    			],
    43
    			
    44
    			//Netease Cloud
    45
    			'netease' => [
    46
    				'name' => '网易云',
    47
    				'accessKey' => '4bd5*********************************7b',
    48
    				'accessSecret' => '465*****************************82db',
    49
    				//区域,目前只有“华东1”,貌似文档也没说明,我是按s3的格式“us-west-1”这样猜的,华就是cn,东就是east,猜的“cn-east-1”还真对了
    50
    				//以后如果有华南1估计就是“cn-south-1”,以后有华北就是“cn-north-1”等。
    51
    				'region' => 'cn-east-1',
    52
    				'bucket' => 'markdown-bucket',
    53
    				//endpoint不是域名,域名是 bucket.'.'.endpoint
    54
    				'endpoint' => 'http://nos-eastchina1.126.net',
    55
    				//如果不填domain,则自动拼装网易云给的域名
    56
    				'domain' => '',
    57
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    58
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    59
    				'directory' => '',
    60
    			],
    61
    			
    62
    			//baidu Cloud
    63
    			'baidu' => [
    64
    				'name' => '百度云',
    65
    				'accessKeyId' => '4fdda******************91b5',
    66
    				'secretAccessKey' => 'ddd****************d03a3',
    67
    				'endpoint' => 'http://gz.bcebos.com',
    68
    				'bucket' => 'markdown',
    69
    				//如果不写,则自动拼装百度给的域名
    70
    				'domain' => '',
    71
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    72
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    73
    				'directory' => '',
    74
    			],
    75
    			//JDCloud
    76
    			'jd' => [
    77
    				'name' => '京东云',
    78
    				'AccessKeyId' => '050C******************6568B',
    79
    				'AccessKeySecret' => 'E1CD******************8A6F',
    80
    				'endpoint' => 'https://s3.cn-south-1.jcloudcs.com',
    81
    				'region' => 'cn-south-1',
    82
    				'bucket' => 'markdown',
    83
    				//如果不写,则自动拼装京东给的域名
    84
    				'domain' => '',
    85
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    86
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    87
    				'directory' => '',
    88
    			],
    89
    			//Aliyun Cloud
    90
    			//由于未知原因,阿里云与百度云目前开启图片压缩和水印将导致上传失败,排查出问题会马上更新
    91
    			'aliyun' => [
    92
    				'name' => '阿里云',
    93
    				'accessKey' => 'cD********aL',
    94
    				'accessSecret' => 'dN***************V4h2',
    95
    				'bucket' => 'bruce-markdown',
    96
    				'endpoint' => 'oss-cn-shenzhen.aliyuncs.com',
    97
    				//如果不写,则自动拼装阿里云给的域名
    98
    				'domain' => '',
    99
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    100
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    101
    				'directory' => '',
    102
    			],
    103
    			
    104
    			//Upyun Cloud
    105
    			'upyun' => [
    106
    				'name' => '又拍云',
    107
    				'serviceName' => 'bl******wn',
    108
    				'operator' => '*******',
    109
    				'password' => '**************',
    110
    				//如果不写,则自动拼装又拍云给的域名
    111
    				'domain' => '',
    112
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    113
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    114
    				'directory' => '',
    115
    			],
    116
    			
    117
    			//https://sm.ms, 新版api每人5GB免费空间,收费的截止到2019-08-25还没上线,但已经在开发中,原api在新api完善后,将会下线
    118
    			//也就是说后面使用sm.ms就必须注册了
    119
    			'smms' => [
    120
    				'name' => 'sm.ms',
    121
    				// 有两种值可填,v1或v2,使用v1时,token不需要填,使用v2时,token要填(v2可以sm.ms后台看到自己上传的图片)
    122
    				'version' => 'v1',
    123
    				//sm.ms新版api需要token,请注册后,在Dashboard中生成Api token并填写到这里
    124
    				'token' => 'zMY50m***********fxXHly',
    125
    				//代理地址,如果使用shadowsocks做代理,ip填http://127.0.0.1(或直接填127.0.0.1)即可,
    126
    				//端口从『偏好设置→HTTP→监听端口』找,留空或注释掉表示不使用代理
    127
    				// 'proxy' => 'http://127.0.0.1:1087',
    128
    				'proxy' => '',
    129
    				//无法自定义域名和key名,只能直接用它返回的地址(原因是无账号系统,自己定义的key无法保证全局唯一)
    130
    				//反向代理域名(如果需要的话)
    131
    				'domain' => 'http://img.xiebruce.top',
    132
    			],
    133
    			
    134
    			//imgur
    135
    			'imgur' => [
    136
    				'name' => 'Imgur',
    137
    				'clientId' => 'ab************cdf',
    138
    				//自定义反向代理域名
    139
    				'domain' => '',
    140
    				//代理地址,如果使用shadowsocks做代理,ip填http://127.0.0.1(或直接填127.0.0.1)即可,
    141
    				//比如:'proxy' => 'http://127.0.0.1:1087',端口从『偏好设置→HTTP→监听端口』找,留空表示不使用代理
    142
    				'proxy' => ''
    143
    				//无法自定义域名和key名,只能直接用它返回的地址(原因是无账号系统,自己定义的key无法保证全局唯一)
    144
    			],
    145
    			
    146
    			//Ucloud
    147
    			'ucloud' => [
    148
    				'name' => 'UCloud',
    149
    				'publicKey' => 'Rgv************************************************************3M=',
    150
    				'privateKey' => 'Jt4************************************************************8qGH',
    151
    				//在“对象存储Ufile”→“单地域空间管理”下可以看到你的存储空间列表,其中第一列是“存储空间域名”
    152
    				//这个“存储空间域名”都是由“.cn-**.ufileos.com”结尾的,“**”是代表地域,北京的是“bj”,广东的是“gd”、上海的是“sh2”
    153
    				//你点“创建存储空间”,弹出来的框里,你选择不同域名,下边的“存储空间域名”后缀就会自动改变,你就能看到对应的区域域名后缀
    154
    				//比如我的域名叫:markdown-blog.cn-gd.ufileos.com,那么“markdown-blog”是自己填的,“.cn-gd.ufileos.com”是自动的,因为我选的是广东,所以“cn-”后面是“gd”,如果我选的是北京,那么“cn-”后面就是“bj”
    155
    				'proxySuffix' => '.cn-**.ufileos.com',
    156
    				'bucket' => 'mar******log',
    157
    				//endpoint,cdn加速域名是bucket名+endpoint组成,Ucloud中没有endpoint的说法,
    158
    				//但其实这就是endpoint,这个值请自己复制cdn加速域名除去bucket名部分到这里(不包含英文句点)
    159
    				'endpoint' => 'ufile.ucloud.com.cn',
    160
    				//如果不写,则自动拼装Ucloud给的域名
    161
    				'domain' => '',
    162
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    163
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    164
    				'directory' => '',
    165
    			],
    166
    			
    167
    			//QingCloud
    168
    			'qingcloud' => [
    169
    				'name' => '青云',
    170
    				'accessKeyId' => 'TIJ************ADM',
    171
    				'secretAccessKey' => 'hvF************************************Awe0x',
    172
    				'bucket' => 'bl******down',
    173
    				'zone' => '***',
    174
    				//如果不写,则自动拼装QingCloud给的域名
    175
    				'domain' => '',
    176
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    177
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    178
    				'directory' => '',
    179
    			],
    180
    			
    181
    			//NextCloud 有一个别人搭建的nextcloud网盘:https://nextcloud-fi.webo.hosting,不过很慢
    182
    			//Nextcloud一般都是自己搭建
    183
    			'nextcloud' => [
    184
    				'name' => 'Nextcloud',
    185
    				//固定写“nextcloud”
    186
    				'type' => 'nextcloud',
    187
    				//设置为你的nextcloud右下角,点击“设置”后显示的那个WebDAV地址,
    188
    				//但是去掉“/remote.php/webdav/”,即只保留域名部分
    189
    				'baseUri' => 'https://nextcloud-fi.webo.hosting',
    190
    				'username' => 'zhangsam@hotmail.com',
    191
    				'password' => 'xi***********MD',
    192
    				//代理地址,如果使用shadowsocks做代理,ip填http://127.0.0.1(或直接填127.0.0.1)即可,
    193
    				//比如:'proxy' => 'http://127.0.0.1:1087',端口从『偏好设置→HTTP→监听端口』找,留空表示不使用代理
    194
    				'proxy' => '',
    195
    				//指定目录后,上传的文件将会上传到指定目录中,由于nextcloud是使用WebDav协议,并非对象存储,为了保证速度,这里只允许最多指定5层目录,如:Photos/travel/Turkey,),也可以使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    196
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    197
    				// 'directory' => '{Y}/{m}/{d}',
    198
    				//自定义目录格式:Photos/2019/03/31
    199
    				// 'directory' =>  '{Y}/{m}/{d}',
    200
    				//自定义目录格式:Photos/Travel/2019/03/31
    201
    				// 'directory' => 'Photos/Travel/' . date('Y/m/d/'),
    202
    				//自定义目录格式:Photos/Travel/Maldives
    203
    				// 'directory' => 'Photos/Travel/Maldives',
    204
    			],
    205
    			
    206
    			//Github
    207
    			'github' => [
    208
    				'name' => 'Github',
    209
    				//github仓库(github左上角的名字,带用户名)
    210
    				'repo' => 'xiebruce/PicUploader',
    211
    				//分支,默认为master
    212
    				'branch' => 'master',
    213
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    214
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    215
    				'directory' => 'images',
    216
    				//提交的评论信息,保持默认即可,当然你想修改成你想要的也可以
    217
    				'message' => 'Upload from PicUploader',
    218
    				//access_token,授权token
    219
    				'access_token' => 'c506a9de*********************d375de5e',
    220
    				//不填则使用github默认的域名,填了则使用填的域名(但填的域名要自行做nginx反向代理到真实域名地址)
    221
    				'domain' => '',
    222
    				//代理地址,如果使用shadowsocks做代理,ip填http://127.0.0.1(或直接填127.0.0.1)即可,
    223
    				//比如:'proxy' => 'http://127.0.0.1:1087',端口从『偏好设置→HTTP→监听端口』找,留空表示不使用代理
    224
    				'proxy' => '',
    225
    			],
    226
    			
    227
    			//Gitee
    228
    			'gitee' => [
    229
    				'name' => '码云',
    230
    				//gittee仓库(gittee左上角的名字,带用户名)
    231
    				'repo' => 'xiebruce/imagebed',
    232
    				//分支,默认为master
    233
    				'branch' => 'master',
    234
    				//存储目录,可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    235
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    236
    				'directory' => 'images',
    237
    				//提交的评论信息,可以不填
    238
    				'message' => 'Upload from PicUploader',
    239
    				//access_token,授权token
    240
    				'access_token' => '0e6bb6**************d9a5f2',
    241
    				//不填则使用gittee默认的域名,填了则使用填的域名
    242
    				'domain' => '',
    243
    				//代理地址,如果使用shadowsocks做代理,ip填http://127.0.0.1(或直接填127.0.0.1)即可,
    244
    				//端口从『偏好设置→HTTP→监听端口』找,留空或注释掉表示不使用代理
    245
    				// 'proxy' => 'http://127.0.0.1:1087',
    246
    				// 'directory' => date('Y/m/d/'),
    247
    				//自定义目录格式:Photos/2019/03/31
    248
    				// 'directory' => 'Photos/' . date('Y/m/d/'),
    249
    				//自定义目录格式:Photos/Travel/2019/03/31
    250
    				// 'directory' => 'Photos/Travel/' . date('Y/m/d/'),
    251
    				//自定义目录格式:Photos/Travel/Maldives
    252
    				// 'directory' => 'Photos/Travel/Maldives',
    253
    			],
    254
    			
    255
    			//Weibo(上传图片到微博并不会自动发一条微博,请放心使用)
    256
    			// 2019.09.01更新:微博目前不能上传了,原来用的接口已经用不了,有新方法再更新吧
    257
    			// 2019.09.10更新:微博上传恢复,能正常使用
    258
    			// 由于微博的图片域名不稳定(目前知道有https://ws1.sinaimg.cn和https://ws4.sinaimg.cn两个),所以无法做反代
    259
    			'weibo' => [
    260
    				'name' => '微博',
    261
    				//微博登录用户名(或邮箱)
    262
    				'username' => 'zhangsan@sina.com',
    263
    				//微博登录密码
    264
    				'password' => '*****************',
    265
    			],
    266
    			
    267
    			//使用sftp协议上传到自己的服务器上
    268
    			'bwg' => [
    269
    				//这是自定义名称,可以自己改(因为你用的机器也不一定是搬瓦工的,也有可能是阿里云或其他的)
    270
    				'name' => '搬瓦工',
    271
    				//固定填写sftp
    272
    				'type' => 'sftp',
    273
    				//ip也可以写域名(反正域名最终也是被解析为ip,都一样)
    274
    				'host' => '服务器ip或域名',
    275
    				'username' => 'ssh用户名',
    276
    				'password' => 'ssh密码',
    277
    				//prefix为前缀,最终上传目录是:prefix+directory,那为什么要分开写呢?因为directory会拼到你的domain后面,而prefix不会
    278
    				//prefix就相当于设置上传的“根目录”
    279
    				'prefix' => '/home/xiebruce',
    280
    				//如果指定了directory,则directory指定的目录必须存在,否则不会自动创建,会报错
    281
    				'directory' => '/data',
    282
    				'domain' => 'https://img.xiebruce.top',
    283
    			],
    284
    			
    285
    			//上传到PicUploader所在服务器本地(适用于把PicUploader部署到远程服务器上的用户)
    286
    			'local' => [
    287
    				'name' => '本地服务器',
    288
    				//prefix为前缀,最终上传目录是:prefix+directory,那为什么要分开写呢?因为directory会拼到你的domain后面,而prefix不会
    289
    				//prefix就相当于设置上传的“根目录”
    290
    				'prefix' => '/data/wwwroot',
    291
    				//directory指定的目录不存在会自动创建(但必须php-fpm对prefix指定的目录具有写权限)
    292
    				//按本例的配置,文件最终将被上传到:/home/xiebruce/data/images 目录下(即prefix+directory)
    293
    				//可使用年月日点位符,如 {Y}/{m}/{d},真正被解析出来的时候会被替换成当前的年月日(如 2019/05/10)
    294
    				//{Y}表示当前的年(注意Y是大写),{m}表示当前月(有前导0,即1-9月会显示成01-09),{d}会被替换为当前日期,有前导0(即1-9日会替换为01-09)
    295
    				'directory' => '/images/{Y}/{m}/{d}',
    296
    				'domain' => 'https://img.xiebruce.top',
    297
    			],
    298
    			
    299
    			//https://cloudinary.com
    300
    			//如果要设置反代,请反代这个域名:https://res.cloudinary.com/用户名/image/upload/v1(用户名即cloudName的值)
    301
    			'cloudinary' => [
    302
    				'name' => 'Cloudinary',
    303
    				'cloudName' => 'bruce',
    304
    				'apiKey' => '79*********78',
    305
    				'apiSecret' => 'rM**********************E',
    306
    				'domain' => '',
    307
    				//使用代理
    308
    				// 'proxy' => 'http://127.0.0.1:1087',
    309
    			],
    310
    			
    311
    			//华为云对象存储
    312
    			'huawei' => [
    313
    				'name' => '华为云',
    314
    				'accessKey' => 'STB**********5WJ',
    315
    				'secretKey' => 'QqvppZ*************obuPayrB',
    316
    				'bucket' => 'ma****wn',
    317
    				'endpoint' => 'obs.cn-*******weicloud.com',
    318
    				'directory' => '/{Y}/{m}/{d}',
    319
    				'domain' => '',
    320
    			],
    321
    			
    322
    			//亚马逊s3(s3是指三个s开头的单词:simple storage service)
    323
    			's3' => [
    324
    				'name' => '亚马逊s3',
    325
    				'AccessKeyId' => 'AK**********2DWA',
    326
    				'AccessKeySecret' => 'V6reYCx*************h/Zlw7o51',
    327
    				'region' => 'ap-*****-1',
    328
    				'bucket' => 'mar*****bed',
    329
    				//如果不写,则自动拼装s3给的域名,规则为:https://[bucket].s3.[region].amazonaws.com,
    330
    				'domain' => '',
    331
    				//自定义目录格式:2019/03/31
    332
    				'directory' => '/{Y}/{m}/{d}',
    333
    				//使用代理,格式:http://127.0.0.1:1087
    334
    				'proxy' => '',
    335
    			],
    336
    			
    337
    			//金山云(k是KingSoft,即金山软件,s3是指三个s开头的单词:standard storage service)
    338
    			'ks3' => [
    339
    				'name' => '金山云',
    340
    				'accessKey' => 'AKLT*********a1vBw',
    341
    				'accessSecret' => 'OH97dc***********UeJBh1mQg==',
    342
    				'bucket' => 'm***wn',
    343
    				'endpoint' => 'ks3-*********un.com',
    344
    				//如果不写,则自动拼装金山云给的域名,如:https://ks3-cn-guangzhou.ksyun.com
    345
    				'domain' => '',
    346
    				//自定义目录格式:2019/03/31
    347
    				'directory' => '/{Y}/{m}/{d}',
    348
    			],
    349
    			
    350
    			//Chevereto是一个php编写的开源自建图床程序(https://github.com/Chevereto/Chevereto-Free)
    351
    			'chevereto' => [
    352
    				'name' => 'Chevereto',
    353
    				//必填,请求接口的key
    354
    				'accessKey' => '8ec5**************0c932',
    355
    				//必填,Chevereto网站的域名(当然,这有可能是你自己搭建的,也有可能你用的别人的服务)
    356
    				'siteUrl' => 'http://www.mysite.com',
    357
    				//自定义域名,如果为空,则默认使用siteUrl作为域名
    358
    				'domain' => '',
    359
    				//使用代理,如:http://127.0.0.1:1087
    360
    				'proxy' => '',
    361
    			],
    362
    			
    363
    			// 开源自建对象存储服务器Minio:https://github.com/minio/minio
    364
    			'minio' => [
    365
    				'name' => 'Minio',
    366
    				'AccessKeyId' => '0CQ2*******2A9',
    367
    				'AccessKeySecret' => 'ucya0Ot+**********1fnjXU6I4',
    368
    				//如果你的minio服务器未设置region,那就留空
    369
    				'region' => '',
    370
    				'bucket' => 'ma****wn',
    371
    				'endpoint' => 'http://*********',
    372
    				//自定义域名,如果为空,则默认使用endpoint作为域名
    373
    				'domain' => '',
    374
    				//自定义目录格式:2019/03/31
    375
    				'directory' => '/{Y}/{m}/{d}',
    376
    				//使用代理,格式:http://127.0.0.1:1087
    377
    				'proxy' => '',
    378
    			],
    379
    			
    380
    			//Dropbox网盘: https://www.dropbox.com/home
    381
    			//由于它是网盘,需要先上传再创建分享链接,所以每一次上传需要请求两次api,并且国内又要用代理,所以速度会慢一点
    382
    			//反代域名:https://dl.dropboxusercontent.com/s (最后一个s是有的,没有敲错了)
    383
    			'dropbox' => [
    384
    				'name' => 'DropBox',
    385
    				'appKey' => '5k********fb',
    386
    				'appSecret' => 'kzy********8v9',
    387
    				//使用代理(国内必须使用代理),如:http://127.0.0.1:1087
    388
    				'proxy' => 'http://127.0.0.1:1087',
    389
    				//自定义目录格式:2019/03/31
    390
    				'directory' => '/{Y}/{m}/{d}',
    391
    				//自定义域名
    392
    				'domain' => '',
    393
    			],
    394
    		],
    395
    		
    396
    		/*
    397
    		 * 文件名格式
    398
    		 * 替换变量:{origin}原始文件名, {Y}当前年, {m}当前月, {d}当前日, {H}当前小时, {i}当前分, {s}当前秒, {timestamp}当前时间戳, {random:8}随机字符串(8为长度,为避免文件覆盖,至少8位,设置8以下的数值会自动使用8位,最多100位),留空或未使用任何替换变量则默认使用32位md5加密文件名,注意该设置只对能自定义文件名的存储引擎起效果,并且这里最好不要使用“/”作为分隔符,因为对象存储会把“/”分隔的文件名当成目录。
    399
    例:{Y}-{m}-{d}-{H}-{i}-{s}-{random:16},产生的文件名格式为:2019-07-26-15-16-55-mQVAiII4Ff8PNXfb.jpg
    400
    		 */
    401
    		'fileNameFormat' => '',
    402
    		
    403
    		// 反向代理域名(使用方式请查看:https://www.xiebruce.top/644.html)
    404
    		'reverseProxyDomain' => 'https://img.xiebruce.top',
    405
    		
    406
    		// 调整图片大小,以下widthGreaterThan、heightGreaterThan、sizeBiggerThan三个条件,只要有一个满足,图片即会按percentage指定的百分比压缩(只对jpg和png有效,gif暂时无法压缩)
    407
    		'resizeOptions' => [
    408
    			// 65表示把原图等比缩小为原来的65%(所以数字越小压的越厉害),percentage取值为0-100之间,可使用两位小数,当percentage为0、100及大于100时,不进行压缩。
    409
    			'percentage' => '65',
    410
    			
    411
    			// 当宽度超过1000px时压缩
    412
    			'widthGreaterThan' => '1000',
    413
    			// 当高度超过1000px时压缩
    414
    			'heightGreaterThan' => '1000',
    415
    			// 当图片文件大于该值是压缩,单位为KB,注意单位只能是KB,假如你想要超过2M时才压缩,则填2048即可,因为2048即为2M(注意在Mac上2000就是2M,即文件大小在Mac上是1000进位的,不是1024进位的)
    416
    			'sizeBiggerThan' => '1024',
    417
    		],
    418
    		
    419
    		//jpe图片专用,表示图片质量,0-100,数值越大,图片质量越好
    420
    		'quality' => 80,
    421
    		//png图片专用,压缩级别,0-9,0不压缩,1-9为不同压缩等级,数值越大,压缩的越厉害(图片质量也会越低,压缩速度也越慢)
    422
    		'compreLevel' => 9,
    423
    		
    424
    		//链接类型,四个值,normal, markdown, markdownWithLink, custom,不填或者填的值不在这四个值里,按normal算
    425
    		//其中markdownWithLink表示点击后会跳转到图片源地址
    426
    		'linkType' => 'markdown',
    427
    		//自定义返回链接格式,其中{{url}}在返回的时候会被替换为图片url,{{name}}会被替换为上传的图片名称(这样做主要为了小图居中)
    428
    		'customFormat' => '<p align="center"><img src="{{url}}" title="{{name}}" alt="{{name}}" width="80%"></p>',
    429
    		//视频返回链接格式
    430
    		'videoFormat' => '<video controls name="media" title="{{name}}" width="935"><source src="{{url}}" type="video/mp4"></video>',
    431
    		//音频返回链接格式
    432
    		'audioFormat' => '<audio controls name="media" title="{{name}}" width="400" src="{{url}}" title="{{name}}">',
    433
    		
    434
    		//存储服务器,可选值为:Qiniu/Tencent/Netease/Baidu/Aliyun/Jd/Upyun/Smms/Imgur/Ucloud/Qingcloud/Github/Weibo
    435
    		'storageType' => 'Smms',
    436
    		//存储服务器可写多个,表示同时传到云,注意多个服务器的情况下返回的域名将会使用你指定的多个云中的最后一个云的域名,所以这个域名必须填写,并且需要做nginx反向代理,请参考:https://www.xiebruce.top/644.html
    437
    		//有两种写法,一是用逗号隔开,二是直接用数组,如
    438
    		// 'storageType' => 'Upyun, Qiniu',
    439
    		
    440
    		//日志真实记录在系统日志目录下:在本项目目录下的logs目录中
    441
    		//但你可通过该项配置建立一个软链接(即快捷方式)到你想要的地方
    442
    		//你可以填写两种值:
    443
    		//1、填写:desktop,则你的桌面会出现一个PicUploader_Upload_Logs文件夹,打开该文件夹即可看到日志(win10由于权限原因无法实现该功能)
    444
    		//2、填写实际路径,比如你填写:/User/你的用户名/Downloads,则会在/User/你的用户名/Downloads下出现一个PicUploader_Upload_Logs文件夹
    445
    		//3、如果不填,或者填写的既不是desktop也不是一个存在的路径,则不创建符号链接,但日志还是会存往:本项目目录下的logs目录中
    446
    		//4、建议保持默认不要动,即放在桌面,这样方便查找日志
    447
    		'logPath' => 'desktop',
    448
    		
    449
    		//watermark/水印
    450
    		'watermark' => [
    451
    			//两个值,0或1,0表示不添加水印,1表示添加水印
    452
    			'useWatermark' => 1,
    453
    			
    454
    			//水印类型,支持图片水印和文字水印:image或text,如果是image,请填写以下image配置
    455
    			//如果是text,请填写以下的text配置。
    456
    			'type' => 'text',
    457
    			
    458
    			//图片水印配置
    459
    			'image' => [
    460
    				//alpha值为0-100,0完全透明(看不见),100完全不透明(即数字越靠近0越透明,越靠近100越不透明)
    461
    				'alpha' => 50,
    462
    				
    463
    				//水印图片名称,默认为watermark.png,请把static/watermark/watermark.png替换为你自己的水印即可
    464
    				'watermark' => 'watermark.png',
    465
    				
    466
    				//position有四种值,分别对应图片四个角:top-left/top-right/bottom-left/bottom-right/left/right/top/bottom/center
    467
    				//对应:左上/右上/左下/右下/左/右/上/下/中间,默认是右下
    468
    				'position' => 'center',
    469
    				
    470
    				//设置离边界的距离,设置右边和下边距离,请用负数,设置左边和上边距离,请用正数
    471
    				//当你设置水印在右下角时,需要设置的距离为右边和下边(x、y都用负数)
    472
    				//当你设置水印在右上角时,需要设置的距离为右边和上边(x用负数,y用正数)
    473
    				//当你设置水印在左上角时,需要设置的距离为左边和上边(x、y都用正数)
    474
    				//当你设置水印在左下角时,需要设置的距离为左边和上边(x用正数,y用负数)
    475
    				//当你设置水印在中间时,需要设置的距离为左边和上边(x、y都用正数将会稍向右下偏移,都用负数则会稍向右上偏移)
    476
    				//如果还是搞不懂,自己随便设置个值试一下,正的不行就用负,试一试就懂了
    477
    				'offset' => [
    478
    					//设置距离左右边界的距离
    479
    					'x' => -10,
    480
    					//设置距离上下边界的距离
    481
    					'y' => -10,
    482
    				],
    483
    			],
    484
    			
    485
    			//文字水印配置(当type=text时,该配置才会用到)
    486
    			'text' => [
    487
    				//水印文字
    488
    				'words' => "这是水印",
    489
    				
    490
    				//文字颜色,有两种格式,1、使用标准的16进制色值(文字无透明度),2、使用rgba颜色(可让文字带透明度)
    491
    				// 'color' => '#ff0000',
    492
    				//rgba格式颜色,可设置透明度,rgb分别是红绿蓝光的三原色,取值范围都是:0-255
    493
    				//a表示透明度,可用两位小数,0.00-1.00,数字越小越透明,如果设置到0则完全透明(即看不见),如果设置到1则完全不透明(即相当于没有设置透明度)
    494
    				'color' => 'rgba(255,0,0,0.10)',
    495
    				
    496
    				//字体文件名(字体文件必须为.ttf格式,且必须放在static/watermark文件夹下,windows下最好把字体文件名改为英文,实测win10上写中文名找不到字体文件)
    497
    				//下载字体网站:http://www.17ziti.com(字体之家)
    498
    				'fontFile' => 'jdchj.ttf',
    499
    				
    500
    				//字体大小,整型数字,数字越大字体越大
    501
    				'fontSize' => 30,
    502
    				
    503
    				//逆时针旋转角度(0-360),如果要顺时针旋转,请用负数
    504
    				'angle' => 45,
    505
    				
    506
    				//position有四种值,分别对应图片四个角:top-left/top-right/bottom-left/bottom-right/left/right/top/bottom/center
    507
    				//对应:左上/右上/左下/右下/左/右/上/下/中间,默认是右下
    508
    				'position' => 'center',
    509
    				
    510
    				//水印距离边的距离,与图片水印的一样
    511
    				'offset' => [
    512
    					'x' => 0,
    513
    					'y' => 60,
    514
    				],
    515
    			],
    516
    		],
    517
    		
    518
    		//允许一次性同时上传的文件数
    519
    		'maxNum' => 10,
    520
    		
    521
    		//0: 使用随机字符串文件名(这样不会覆盖原图)
    522
    		//1: 使用原文件名,有可能会覆盖原图(同一天上传同一文件名的文件两次以上,后面的就会覆盖前面的)
    523
    		'keepOriginalFilename' => 0,
    524
    		
    525
    		//数据库是用于存储上传历史记录的,不存储配置
    526
    		'database' => [
    527
    			// 如果使用Sqlite,不需要指定db的具体路径,不需要修改,直接这样就能用
    528
    			'dsn' => 'sqlite:PicUploader.db',
    529
    			//dbname=PicUploader指定的是数据库名,这个数据库必须要自己手动在mysql中创建,而表则会自动创建
    530
    			//'dsn' => 'mysql:host=127.0.0.1:3306;dbname=PicUploader',
    531
    			//如果用sqlite,则用户名密码不会被使用,只有mysql/MariaDB才会用到
    532
    			'username' => 'root',
    533
    			'password' => '123',
    534
    		],
    535
    		
    536
    		//常用目录,用于网页版上传时快速设置当前想上传到哪
    537
    		'commonUsedDirs' => [
    538
    			// “/{Y}/{m}/{d}/” 会被替换成当前的年月日,即“/2019/05/15/”这样的形式
    539
    			'/{Y}/{m}/{d}/',
    540
    			'/images/{Y}/{m}/{d}/',
    541
    		],
    542
    	];
    543
    	
    544
    	return $config;

体验

  本文图片皆为该程序搞的,我觉得还是非常方便的。但是这是一个个人向的程序,从官方的安装指南中可以看出它对本地部署很友好,我在这里选择放置web端,并用nginx添加了简单的验证。就这样 欢迎交流!

为docker添加代理提速镜像下载

  1. 1. 背景
  2. 2. 部署
    1. 2.1. 环境
  3. 3. 体验