Не скачиваются файлы в media browser Новый

Дополнение: webdav, swift

Не скачиваются файлы с медиаисточников webdav(Я.Диск), swift(Selectel), если в дереве каталогов нажать «Скачать файл»


в браузере вываливается ошибка 500:



Логи чистые, с «FileSystem» все качает.
на 2.5.0-pl и 2.5.1-pl одно и то-же.

Вот URL и ответ сервера:

Request URL:http://s6736.h5.modhost.pro/connectors/index.php?action=browser/file/download&download=1&file=secur.png&HTTP_MODAUTH=modx57ea24863915f2.67495657_157ea24a7c1de60.47467349&source=2&wctx=undefined
Request Method:GET
Status Code:500 Internal Server Error


Помогите, может кто сталкивался?
27 сентября 2016, 11:36    gerasechkin   
0    253 0

Комментарии (1)

  1. gerasechkin 05 октября 2016, 12:22 # +1
    Временный костыль, для того чтобы заработало скачивание из админки по webdav:

    Причина в том, что в компоненте webdav не создается объект modFileHandler, почему он не создается, так и не разобрались.

    Без редактирования файлов modx не обойтись, т.е. при обновлении надо будет исправлять снова.

    1. В файле core/model/modx/modfilehandler.class.php комментируем функцию make (строка 48) и вместо нее вставляем:

    public function make($path, array $options = array(), $overrideClass = '',$check = true) {
    
            if($check) 
            {
                $path = $this->sanitizePath($path);
            }
            $class = 'modFile';
            if (!empty($overrideClass)) {
                $class = $overrideClass;
            } else {
                if (is_dir($path)) {
                    $path = $this->postfixSlash($path);
                    $class = 'modDirectory';
                } else {
                    $class = 'modFile';
                }
            }
            
            return new $class($this, $path, $options);
        }
    2. этом же файле в функции download комментируем (в районе 564 строки)

    Header('Content-Length: ' . $this->getSize());


    3. в файле core/components/webdav/model/webdav/webdavmediasource.class.php комментируем функцию WebDAVMediaSource (в самом начале) и вместо нее вставляем:

    class WebDAVMediaSource extends modMediaSource implements modMediaSourceInterface {
        private $client;
        private $basePath;
        private $baseUrl;
        private $cached = false;
        private $cacheTime = false;
        private $proxified = false;
        private $preview = false;
        private $tmp_file = '';
        public $fileHandler; //добавлено
    
        /**
         * {@inheritDoc}
         * @return boolean
         */
        public function initialize() {
            parent::initialize();
    
            $properties = $this->getPropertyList();
    
    	$this->cached = $this->getOption('cached', $properties, false);
    	$this->cacheTime = $this->getOption('cacheTime', $properties, 10) * 60;
    
    	$this->proxified = $this->getOption('proxy', $properties, false);
    
    	$this->preview = $this->getOption('preview', $properties, false);
    
    	$this->basePath = $this->getOption('basePath', $properties);
    	if (substr($this->basePath, -1) != '/')
        	    $this->basePath .= '/';
    
    	if ($this->proxified) {
    	    $this->baseUrl = $this->xpdo->getOption('site_url') .
    		ltrim($this->xpdo->getOption('assets_url'), '/') .
    		'components/webdav/index.php?action=proxy&source=' . $this->get('id') . '&ctx=' . $this->xpdo->context->key . '&src=';
    	} else {
    	    $this->baseUrl = $this->getOption('baseUrl', $properties) . '/';
    	    if ($this->basePath != '/')
    		$this->baseUrl .= $this->basePath;
    	}
    
    	$this->client = new WebDAV_Client(array(
    	    'uri'      => $this->getOption('server', $properties),
    	    'path'     => $this->basePath,
    	    'user'     => $this->getOption('login', $properties),
    	    'password' => $this->getOption('password', $properties),
    	    'auth'     => $this->getOption('authMethod', $properties),
    	    'ssl'      => $this->getOption('verifySSL', $properties)));
    
            $this->xpdo->lexicon->load('webdav:default', 'webdav:source');
            //добавлено
            $options = array();
            if (!$this->ctx) {
                $this->ctx =& $this->xpdo->context;
            }
    
            $options['context'] = $this->ctx->get('key');
            $this->fileHandler = $this->xpdo->getService('fileHandler','modFileHandler', '',$options);
            return true;
        }
    	public function getBasePath($object = '') { 
            if ($this->proxified) {
        	    $baseUrl = $this->xpdo->getOption('site_url') .
        		ltrim($this->xpdo->getOption('assets_url'), '/') .
        		'components/webdav/index.php?action=proxy&source=' . $this->get('id') . '&ctx=web&src=';
    	   }
        return $baseUrl; 
        }

    Применяйте на свой страх и риск.
    Вы должны авторизоваться, чтобы оставлять комментарии.