HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//www.kvrdp.com/application/attachment/controller/Attachments.php
<?php
// +----------------------------------------------------------------------
// | Yzncms [ 御宅男工作室 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2018 http://yzncms.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 御宅男 <530765310@qq.com>
// +----------------------------------------------------------------------

// +----------------------------------------------------------------------
// | 附件上传处理类
// +----------------------------------------------------------------------
namespace app\attachment\controller;

use app\attachment\model\Attachment as Attachment_Model;
use app\common\controller\Adminbase;
use think\facade\Hook;

class Attachments extends Adminbase
{
    private $uploadUrl      = '';
    protected $searchFields = 'id,name';

    protected function initialize()
    {
        parent::initialize();
        $this->modelClass = new Attachment_Model;
        $this->uploadUrl  = config('public_url') . 'uploads/';
    }

    //附件列表页
    public function index()
    {
        if ($this->request->isAjax()) {
            list($page, $limit, $where) = $this->buildTableParames();
            $_list                      = Attachment_Model::where($where)->page($page, $limit)->order('id', 'desc')->select();
            $total                      = Attachment_Model::where($where)->order('id', 'desc')->count();
            $result                     = array("code" => 0, "count" => $total, "data" => $_list);
            return json($result);
        }
        return $this->fetch();
    }

    //附件选
    public function select()
    {
        if ($this->request->isAjax()) {
            return $this->index();
        }
        $mimetype = $this->request->get('mimetype/s', '');
        $this->assign('mimetype', $mimetype);
        return $this->fetch();
    }

    public function cropper()
    {
        return $this->fetch();
    }

    //附件删除
    public function del()
    {
        $ids = $this->request->param('id/a', null);
        if (empty($ids)) {
            $this->error('请选择需要删除的附件!');
        }
        if (!is_array($ids)) {
            $ids = array(0 => $ids);
        }
        $isAdministrator = $this->auth->isAdministrator();
        Hook::add('upload_delete', function ($params) {
            if ($params['driver'] == 'local') {
                $attachmentFile = ROOT_PATH . '/public' . $params['path'];
                if (is_file($attachmentFile)) {
                    @unlink($attachmentFile);
                }
            }
        });
        $attachmentlist = Attachment_Model::where('id', 'in', $ids)->select();
        foreach ($attachmentlist as $attachment) {
            Hook::listen("upload_delete", $attachment);
            $attachment->delete();
        }
        $this->success('文件删除成功~');
    }

    /**
     * html代码远程图片本地化
     * @param string $content html代码
     * @param string $type 文件类型
     */
    public function getUrlFile()
    {
        $content = $this->request->post('content');
        $type    = $this->request->post('type');
        $urls    = [];
        $urls    = \util\GetImgSrc::srcList($content);
        $urls    = array_filter(array_map(function ($val) {
            //http开头验证
            if (strpos($val, "http") === 0) {
                return $val;
            }
        }, $urls));

        $file_info = [
            'aid'    => $this->auth->id,
            'module' => 'admin',
            'thumb'  => '',
        ];
        foreach ($urls as $vo) {
            $vo   = trim(urldecode($vo));
            $host = parse_url($vo, PHP_URL_HOST);
            if ($host != $_SERVER['HTTP_HOST']) {
                //当前域名下的文件不下载
                $fileExt = strrchr($vo, '.'); //$fileExt = '.jpg';非正常后缀图片可以强制设置图片后缀进行抓取下载
                if (!in_array($fileExt, ['.jpg', '.gif', '.png', '.bmp', '.jpeg', '.tiff'])) {
                    exit($content);
                }
                //图片是否合法
                $imgInfo = getimagesize($vo);
                if (!$imgInfo || !isset($imgInfo[0]) || !isset($imgInfo[1])) {
                    exit($content);
                }
                $filename = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'temp' . DS . md5($vo) . $fileExt;
                if (http_down($vo, $filename) !== false) {
                    $file_info['md5'] = hash_file('md5', $filename);
                    if ($file_exists = Attachment_Model::get(['md5' => $file_info['md5']])) {
                        unlink($filename);
                        $localpath = $file_exists['path'];
                    } else {
                        $file_info['sha1'] = hash_file('sha1', $filename);
                        $file_info['size'] = filesize($filename);
                        $file_info['mime'] = mime_content_type($filename);

                        $fpath    = $type . DS . date('Ymd');
                        $savePath = ROOT_PATH . 'public' . DS . 'uploads' . DS . $fpath;
                        if (!is_dir($savePath)) {
                            mkdir($savePath, 0755, true);
                        }
                        $fname             = DS . md5(microtime(true)) . $fileExt;
                        $file_info['name'] = substr(htmlspecialchars(strip_tags($vo)), 0, 100);
                        $file_info['path'] = $this->uploadUrl . str_replace(DS, '/', $fpath . $fname);
                        $file_info['ext']  = ltrim($fileExt, ".");

                        if (rename($filename, $savePath . $fname)) {
                            Attachment_Model::create($file_info);
                            $localpath = $file_info['path'];
                        }
                    }
                    $content = str_replace($vo, $localpath, $content);
                }
            }
        }
        exit($content);
    }

}