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

Не скачиваются файлы с медиаисточников 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


Помогите, может кто сталкивался?
gerasechkin
27 сентября 2016, 08:36
modx.pro
1 077
0

Комментарии: 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; 
    }

Применяйте на свой страх и риск.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1