From 504e226128f1ae90da5be05368e8e1db2afb7e40 Mon Sep 17 00:00:00 2001 From: xiaoz Date: Sat, 23 Dec 2017 18:25:31 +0800 Subject: [PATCH] 1.0 --- README.md | 26 ++++++++++- about.php | 26 +++++++++++ config.php | 9 +++- explore.php | 116 +++++++++++++++++++++++++++++++++++++++++++++++ footer.php | 12 +++++ functions.php | 76 +++++++++++++++++++++++++++++++ header.php | 70 ++++++++++++++++++++++++++++ index.php | 55 ++++++++++++++++++++++ login.php | 52 +++++++++++++++++++++ pro.php | 21 +++++++++ static/embed.js | 5 +- static/style.css | 18 ++++++-- static/view.jpg | Bin 0 -> 24658 bytes upload.php | 18 +++++++- 14 files changed, 492 insertions(+), 12 deletions(-) create mode 100644 about.php create mode 100644 explore.php create mode 100644 footer.php create mode 100644 functions.php create mode 100644 header.php create mode 100644 index.php create mode 100644 login.php create mode 100644 pro.php create mode 100644 static/view.jpg diff --git a/README.md b/README.md index 0e6d726..8375ea4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ -# imgurl -继XZ Pic后,xiaoz的又一款图床程序。 +# ImgURL +ImgURL是一个简单、纯粹的图床程序,使用PHP脚本开发,不需要数据库支持,也没有复杂的配置。 + +### 环境要求 +* PHP >= 5.6 +* 需要exif函数支持 + +### 开发计划 +- [x] 图片上传与预览 +- [x] 一键生成链接 +- [x] 浏览与删除图片 +- [ ] 图片压缩 +- [ ] 多图上传 +- [ ] 图片鉴黄 + +### 安装 +

访问:master.zip下载最新版ImgURL程序,放到您的站点根目录并解压。修改一下config.php设置你自己的域名和密码,访问http(s)://domain.com/即可,就是这么简单。

