ckfinder - 是否可以在一个 CKFinder 视图中组合多个 baseDirs?
问题描述
我想要一个 CKFinder 视图,从两个完全不同的源文件夹中检索内容。这两个文件夹将是相同的资源类型,例如图像。然后,用户还可以拖动文件。
就我而言,一个文件夹是共享位置,另一个是基于当前用户的动态私人文件夹。我已经通过修改 ConfigurationPathBuilder 中的 getBaseDir 函数使路径动态化,但我无法将两个路径都添加到同一个 CKFinder 实例。
例如,我将有以下三个文件夹:
- C:/图像/共享
- C:/图像/用户/user1
- C:/图像/用户/user2
是否可以在单个 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
我已经根据我的期望创建了一个模拟屏幕截图,而不是只有一个“图像”文件夹,而是有两个文件夹,每个来源一个:
解决方案
从您的描述来看,在我看来您正在使用 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/joe
或http://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 。您必须返回正确的baseUrl
并baseDir
基于会话变量(用户凭据)。
如有必要,您还可以调整 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
推荐阅读
- python - 将 pandas groupby 结果扩展到初始数据框
- google-sheets - 如何在谷歌表格查询公式中使用绝对引用或按列名查询多个表格?
- android - 图片未从 Firebase 中检索
- javascript - 使用 websocket 和 javascript 在一个对象中连接两个不同的坐标
- python - opencv对象检测中的TypeError
- random - 需要解决 rand_range 只提供浮点数而不是整数 - GDScript
- ios - viewdidload后如何更新uiview?
- php - 如何格式化 php 数组值并将它们插入数据库
- css - 在 Angular Material 中移除对 mat-button-toggle-group 的关注
- docker - 将 NFS docker 卷中的单个文件挂载到容器中