完整主题:FCK 编辑器 2.x:使用单个 FCKeditor 为不同的应用程序在不同的文件夹中上传文件/图像/视频,以安全的方式使 $Config['UserFilesPath'] 完全动态
它可以通过多种方式完成。我正在解释一个过程,我根据我的 php 应用程序的代码结构应用了该过程。我为不同的应用程序遵循相同的代码结构/框架,每个应用程序都作为我服务器中的一个子文件夹。因此,逻辑上需要使用一个单一的 FCKeditor 并以某种方式对其进行配置,以使其适用于所有应用程序。FCKeditor 的内容部分还可以。它可以很容易地被来自单个 FCKeditor 组件的不同应用程序或项目重用。但是文件上传会出现问题,例如图像、视频或任何其他文档。为了使其适用于不同的项目,文件必须上传到不同项目的单独文件夹中。而对于 $Config['UserFilesPath'] 必须通过配置动态文件夹路径,意味着每个项目的不同文件夹路径,但在同一位置调用相同的 FCKeditor 组件。我正在逐步解释一些不同的过程。这些在 FCKeditor 版本 2.5.1 和 VersionBuild 17566 上对我很有效,我希望它们也能对其他人有效。如果它不适用于其他开发人员,那么他们可能需要根据他们的项目代码结构和文件夹写入权限以及 FCKeditor 版本在这些过程中进行一些调整。
1) 在 fckeditor\editor\filemanager\connectors\phpconfig.php 文件中
a) 追求全局 $Config ;和 $Config['Enabled'] = false ; i)在那里,如果想要一个依赖于会话的安全方法:仅用于单个站点设置:即每个项目域或子域一个 FCKeditor,而不是多个项目一个 FCKeditor 然后放置此代码:
if(!isset($_SESSION)){
session_start();
}
if(isset($_SESSION['SESSION_SERVER_RELATIVEPATH']) && $_SESSION['SESSION_SERVER_RELATIVEPATH']!="") {
$relative_path=$_SESSION['SESSION_SERVER_RELATIVEPATH'];
include_once($_SERVER['DOCUMENT_ROOT'].$relative_path."configurations/configuration.php");
}
注意:这里,$_SESSION['SESSION_SERVER_RELATIVEPATH']:webroot对应的项目的相对文件夹路径;应该类似于“/project/folder/path/”并将此会话变量设置在会话开始的项目中的一个公共文件中。并且应该有一个configurations/configuration.php作为你的项目中的配置文件。如果它的名称或路径不同,您必须在此处放置相应的路径而不是configurations/configuration.php
ii) 如果想为不同的项目使用单个 FCKeditor 组件,表示为不同的子文件夹并使用依赖于会话的安全方式(假设不同项目的 session_name 不同,以区分它们在单个服务器中的会话)。但是,如果项目表示为子域或不同域,则它不起作用,那么必须使用下面提供的会话独立方式(iii)(尽管它不安全)。放置此代码:
if(!isset($_SESSION)){
session_name($_REQUEST['param_project_to_fck']);
session_start();
}
if(isset($_SESSION['SESSION_SERVER_RELATIVEPATH']) && $_SESSION['SESSION_SERVER_RELATIVEPATH']!="") {
$relative_path=$_SESSION['SESSION_SERVER_RELATIVEPATH'];
include_once($_SERVER['DOCUMENT_ROOT'].$relative_path."configurations/configuration.php");
}
请阅读上一点末尾的NB,即第(i)点
iii)如果想为不同的项目使用单个 FCKeditor 组件,则代表不同的子文件夹以及子域或域(尽管它不完全安全)。放置此代码:
if(isset($_REQUEST['param_project_to_fck']) && $_REQUEST['param_project_to_fck']!=""){ //base64 encoded relative folder path of the project corresponding to the webroot; should be like "/project/folder/path/" before encoding
$relative_path=base64_decode($_REQUEST['param_project_to_fck']);
include_once($_SERVER['DOCUMENT_ROOT'].$relative_path."configurations/configuration.php");
}
请阅读第 (i) 点末尾的 NB
b)现在,对于您选择的任何情况,请找到以下代码:
// Path to user files relative to the document root.
$Config['UserFilesPath'] = '/userfiles/' ;
并替换以下代码:
if(isset($SERVER_RELATIVEPATH) && $SERVER_RELATIVEPATH==$relative_path) { //to make it relatively secure so that hackers can not create any upload folder automatcally in the server, using a direct link and can not upload files there
$Config['Enabled'] = true ;
$file_upload_relative_path=$SERVER_RELATIVEPATH;
}else{
$Config['Enabled'] = false ;
exit();
}
// Path to user files relative to the document root.
//$Config['UserFilesPath'] = '/userfiles/' ;
//$Config['UserFilesPath'] = $file_upload_relative_path.'userfiles/' ;
$Config['UserFilesPath'] = '/userfiles'.$file_upload_relative_path;
这里 $SERVER_RELATIVEPATH 是相对路径,它必须在之前包含的项目配置文件中设置。
在这里,您可以使用 $file_upload_relative_path 变量将 $Config['UserFilesPath'] 设置为任何其他动态文件夹路径。在我的 bluehost linux 服务器中,因为它们是项目根文件夹(0755 权限)和 userfiles 文件夹之间的文件夹用户权限冲突在它和 userfiles 下的子文件夹(根据 FCKeditor 编码应该是 0777),因此它不允许在这些文件夹中上传文件。因此,我在服务器 webroot(项目根文件夹之外)创建了一个文件夹 userfiles,并将权限设置为 0777,使用 $config 设置的代码为:
$Config['UserFilesPath'] = '/userfiles'.$file_upload_relative_path;
但是,如果您对项目子文件夹的写权限没有问题,那么您可以使用上一行(在上一个代码段中注释掉):
$Config['UserFilesPath'] = $file_upload_relative_path.'userfiles/' ;
请注意,您将现有的 $Config['UserFilesPath'] = '/userfiles/' 注释掉;如果它存在于文件的其他位置,则通过替换或简单地注释掉此文件中的内容。
2) 如果您选择 1) (a) (ii) 或 (iii) 方法,则打开
(a) fckeditor\editor\filemanager\browser\default\browser.html 文件。
搜索此行: var sConnUrl = GetUrlParam( 'Connector' ) ;
将这些命令放在该行之后:
var param_project_to_fck = GetUrlParam( 'param_project_to_fck' ) ;
现在,搜索这一行: sUrl += '&CurrentFolder=' + encodeURIComponent( this.CurrentFolder ) ;
将此命令放在该行之后:
sUrl += '¶m_project_to_fck=' + param_project_to_fck ;
(b) 现在,打开 ckeditor\editor\filemanager\browser\default\frmupload.html 文件。
搜索这一行(它应该在 SetCurrentFolder() 函数中):
sUrl += '&CurrentFolder=' + encodeURIComponent( folderPath ) ;
将此命令放在该行之后:
sUrl += '¶m_project_to_fck='+window.parent.param_project_to_fck;
3)现在你想在你的项目中显示 FCKeditor,你必须把这些行放在相应的 php 文件/页面中:
include_once(Absolute/Folder/path/for/FCKeditor/."fckeditor/fckeditor.php") ;
$oFCKeditor = new FCKeditor(Field_name_for_editor_content_area) ;
$oFCKeditor->BasePath = http_full_path_for_FCKeditor_location.'fckeditor/' ;
$oFCKeditor->Height = 400;
$oFCKeditor->Width = 600;
$oFCKeditor->Value =Your_desired_content_to_show_in_editor;
$oFCKeditor->Create() ;
a) 现在,如果您选择 1) (a) (ii) 或 (iii) 方法,则在该行之前放置以下代码段: $oFCKeditor->Create() ;
$oFCKeditor->Config["LinkBrowserURL"] = ($oFCKeditor->BasePath)."editor/filemanager/browser/default/browser.html?Connector=../../connectors/php/connector.php¶m_project_to_fck=".base64_encode($SERVER_RELATIVEPATH);
$oFCKeditor->Config["ImageBrowserURL"] = ($oFCKeditor->BasePath)."editor/filemanager/browser/default/browser.html?Type=Image&Connector=../../connectors/php/connector.php¶m_project_to_fck=".base64_encode($SERVER_RELATIVEPATH);
$oFCKeditor->Config["FlashBrowserURL"] = ($oFCKeditor->BasePath)."editor/filemanager/browser/default/browser.html?Type=Flash&Connector=../../connectors/php/connector.php¶m_project_to_fck=".base64_encode($SERVER_RELATIVEPATH);
b) 如果您选择 1) (a) (ii) 方法,那么在上面的代码代码段中,只需将所有文本:base64_encode($SERVER_RELATIVEPATH) 替换为:base64_encode(session_name())
你完成了。