是否可以在一个CKFinder视图中合并多个baseDirs?

时间:2019-06-12 13:11:07

标签: ckfinder

我想要一个CKFinder视图,该视图从两个完全不同的源文件夹中检索内容。这两个文件夹将具有相同的resourceType,例如Images。然后,用户还可以拖动文件。

在我的情况下,一个文件夹将是共享位置,而另一个文件夹将是基于当前用户的动态私有文件夹。我已经通过修改ConfigurationPathBuilder中的getBaseDir函数使路径动态化,但是我无法将两个路径都添加到同一CKFinder实例中。

例如,我将拥有以下三个文件夹:

  • C:/ images / shared
  • C:/ images / users / user1
  • C:/ images / users / user2

是否可以在单个CKFinder视图中同时包含“ C:/ images / shared”文件夹和“ C:/ images / users / user1”文件夹,而不会暴露任何其他文件夹?不能使用C:/ images作为baseDir,因为它将包括users和user2文件夹。

我目前正在使用CKFinder2,但我也会接受CKFinder3的答案。

我找到了以下资源,但由于我还定义了不同的resourceTypes(如Documents),因此无法使用,我也想以相同的方式使用它:

https://ckeditor.com/old/forums/Support/How-can-I-provide-a-shared-folder

我创建了一个符合我期望的模拟屏幕截图,而不是只有一个“ Images”文件夹,而是两个文件夹,每个来源一个:

https://i.imgur.com/l6fKHRL.png

1 个答案:

答案 0 :(得分:0)

从您的描述来看,我认为您正在使用Java的CKFinder 2.x(我听说他们目前在Alpha阶段已安装CKFinder 3 for Java,因此有可能很快发布新版本)。如果是这种情况,那么我就是这样:

您的目录结构应如下所示:

Userfiles
   adam
      files
      images
      flash
   joe
      files
      images
      flash
   …
   john
     files
      images
      flash
Public

将CKFinder(例如joe)加载到CKFinder中后,应该显示为(方括号是您在CKFinder中看到的内容,旁边是目录路径):

(Userfiles == userfiles/joe)
[Files] -  /userfiles/joe/files/
[Images] -  /userfiles/joe/images/ 
[Flash] -  /userfiles/joe/flash/
[Public]  
[Basket]

用户专用文件夹被视为userfiles文件夹,在其中,您将拥有3种默认资源类型:文件,图像,Flash和一个新的Public(可以删除不需要的资源)。当您将CKFinder与CKEditor一起使用时,这种方法效果很好,因为您保留了CKfinder期望的默认资源类型结构,因此您无需进行进一步的调整。

这些资源类型必须在CKFinder的配置文件中定义,但是您可能知道这一点。默认资源类型已经存在,但必须添加新的资源。

baseURL会根据用户凭据进行更改。可以是http://yourapp:8080/ckfinder/userfiles/joehttp://yourapp:8080/ckfinder/userfiles/john。在类似ASP.NET或PHP的连接器中,您可以检查用户凭据并直接在配置文件中应用正确的userfiles文件夹,例如

If( user.name.equals('joe') )
baseUrl = 'http://yourapp:8080/ckfinder/userfiles/' + request.get( ’joe’);

在Java中,您将需要使用Pathbuilder: https://docs-old.ckeditor.com/CKFinder_2.x/Developers_Guide/Java/Configuration/Extending#Creating_a_Custom_PathBuilder_Class。您必须根据会话变量(用户凭据)返回正确的baseUrlbaseDir

如果需要,您还可以调整ACL。假设您要对私有文件夹具有全部完全访问权限,而对pblic文件夹具有只读访问权限:

<accessControl>
 <role>*</role>
 <resourceType>*</resourceType>//Full access to any folder or file by default
 <folder>/</folder>
 <folderView>true</folderView>
 <folderCreate>true</folderCreate>
 <folderRename>true</folderRename>
 <folderDelete> true</folderDelete>
 <fileView>true</fileView>
 <fileUpload>true</fileUpload>
 <fileRename>true</fileRename>
 <fileDelete>true</fileDelete>
</accessControl>
<accessControl>
 <role>*</role>
 <resourceType>Public</resourceType> // Restricted access to Public resource type.
 <folder>/</folder>
 <folderView>true</folderView>
 <folderCreate> false </folderCreate>
 <folderRename>false</folderRename>
 <folderDelete>false</folderDelete>
 <fileView>true</fileView>
 <fileUpload> false </fileUpload>
 <fileRename> false </fileRename>
 <fileDelete> false </fileDelete>
</accessControl>

请记住,CKFinder只是您应用程序的一个附件,仅根据来自该应用程序的数据来决定谁以及如何访问CKFinder。您希望个性化的所有用户配置(例如ACL,映射到适当的用户文件夹,他的凭据和其他CKFinder设置)都应保存在数据库中,并在用户登录时加载。接下来,您的应用程序必须将该数据放入例如会话,以允许CKFinder读取并应用它。

注意::当CKFinder与CKEditor集成时,它默认使用默认资源类型。这可能会导致Public文件夹(不是默认文件夹)出现问题。 它可能仅对链接按钮可见,而对图像不可见。 这里有两种解决方案–您可以具有对公用文件夹的有限访问权限(仅从链接对话框)或显示所有文件夹,无论按下哪个按钮(默认情况下,从“图像”对话框调用CKFinder时仅显示images文件夹) )。 对于第二种解决方案,您将需要手动集成方法(在该方法中,您将不得不从网址中丢失type参数) https://docs-old.ckeditor.com/CKFinder_2.x/Developers_Guide/Java/CKEditor_Integration#Manual_Integration