首页 > 解决方案 > 是否可以在一个 CKFinder 视图中组合多个 baseDirs?

问题描述

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

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

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

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

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

我找到了以下资源,但这不适用于我的情况,因为我还定义了不同的资源类型(如文档),我也想以相同的方式使用它们:

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

我已经根据我的期望创建了一个模拟屏幕截图,而不是只有一个“图像”文件夹,而是有两个文件夹,每个来源一个:

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

标签: ckfinder

解决方案


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

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

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

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

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

用户私有文件夹被视为 userfiles 文件夹,其中您将拥有 3 种默认资源类型:文件、图像、Flash 和一种新的公共(您可以删除不需要的资源)。当您将 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这可能会导致非默认文件夹出现问题。它可能仅对链接按钮可见,而对图像不可见。这里有两种解决方案 - 您可以限制对公共文件夹的访问(仅从链接对话框)或显示所有文件夹,无论按下哪个按钮(默认情况下images,当从图像对话框调​​用 CKFinder 时仅显示文件夹)。对于第二种解决方案,您将需要手动集成方法(您将不得不type从 URL 中丢失参数) https://docs-old.ckeditor.com/CKFinder_2.x/Developers_Guide/Java/CKEditor_Integration#Manual_Integration


推荐阅读