+ +### 部分截图 +![](https://i.bk.tn/uploads/1712/230615302734.png) + +### 联系我 +* Blog:https://www.xiaoz.me/ +*
  • QQ:337003006
  • diff --git a/about.php b/about.php new file mode 100644 index 0000000..f9a7714 --- /dev/null +++ b/about.php @@ -0,0 +1,26 @@ + +
    +
    +
    +

    ImgURL

    +

    ImgURL是一个干尽、纯粹的图床程序,使用PHP脚本开发,不需要数据库支持,也没有复杂的配置。

    +

    没有免费的午餐,也没用永久免费的图床,ImgURL无法保障永久存储您的图片,但ImgURL让图床多了一个选择,只有图片掌握在自己手中才更安全。

    +

    安装

    +

    访问:master.zip下载最新版ImgURL程序,放到您的站点根目录并解压。修改一下config.php设置你自己的域名和密码,访问http(s)://domain.com/即可,就是这么简单。

    +

    说明

    +

    imgurl.org也可以上传图片,但ImgURL的目的是提供私人图床程序,imgurl.org仅作为演示使用,游客上传的图片随时可能被删除,因此推荐您下载ImgURL自行部署。

    +

    ImgURL是一个开源免费的个人项目,请勿将ImgURL用于商业用途,未经授权也不要去除底部版权。

    +

    项目地址:https://github.com/helloxz/imgurl

    +

    联系我

    + +
    +
    +
    + \ No newline at end of file diff --git a/config.php b/config.php index e304888..69b586e 100644 --- a/config.php +++ b/config.php @@ -1,6 +1,11 @@ 'http://localhost/imgurl/', - 'watermark' => 'false' + 'domain' => 'http://localhost/imgurl/', //网站域名 + 'watermark' => 'false', //文字水印 + 'userdir' => 'temp', //访客上传目录,一般保持默认 + 'admindir' => 'upload', //管理员上传目录,一般保持默认 + 'username' => 'xiaoz', //管理员账号 + 'password' => 'xiaoz.me', //管理员密码 + 'tinypng' => '' //使用TinyPNG压缩图片 ); ?> \ No newline at end of file diff --git a/explore.php b/explore.php new file mode 100644 index 0000000..42b9991 --- /dev/null +++ b/explore.php @@ -0,0 +1,116 @@ + +
    +
    +
    + +
    + +
    + +
    + + +valid(); $dir->next()) { + if ($dir->isDir() && !$dir->isDot()) { + if ($dir->haschildren()) { + $files = array_merge($files, get_files($dir->getChildren())); + }; + }else if($dir->isFile()){ + $files[] = $dir->getPathName(); + } + } + return $files; + } + + $path = $mydir.'/'.$time; + $dir = new RecursiveDirectoryIterator($path); + $fname = get_files($dir); + $num = count($fname) - 1; + + for($i = 0;$i <= $num;$i++) { + $fname[$i] = str_replace("\\","/",$fname[$i]); + //如果文件是空的,则终止循环 +?> + + + + + + +
    + "."$fname[$i]"; + ?> + + 删除"; + } + ?> +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/footer.php b/footer.php new file mode 100644 index 0000000..95a12b9 --- /dev/null +++ b/footer.php @@ -0,0 +1,12 @@ + + + + + diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..0425a31 --- /dev/null +++ b/functions.php @@ -0,0 +1,76 @@ + \ No newline at end of file diff --git a/header.php b/header.php new file mode 100644 index 0000000..53a7820 --- /dev/null +++ b/header.php @@ -0,0 +1,70 @@ + + + + + ImgURL - 简单、纯粹的图床程序。 + + + + + + + + + + + + + + + +
    +
    复制成功!
    +
    +
    + + + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..220ad1b --- /dev/null +++ b/index.php @@ -0,0 +1,55 @@ + +
    +
    +
    +
    +
    Upload
    +
    +
    +
    + +
    +
    +
    + + + +
    +
    +
    + + \ No newline at end of file diff --git a/login.php b/login.php new file mode 100644 index 0000000..11b7449 --- /dev/null +++ b/login.php @@ -0,0 +1,52 @@ + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/pro.php b/pro.php new file mode 100644 index 0000000..074b6f7 --- /dev/null +++ b/pro.php @@ -0,0 +1,21 @@ + +
    +
    +
    +

    捐赠版

    +

    ImgURL普通版和捐赠版功能上没有任何区别,不过您可以请作者喝一杯咖啡或吃一顿午餐即可获得捐赠版。可扫描下方二维码获取,留言请填写自己的网址。

    +

    +

    技术支持

    +

    获得捐赠版的童鞋,可以去除底部版权,可提供首次安装及调试。(但不提供代码再次开发)

    + +
    +
    +
    + \ No newline at end of file diff --git a/static/embed.js b/static/embed.js index eac4576..ae31cf8 100644 --- a/static/embed.js +++ b/static/embed.js @@ -1,5 +1,5 @@ $(document).ready(function() -{ +{ $("#fileuploader").uploadFile({ url:"./upload.php", maxFileSize:"2097152", @@ -43,4 +43,5 @@ function copy(url) { $("#msg").fadeOut(1500); } }); -} \ No newline at end of file +} + diff --git a/static/style.css b/static/style.css index ce5170a..350b171 100644 --- a/static/style.css +++ b/static/style.css @@ -1,13 +1,15 @@ .ajax-file-upload-container { display: none; } - -#fileuploader { - width:100%; -} -.ajax-upload-dragdrop { +.ajax-upload-dragdrop{ + height:200px; } +#fileuploader { + /*width:100%;*/ +} + + .ajax-file-upload { margin-left:auto; margin-right:auto; @@ -19,6 +21,7 @@ display:none; width:100%; position:fixed; + clear:both; } #fileuploader { margin-top:10%; @@ -26,6 +29,7 @@ #relink{ display: none; margin-top:36px; + width:100%; } #relink lable{ color:#2BD5AA; @@ -39,6 +43,7 @@ display: none; z-index: 100; top:60px; + clear:both; } .msg{ color:green; @@ -62,8 +67,11 @@ } #menu .navbar { margin-bottom:0; + border-left:0; + border-right:0; } + #footer{ width:100%; background-color: #F5F5F5; diff --git a/static/view.jpg b/static/view.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37a503da32bf79ad34b21882ff04abe3bdc4cd3a GIT binary patch literal 24658 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 \ No newline at end of file