opencart 上传中文文件问题

原文地址:http://godick.maxcell.org/opencart-uploaded-file-with-chinese-file-name-doesnt-show-up.html

更改basename函数

admin\controller\common\filemanager.php

 

<?php
class ControllerCommonFileManager extends Controller {
    private $error = array();
    
    public function index() {
        $this->language->load('common/filemanager');
        
        $this->data['title'] = $this->language->get('heading_title');
        
        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            $this->data['base'] = HTTPS_SERVER;
        } else {
            $this->data['base'] = HTTP_SERVER;
        }
        
        $this->data['entry_folder'] = $this->language->get('entry_folder');
        $this->data['entry_move'] = $this->language->get('entry_move');
        $this->data['entry_copy'] = $this->language->get('entry_copy');
        $this->data['entry_rename'] = $this->language->get('entry_rename');
        
        $this->data['button_folder'] = $this->language->get('button_folder');
        $this->data['button_delete'] = $this->language->get('button_delete');
        $this->data['button_move'] = $this->language->get('button_move');
        $this->data['button_copy'] = $this->language->get('button_copy');
        $this->data['button_rename'] = $this->language->get('button_rename');
        $this->data['button_upload'] = $this->language->get('button_upload');
        $this->data['button_refresh'] = $this->language->get('button_refresh');
        $this->data['button_submit'] = $this->language->get('button_submit'); 
        
        $this->data['error_select'] = $this->language->get('error_select');
        $this->data['error_directory'] = $this->language->get('error_directory');
        
        $this->data['token'] = $this->session->data['token'];
        
        $this->data['directory'] = HTTP_CATALOG . 'image/data/';
                
        $this->load->model('tool/image');

        $this->data['no_image'] = $this->model_tool_image->resize('no_image.jpg', 100, 100);
        
        if (isset($this->request->get['field'])) {
            $this->data['field'] = $this->request->get['field'];
        } else {
            $this->data['field'] = '';
        }
        
        if (isset($this->request->get['CKEditorFuncNum'])) {
            $this->data['fckeditor'] = $this->request->get['CKEditorFuncNum'];
        } else {
            $this->data['fckeditor'] = false;
        }
        
        $this->template = 'common/filemanager.tpl';
        
