mirror of
https://github.com/nextcloud/server.git
synced 2026-07-15 13:01:34 -04:00
allow transparent opening of zip files from the web interface
This commit is contained in:
parent
72947e46d1
commit
a5df3f8ea7
3 changed files with 64 additions and 5 deletions
|
|
@ -12,3 +12,7 @@ foreach(array('ZIP') as $type){
|
|||
}
|
||||
|
||||
OC::$CLASSPATH['OC_Filestorage_Archive']='apps/files_archive/lib/storage.php';
|
||||
|
||||
OC_Hook::connect('OC_Filesystem','get_mountpoint','OC_Filestorage_Archive','autoMount');
|
||||
|
||||
OC_Util::addScript( 'files_archive', 'archive' );
|
||||
|
|
|
|||
15
apps/files_archive/js/archive.js
Normal file
15
apps/files_archive/js/archive.js
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('application/zip','Open','',function(filename){
|
||||
window.location='index.php?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
|
||||
});
|
||||
FileActions.setDefault('application/zip','Open');
|
||||
}
|
||||
});
|
||||
|
|
@ -13,10 +13,13 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
|
|||
*/
|
||||
private $archive;
|
||||
private $path;
|
||||
private static $mounted=array();
|
||||
private static $enableAutomount=true;
|
||||
private static $rootView;
|
||||
|
||||
private function stripPath($path){//files should never start with /
|
||||
if(substr($path,0,1)=='/'){
|
||||
return substr($path,1);
|
||||
$path=substr($path,1);
|
||||
}
|
||||
return $path;
|
||||
}
|
||||
|
|
@ -52,9 +55,14 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
|
|||
if($path==''){
|
||||
$stat=stat($this->path);
|
||||
}else{
|
||||
$stat=array();
|
||||
$stat['mtime']=$this->archive->mtime($path);
|
||||
$stat['size']=$this->archive->filesize($path);
|
||||
if($this->is_dir($path)){
|
||||
$stat=array('size'=>0);
|
||||
$stat['mtime']=filemtime($this->path);
|
||||
}else{
|
||||
$stat=array();
|
||||
$stat['mtime']=$this->archive->mtime($path);
|
||||
$stat['size']=$this->archive->filesize($path);
|
||||
}
|
||||
}
|
||||
$stat['ctime']=$ctime;
|
||||
return $stat;
|
||||
|
|
@ -64,7 +72,11 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
|
|||
if($path==''){
|
||||
return 'dir';
|
||||
}
|
||||
return $this->archive->fileExists($path.'/')?'dir':'file';
|
||||
if(substr($path,-1)=='/'){
|
||||
return $this->archive->fileExists($path)?'dir':'file';
|
||||
}else{
|
||||
return $this->archive->fileExists($path.'/')?'dir':'file';
|
||||
}
|
||||
}
|
||||
public function is_readable($path){
|
||||
return is_readable($this->path);
|
||||
|
|
@ -99,4 +111,32 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
|
|||
return false;//not supported
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* automount paths from file hooks
|
||||
* @param aray params
|
||||
*/
|
||||
public static function autoMount($params){
|
||||
if(!self::$enableAutomount){
|
||||
return;
|
||||
}
|
||||
$path=$params['path'];
|
||||
if(!self::$rootView){
|
||||
self::$rootView=new OC_FilesystemView('');
|
||||
}
|
||||
self::$enableAutomount=false;//prevent recursion
|
||||
$supported=array('zip');
|
||||
foreach($supported as $type){
|
||||
$ext='.'.$type.'/';
|
||||
if(($pos=strpos(strtolower($path),$ext))!==false){
|
||||
$archive=substr($path,0,$pos+strlen($ext)-1);
|
||||
if(self::$rootView->file_exists($archive) and array_search($archive,self::$mounted)===false){
|
||||
$localArchive=self::$rootView->getLocalFile($archive);
|
||||
OC_Filesystem::mount('OC_Filestorage_Archive',array('archive'=>$localArchive),$archive.'/');
|
||||
self::$mounted[]=$archive;
|
||||
}
|
||||
}
|
||||
}
|
||||
self::$enableAutomount=true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue