123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- <?php
- /**
- * Created by PhpStorm.
- * User: 中闽 < 1464674022@qq.com >
- * Date: 2019/12/5
- * Time: 17:44
- */
- namespace app\admin\controller;
- use app\admin\controller\base\Permissions;
- use app\common\behavior\AdminLogBehavior;
- use app\common\model\Attachment as model;
- use file\FileHelper;
- use file\PathHelper;
- use think\Db;
- use think\Log;
- use think\Session;
- use time\Timestamp;
- class Attachment extends Permissions
- {
- public function index()
- {
- $model = new model();
- if ($this->request->isAjax()) {
- $post = $this->request->param();
- $where = [];
- if (isset($post['filename']) and !empty($post['filename'])) {
- $where['filename'] = ['like', '%' . $post['filename'] . '%'];
- }
- if (isset($post['filepath']) and !empty($post['filepath'])) {
- $where['filepath'] = ['like', '%' . $post['filepath'] . '%'];
- }
- if (isset($post['status']) and ($post['status'] == 1 or $post['status'] === '0' or $post['status'] == -1)) {
- $where['status'] = $post['status'];
- }
- if (isset($post['type'])) {
- if ($post['type'] == 1) {
- $where['filepath'] = ['like', '%http%'];
- }
- if ($post['type'] == -1) {
- $where['filepath'] = ['not like', '%http%'];
- }
- }
- if (isset($post['create_time']) and !empty($post['create_time'])) {
- $min_time = strtotime($post['create_time']);
- $max_time = $min_time + 24 * 60 * 60;
- $where['create_time'] = [['>=', $min_time], ['<=', $max_time]];
- }
- $count = $model->where($where)->count();
- $data = $model->where($where)->page($post['page']??0, $post['limit']??15)->order('create_time desc')->select();
- foreach ($data as $k => $v) {
- $v['thumb_url'] = $v['filepath'];
- $v['status_text'] = $v->status_text;
- $data[$k] = $v;
- }
- return array('code' => 0, 'count' => $count, 'data' => $data);
- } else {
- return $this->fetch();
- }
- }
- /**
- * 选择图片
- * @return mixed
- */
- public function selectImage()
- {
- $model = new model();
- $where = [
- 'fileext' => ['in', ['jpg', 'png', 'gif', 'jpeg', 'bmp', 'webp']],
- 'status' => model::STATUS_OPEN
- ];
- $attachment = $model->where($where)->order('create_time desc')->paginate(24);
- $this->assign('attachment', $attachment);
- $this->assign('showUpload', in_array(43, $this->getPermission()));
- return $this->fetch();
- }
- /**
- * 审核
- */
- public function status()
- {
- if ($this->request->isPost()) {
- $post = $this->request->post();
- $admin_id = \think\Session::get(self::ADMIN_ID);
- if (false == Db::name('attachment')->where('id', $post['id'])->update(['status' => $post['status'], 'admin_id' => $admin_id, 'audit_time' => time()])) {
- $this->error('设置失败');
- } else {
- $this->success('设置成功', 'index');
- }
- }
- }
- /**
- * 删除本地文件
- */
- public function delete()
- {
- if ($this->request->isAjax()) {
- $id = $this->request->param('id', 0, 'intval');
- $attachment = Db::name('attachment')->where('id', $id)->value('filepath');
- if (!isUrl($attachment) && file_exists(ROOT_PATH . 'public' . $attachment)) {
- //删除本地文件
- if (unlink(ROOT_PATH . 'public' . $attachment)) {
- if (false == Db::name('attachment')->where('id', $id)->delete()) {
- $this->error('删除失败');
- } else {
- $this->success('删除成功', 'admin/attachment/index');
- }
- } else {
- $this->error('删除失败');
- }
- } else {
- if (false == Db::name('attachment')->where('id', $id)->delete()) {
- $this->error('删除失败');
- } else {
- $this->success('删除成功', 'admin/attachment/index');
- }
- }
- }
- }
- /**
- * 批量删除本地文件
- */
- public function deletes()
- {
- if ($this->request->isAjax()) {
- $post = $this->request->param();
- $ids = $post['ids'];
- $attachments = (new model())->where('id', 'in', $ids)->select();
- foreach ($attachments as $attachment) {
- if (!isUrl($attachment->filepath) && file_exists(ROOT_PATH . 'public' . $attachment->filepath)) {
- //删除本地文件
- if (unlink(ROOT_PATH . 'public' . $attachment->filepath)) {
- if (false == Db::name('attachment')->where('id', $attachment->id)->delete()) {
- $this->error('删除失败');
- }
- } else {
- $this->error('删除失败');
- }
- } else {
- if (false == Db::name('attachment')->where('id', $attachment->id)->delete()) {
- $this->error('删除失败');
- }
- }
- }
- Log::log("批量删除附件:" . implode(',', $ids));
- $this->success('删除成功');
- }
- }
- /**
- * 下载
- * @return \think\response\Json
- */
- public function download()
- {
- if ($this->request->isAjax()) {
- $id = $this->request->param('id', 0, 'intval');
- if ($id > 0) {
- //获取下载链接
- $data = Db::name('attachment')->where('id', $id)->find();
- $res['data'] = $data['filepath'];
- $res['name'] = $data['filename'];
- //增加下载量
- Db::name('attachment')->where('id', $id)->setInc('download', 1);
- $res['code'] = 1;
- return json($res);
- } else {
- $this->error('错误请求');
- }
- }
- }
- /**
- * 网络文件本地化
- */
- public function imgPersistence()
- {
- $attachments = (new model())->where(['filepath' => ['like', '%http%']])->order('id desc')->select();
- if (count($attachments) > 50) {
- $this->error('网络文件过多,请使用命令行操作');
- }
- $savePath = DS . 'uploads' . DS . 'admin' . DS . 'attachment' . DS . Timestamp::dayStart(time()) . DS;
- foreach ($attachments as $attachment) {
- $saveName = PathHelper::getFilename($attachment->filepath);
- FileHelper::fetchDownFile($attachment->filepath, ROOT_PATH . 'public' . $savePath, $saveName);
- $attachment->save(['filepath' => $savePath . $saveName]);
- }
- $msg = '执行完成,本地化' . count($attachments) . '个文件';
- if ($this->request->isCli()) {
- echo $msg . PHP_EOL;
- } else {
- $this->success($msg);
- }
- }
- /**
- * 添加网络图片
- */
- public function create()
- {
- if ($this->request->isAjax()) {
- $post = $this->request->post();
- $validate = new \think\Validate([
- ['filepath', 'require|max:200'],
- ]);
- if (!$validate->check($post)) {
- $this->error('提交失败:' . $validate->getError());
- }
- $module = $this->request->param('module', 'admin');
- $use = $this->request->param('use', 'attachment');
- if (ifContain($use, '/')) {
- $use = deleteStartDS(replaceDS($use));
- }
- if (ifContain($use, '.')) {
- $use = explode('.', $use)[0];
- }
- $filepath = $post['filepath'];
- $pathinfo = pathinfo($filepath);
- $data = [
- 'module' => $module,//模块
- 'use' => $use,//来源
- 'filename' => $pathinfo['basename'],//文件名
- 'filepath' => $filepath,//文件路径
- 'fileext' => $pathinfo['extension']??'webp',//文件后缀
- 'filesize' => 0,//文件大小
- 'create_time' => time(),//时间
- 'uploadip' => $this->request->ip(),//IP
- 'user_id' => Session::has(self::ADMIN_ID) ? Session::get(self::ADMIN_ID) : 0,
- 'status' => model::STATUS_OPEN,
- 'admin_id' => 0,
- 'audit_time' => 0,
- ];
- $res['id'] = Db::name('attachment')->insertGetId($data);
- $res['src'] = $filepath;
- $this->success('完成', '', $res);
- }
- }
- /**
- * 上传附件
- * @return \think\response\Json
- */
- public function upload()
- {
- $module = $this->request->param('module', 'admin');
- $use = $this->request->param('use', 'attachment');
- if (ifContain($use, '/')) {
- $use = deleteStartDS(replaceDS($use));
- }
- if (ifContain($use, '.')) {
- $use = explode('.', $use)[0];
- }
- if ($this->request->file('file')) {
- $file = $this->request->file('file');
- } else {
- $res['code'] = 1;
- $res['msg'] = '没有上传文件';
- return json($res);
- }
- $web_config = Db::name('webconfig')->where('id', 1)->find();
- $info = $file->validate(['size' => $web_config['file_size'] * 1024, 'ext' => $web_config['file_type']])->rule('date')->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . $module . DS . $use);
- if ($info) {
- //写入到附件表
- $data = [];
- $data['module'] = $module;//模块
- $data['use'] = $use;//来源
- $data['filename'] = $info->getFilename();
- $data['filepath'] = DS . 'uploads' . DS . $module . DS . $use . DS . $info->getSaveName();
- $data['fileext'] = $info->getExtension();
- $data['filesize'] = $info->getSize();
- $data['create_time'] = time();
- $data['uploadip'] = $this->request->ip();
- $data['user_id'] = Session::has(self::ADMIN_ID) ? Session::get(self::ADMIN_ID) : 0;
- if ($data['module'] = 'admin') {
- //通过后台上传的文件直接审核通过
- $data['status'] = model::STATUS_OPEN;
- $data['admin_id'] = $data['user_id'];
- $data['audit_time'] = time();
- }
- $res['id'] = Db::name('attachment')->insertGetId($data);
- $res['src'] = replaceUrlDS($data['filepath']);
- (new AdminLogBehavior())->updateLastLog('上传附件:' . $data['filepath']);
- $this->success('上传完成', 'admin/attachment/index', $res);
- } else {
- $this->error('上传失败:' . $file->getError());
- }
- }
- }
|