        $this->response->setOutput($this->render());
    }    
    
    public function image() {
        $this->load->model('tool/image');
        
        if (isset($this->request->get['image'])) {
            $this->response->setOutput($this->model_tool_image->resize(html_entity_decode($this->request->get['image'], ENT_QUOTES, 'UTF-8'), 100, 100));
        }
    }
    
    public function directory() {    
        $json = array();
        
        if (isset($this->request->post['directory'])) {
            $directories = glob(rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/') . '/*', GLOB_ONLYDIR); 
            
            if ($directories) {
                $i = 0;
            
                foreach ($directories as $directory) {
                    $json[$i]['data'] = $this->get_basename($directory);
                    $json[$i]['attributes']['directory'] = utf8_substr($directory, strlen(DIR_IMAGE . 'data/'));
                    
                    $children = glob(rtrim($directory, '/') . '/*', GLOB_ONLYDIR);
                    
                    if ($children)  {
                        $json[$i]['children'] = ' ';
                    }
                    
                    $i++;
                }
            }        
        }
        
        $this->response->setOutput(json_encode($json));        
    }
    
    public function files() {
        $json = array();
        
        if (!empty($this->request->post['directory'])) {
            $directory = DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']);
        } else {
            $directory = DIR_IMAGE . 'data/';
        }
        
        $allowed = array(
            '.jpg',
            '.jpeg',
            '.png',
            '.gif'
        );
        
        $files = glob(rtrim($directory, '/') . '/*');
        
        if ($files) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    $ext = strrchr($file, '.');
                } else {
                    $ext = '';
                }    
                
                if (in_array(strtolower($ext), $allowed)) {
                    $size = filesize($file);
        
                    $i = 0;
        
                    $suffix = array(
                        'B',
                        'KB',
                        'MB',
                        'GB',
                        'TB',
                        'PB',
                        'EB',
                        'ZB',
                        'YB'
                    );
        
                    while (($size / 1024) > 1) {
                        $size = $size / 1024;
                        $i++;
                    }
                        
                    $json[] = array(
                        'filename' => $this->get_basename($file),
                        'file'     => utf8_substr($file, utf8_strlen(DIR_IMAGE . 'data/')),
                        'size'     => round(utf8_substr($size, 0, utf8_strpos($size, '.') + 4), 2) . $suffix[$i]
                    );
                }
            }
        }
        
        $this->response->setOutput(json_encode($json));    
    }    
    
    public function create() {
        $this->language->load('common/filemanager');
                
        $json = array();
        
        if (isset($this->request->post['directory'])) {
            if (isset($this->request->post['name']) || $this->request->post['name']) {
                $directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');                               
                
                if (!is_dir($directory)) {
                    $json['error'] = $this->language->get('error_directory');
                }
                
                if (file_exists($directory . '/' . str_replace('../', '', $this->request->post['name']))) {
                    $json['error'] = $this->language->get('error_exists');
                }
            } else {
                $json['error'] = $this->language->get('error_name');
            }
        } else {
            $json['error'] = $this->language->get('error_directory');
        }
        
        if (!$this->user->hasPermission('modify', 'common/filemanager')) {
              $json['error'] = $this->language->get('error_permission');  
        }
        
        if (!isset($json['error'])) {    
            mkdir($directory . '/' . str_replace('../', '', $this->request->post['name']), 0777);
            
            $json['success'] = $this->language->get('text_create');
        }    
        
        $this->response->setOutput(json_encode($json));
    }
    
    public function delete() {
        $this->language->load('common/filemanager');
        
        $json = array();
        
        if (isset($this->request->post['path'])) {
            $path = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['path'], ENT_QUOTES, 'UTF-8')), '/');
             
            if (!file_exists($path)) {
                $json['error'] = $this->language->get('error_select');
            }
            
            if ($path == rtrim(DIR_IMAGE . 'data/', '/')) {
                $json['error'] = $this->language->get('error_delete');
            }
        } else {
            $json['error'] = $this->language->get('error_select');
        }
        
        if (!$this->user->hasPermission('modify', 'common/filemanager')) {
              $json['error'] = $this->language->get('error_permission');  
        }
        
        if (!isset($json['error'])) {
            if (is_file($path)) {
                unlink($path);
            } elseif (is_dir($path)) {
                $files = array();
                
                $path = array($path . '*');
                
                while(count($path) != 0) {
                    $next = array_shift($path);
            
                    foreach(glob($next) as $file) {
                        if (is_dir($file)) {
                            $path[] = $file . '/*';
                        }
                        
                        $files[] = $file;
                    }
                }
                
                rsort($files);
                
                foreach ($files as $file) {
                    if (is_file($file)) {
                        unlink($file);
                    } elseif(is_dir($file)) {
                        rmdir($file);    
                    } 
                }                
            }
            
            $json['success'] = $this->language->get('text_delete');
        }                
        
        $this->response->setOutput(json_encode($json));
    }

    public function move() {
        $this->language->load('common/filemanager');
        
        $json = array();
        
        if (isset($this->request->post['from']) && isset($this->request->post['to'])) {
            $from = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['from'], ENT_QUOTES, 'UTF-8')), '/');
            
            if (!file_exists($from)) {
                $json['error'] = $this->language->get('error_missing');
            }
            
            if ($from == DIR_IMAGE . 'data') {
                $json['error'] = $this->language->get('error_default');
            }
            
            $to = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['to'], ENT_QUOTES, 'UTF-8')), '/');

            if (!file_exists($to)) {
                $json['error'] = $this->language->get('error_move');
            }    
            
            if (file_exists($to . '/' . $this->get_basename($from))) {
                $json['error'] = $this->language->get('error_exists');
            }
        } else {
            $json['error'] = $this->language->get('error_directory');
        }
        
        if (!$this->user->hasPermission('modify', 'common/filemanager')) {
              $json['error'] = $this->language->get('error_permission');  
        }
        
        if (!isset($json['error'])) {
            rename($from, $to . '/' . $this->get_basename($from));
            
            $json['success'] = $this->language->get('text_move');
        }
        
        $this->response->setOutput(json_encode($json));
    }    
    
    public function copy() {
        $this->language->load('common/filemanager');
        
        $json = array();
        
        if (isset($this->request->post['path']) && isset($this->request->post['name'])) {
            if ((utf8_strlen($this->request->post['name']) < 2) || (utf8_strlen($this->request->post['name']) > 255)) {
                $json['error'] = $this->language->get('error_filename');
            }
                
            $old_name = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['path'], ENT_QUOTES, 'UTF-8')), '/');
            
            if (!file_exists($old_name) || $old_name == DIR_IMAGE . 'data') {
                $json['error'] = $this->language->get('error_copy');
            }
            
            if (is_file($old_name)) {
                $ext = strrchr($old_name, '.');
            } else {
                $ext = '';
            }        
            
            $new_name = dirname($old_name) . '/' . str_replace('../', '', html_entity_decode($this->request->post['name'], ENT_QUOTES, 'UTF-8') . $ext);
                                                                               
            if (file_exists($new_name)) {
                $json['error'] = $this->language->get('error_exists');
            }            
        } else {
            $json['error'] = $this->language->get('error_select');
        }
        
        if (!$this->user->hasPermission('modify', 'common/filemanager')) {
              $json['error'] = $this->language->get('error_permission');  
        }    
        
        if (!isset($json['error'])) {
            if (is_file($old_name)) {
                copy($old_name, $new_name);
            } else {
                $this->recursiveCopy($old_name, $new_name);
            }
            
            $json['success'] = $this->language->get('text_copy');
        }
        
        $this->response->setOutput(json_encode($json));    
    }

    function recursiveCopy($source, $destination) { 
        $directory = opendir($source); 
        
        @mkdir($destination); 
        
        while (false !== ($file = readdir($directory))) {
            if (($file != '.') && ($file != '..')) { 
                if (is_dir($source . '/' . $file)) { 
                    $this->recursiveCopy($source . '/' . $file, $destination . '/' . $file); 
                } else { 
                    copy($source . '/' . $file, $destination . '/' . $file); 
                } 
            } 
        } 
        
        closedir($directory); 
    } 

    public function folders() {
        $this->response->setOutput($this->recursiveFolders(DIR_IMAGE . 'data/'));    
    }
    
    protected function recursiveFolders($directory) {
        $output = '';
        
        $output .= '<option value="' . utf8_substr($directory, strlen(DIR_IMAGE . 'data/')) . '">' . utf8_substr($directory, strlen(DIR_IMAGE . 'data/')) . '</option>';
        
        $directories = glob(rtrim(str_replace('../', '', $directory), '/') . '/*', GLOB_ONLYDIR);
        
        foreach ($directories  as $directory) {
            $output .= $this->recursiveFolders($directory);
        }
        
        return $output;
    }
    
    public function rename() {
        $this->language->load('common/filemanager');
        
        $json = array();
        
        if (isset($this->request->post['path']) && isset($this->request->post['name'])) {
            if ((utf8_strlen($this->request->post['name']) < 2) || (utf8_strlen($this->request->post['name']) > 255)) {
                $json['error'] = $this->language->get('error_filename');
            }
                
            $old_name = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', html_entity_decode($this->request->post['path'], ENT_QUOTES, 'UTF-8')), '/');
            
            if (!file_exists($old_name) || $old_name == DIR_IMAGE . 'data') {
                $json['error'] = $this->language->get('error_rename');
            }
            
            if (is_file($old_name)) {
                $ext = strrchr($old_name, '.');
            } else {
                $ext = '';
            }        
            
            $new_name = dirname($old_name) . '/' . str_replace('../', '', html_entity_decode($this->request->post['name'], ENT_QUOTES, 'UTF-8') . $ext);
                                                                               
            if (file_exists($new_name)) {
                $json['error'] = $this->language->get('error_exists');
            }            
        }
        
        if (!$this->user->hasPermission('modify', 'common/filemanager')) {
              $json['error'] = $this->language->get('error_permission');  
        }
        
        if (!isset($json['error'])) {
            rename($old_name, $new_name);
            
            $json['success'] = $this->language->get('text_rename');
        }
        
        $this->response->setOutput(json_encode($json));
    }
    
    public function upload() {
        $this->language->load('common/filemanager');
        
        $json = array();
        
        if (isset($this->request->post['directory'])) {
            if (isset($this->request->files['image']) && $this->request->files['image']['tmp_name']) {
                $filename = $this->get_basename(html_entity_decode($this->request->files['image']['name'], ENT_QUOTES, 'UTF-8'));
                
                if ((strlen($filename) < 3) || (strlen($filename) > 255)) {
                    $json['error'] = $this->language->get('error_filename');
                }
                    
                $directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');
                
                if (!is_dir($directory)) {
                    $json['error'] = $this->language->get('error_directory');
                }
                
                if ($this->request->files['image']['size'] > 300000) {
                    $json['error'] = $this->language->get('error_file_size');
                }
                
                $allowed = array(
                    'image/jpeg',
                    'image/pjpeg',
                    'image/png',
                    'image/x-png',
                    'image/gif',
                    'application/x-shockwave-flash'
                );
                        
                if (!in_array($this->request->files['image']['type'], $allowed)) {
                    $json['error'] = $this->language->get('error_file_type');
                }
                
                $allowed = array(
                    '.jpg',
                    '.jpeg',
                    '.gif',
                    '.png',
                    '.flv'
                );
                        
                if (!in_array(strtolower(strrchr($filename, '.')), $allowed)) {
                    $json['error'] = $this->language->get('error_file_type');
                }

                if ($this->request->files['image']['error'] != UPLOAD_ERR_OK) {
                    $json['error'] = 'error_upload_' . $this->request->files['image']['error'];
                }            
            } else {
                $json['error'] = $this->language->get('error_file');
            }
        } else {
            $json['error'] = $this->language->get('error_directory');
        }
        
        if (!$this->user->hasPermission('modify', 'common/filemanager')) {
              $json['error'] = $this->language->get('error_permission');  
        }
        
        if (!isset($json['error'])) {    
            if (@move_uploaded_file($this->request->files['image']['tmp_name'], $directory . '/' . $filename)) {        
                $json['success'] = $this->language->get('text_uploaded');
            } else {
                $json['error'] = $this->language->get('error_uploaded');
            }
        }
        
        $this->response->setOutput(json_encode($json));
    }

    private function get_basename($filename){
        return preg_replace('/^.+[\\\\\\/]/', '', $filename);
    }
} 
?> 

转载于:https://www.cnblogs.com/sbfnxk201/p/3961207.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值