Joomla!上传中文文件

Joomla! CMS在处理中文附件时可能存在不支持或链接失效的问题。通过安装和配置JCE编辑器,可以解决这个问题。具体方法是在Joomla的组件文件中修改上传函数,对含有中文的文件名进行自动重命名,从而实现正常上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

国外的CMS系统一大问题就是上传中文附件。要么不支持上传,要么传上去不支持链接。


Joomla使用jce可以解决这个问题。


通过jce上传文件时,自动重命名,去掉中文即可。


在Joomla\components\com_jce\editor\libraries\classes\browser.php中,将upload函数中$name 重命名。

 /**
     * Upload a file.
     * @return array $error on failure or uploaded file name on success
     */
    public function upload() {
        // Check for request forgeries
        WFToken::checkToken() or die();

        // check for feature access	
        if (!$this->checkFeature('upload')) {
            JError::raiseError(403, 'Access to this resource is restricted');
        }

        $filesystem = $this->getFileSystem();
        jimport('joomla.filesystem.file');
        
        header('Content-Type: text/json;charset=UTF-8');
        header("Expires: Wed, 4 Apr 1984 13:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M_Y H:i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");

        // get uploaded file
        $file = JRequest::getVar('file', '', 'files', 'array');

        // validate file data
        $this->validateUploadedFile($file);

        // get file name
        $name = JRequest::getVar('name', $file['name']);
        
        // decode name
        $name = rawurldecode($name);
        
        // check name
        if (WFUtility::validateFileName($name) === false) {
            throw new InvalidArgumentException('Upload Failed: The file name contains an invalid extension.');
        }
        
        // check file name
        WFUtility::checkPath($name);
        
        // get extension from file name
        $ext = WFUtility::getExtension($file['name']);

        // trim extension
        $ext = trim($ext);

        // check extension exists
        if (empty($ext) || $ext === $file['name']) {
            throw new InvalidArgumentException('Upload Failed: The file name does not contain a valid extension.');
        }

        // strip extension
        $name = WFUtility::stripExtension($name);
        // make file name 'web safe'
       // $name = WFUtility::makeSafe($name, $this->get('websafe_mode', 'utf-8'), $this->get('websafe_spaces'), $this->get('websafe_textcase'));
        //此处将makesafe改为直接用时间命名,纯数字,安全又可用
        $name = date('Ymd-His-', time()).rand(0,999); 
        // check name
        if (WFUtility::validateFileName($name) === false) {
            throw new InvalidArgumentException('Upload Failed: The file name contains an invalid extension.');
        }

        // target directory
        $dir = JRequest::getVar('upload-dir');
        // deocode directory
        $dir = rawurldecode($dir);
        // check destination path
        WFUtility::checkPath($dir);

        $upload = $this->get('upload');

        // Check file number limits        
        if (!empty($upload['total_files'])) {
            if ($filesystem->countFiles($dir, true) > $upload['total_files']) {
                throw new InvalidArgumentException(WFText::_('WF_MANAGER_FILE_LIMIT_ERROR'));
            }
        }

        // Check total file size limit        
        if (!empty($upload['total_size'])) {
            $size = $filesystem->getTotalSize($dir);

            if (($size / 1024 / 1024) > $upload['total_size']) {
                throw new InvalidArgumentException(WFText::_('WF_MANAGER_FILE_SIZE_LIMIT_ERROR'));
            }
        }

        // add random string
        if ($upload['add_random']) {
            $name = $name . '_' . substr(md5(uniqid(rand(), 1)), 0, 5);
        }

        // rebuild file name - name + extension
        $name = $name . '.' . $ext;

        // create a filesystem result object
        $result = new WFFileSystemResult();

        $complete = false;
        $contentType = JRequest::getVar('CONTENT_TYPE', '', 'SERVER');

        // relative path
        $relative = WFUtility::makePath($dir, $name);

        // Only multipart uploading is supported for now
        if ($contentType && strpos($contentType, "multipart") !== false) {
            $result = $filesystem->upload('multipart', trim($file['tmp_name']), $dir, $name);

            if (!$result->state) {

                if (empty($result->message)) {
                    $result->message = WFText::_('WF_MANAGER_UPLOAD_ERROR');
                }

                $result->code = 103;
            }

            @unlink($file['tmp_name']);

            $complete = true;
        } else {
            $result->state = false;
            $result->code = 103;
            $result->message = WFText::_('WF_MANAGER_UPLOAD_ERROR');

            $complete = true;
        }
        // upload finished
        if ($complete) {

            if ($result instanceof WFFileSystemResult) {
                if ($result->state === true) {
                    $this->setResult($this->fireEvent('onUpload', array($result->path, $relative)));
                    $this->setResult(basename($result->path), 'files');
                } else {
                    $this->setResult($result->message, 'error');
                }
            }

            die(json_encode($this->getResult()));
        }
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值