1.修改fckeditor_controller.rbQ把它那几个privateҎ(gu)修改如下Q?br />
private
def current_directory_path
base_dir = "#{RAILS_ROOT}/public"
#TODO 在创建用hQ就建立好目录。这时可以去掉这部䆾代码Q提高运行效率?br /> ("#{params[:uploaded]||UPLOADED}/#{params[:Type]}").split('/').each do |s|
next if s==''
base_dir += '/' + s
Dir.mkdir(base_dir,0775) unless File.exists?(base_dir)
end
check_path("#{base_dir}#{params[:CurrentFolder]}")
end
def upload_directory_path
uploaded = @request.relative_url_root.to_s+"#{params[:uploaded]||UPLOADED}/#{params[:Type]}"
"#{uploaded}#{params[:CurrentFolder]}"
end
def check_file(file)
# check that the file is a tempfile object
unless "#{file.class}" == "Tempfile" || "#{file.class}" == "StringIO"
@errorNumber = 403
throw Exception.new
end
file
end
def check_path(path)
exp_path = File.expand_path path
if exp_path !~ %r[^#{File.expand_path(RAILS_ROOT)}/public#{params[:uploaded]||UPLOADED}]
@errorNumber = 403
throw Exception.new
end
path
end
另外Q它前面的常量UPLOADED_ROOT也没用了Q可以删掉?br />
2. 在上面的代码?span style="color: rgb(0, 0, 0);">params[:uploaded]是关键,它就是我们动态定义的上传目录。该值来自于FCKEditor的一些html面Q它是通过get参数传入的。修改browser.html文gQ如下粗体部份)Q在它的urlh中把我们定义目录加入到get参数列中Q这样它?yu)可以传?/span>fckeditor_controller.rb里了?br />
var sServerPath = GetUrlParam( 'ServerPath' ) ;
if ( sServerPath.length > 0 )
oConnector.ConnectorUrl += 'ServerPath=' + escape( sServerPath ) + '&' ;
var sUploaded = GetUrlParam( 'uploaded' ) ;
if ( sUploaded.length > 0 )
oConnector.ConnectorUrl += 'uploaded=' + escape( sUploaded ) + '&' ;
oConnector.ResourceType = GetUrlParam( 'Type' ) ;
oConnector.ShowAllTypes = ( oConnector.ResourceType.length == 0 ) ;
3. 上面的GetUrlParam( 'uploaded' ) 的值来自于fckcustom.js。修改fckcustom.jsQ如下粗体部份)Q把uploaded加入到get参数列中?br />
// CHANGE FOR APPS HOSTED IN SUBDIRECTORY
FCKRelativePath = '';
// DON'T CHANGE THESE
FCKConfig.LinkBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector='+FCKRelativePath+'/fckeditor/command';
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?uploaded='+FCKConfig.uploaded+'&Type=Image&Connector='+FCKRelativePath+'/fckeditor/command';
FCKConfig.FlashBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?uploaded='+FCKConfig.uploaded+'&Type=Flash&Connector='+FCKRelativePath+'/fckeditor/command';
FCKConfig.LinkUploadURL = FCKRelativePath+'/fckeditor/upload';
FCKConfig.ImageUploadURL = FCKRelativePath+'/fckeditor/upload?Type=Image&uploaded='+FCKConfig.uploaded;
FCKConfig.FlashUploadURL = FCKRelativePath+'/fckeditor/upload?Type=Flash&uploaded='+FCKConfig.uploaded;
FCKConfig.AllowQueryStringDebug = false;
FCKConfig.SpellChecker = 'SpellerPages';
// ONLY CHANGE BELOW HERE
FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/silver/';
FCKConfig.AutoDetectLanguage = false ;
FCKConfig.DefaultLanguage = 'zh-cn' ;
FCKConfig.FontNames = '微Y雅黑;宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;
FCKConfig.ToolbarSets["Simple"] = [
['Source','-','FitWindow','Preview','-','Templates'],
['PasteText','PasteWord'],
['Undo','Redo','Find','Replace'],
'/',
['RemoveFormat','Bold','Italic','Underline','StrikeThrough'],
['OrderedList','UnorderedList','Outdent','Indent'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['TextColor','BGColor'],
['Link','Unlink','Anchor'],
['Image','Flash','Table','Rule','Smiley'],
'/',
['Style','FontFormat','FontName','FontSize']
] ;
4. 上面FCKConfig.uploaded的值来自于fckeditor.rb。在fckeditor.rb中加入一句(如下_体所C)?br /> javascript_tag( "var oFCKeditor = new FCKeditor('#{id}', '#{width}', '#{height}', '#{toolbarSet}');\n"+
"oFCKeditor.BasePath = \"#{base_path}\"\n"+
"oFCKeditor.Config['CustomConfigurationsPath'] = '../../fckcustom.js';\n"+
"oFCKeditor.Config['uploaded'] = '#{options[:path]}';\n"+
"oFCKeditor.ReplaceTextarea();\n")
5.不过上面oFCKeditor.Config['uploaded']的D传到fckcustom.js的FCKConfig.uploaded里,q需要修改fckeditorcode_gecko.js和fckeditorcode_ie.jsQ这两个文g对javascriptq行了压~处理,修改h较难操作Q。我是参考了oFCKeditor.Config['CustomConfigurationsPath'] q个参数的蝲入实玎ͼ才找到这U鸟不生蛋的地方。搜索这两个文g的关键字CustomConfigurationsPathQ找到如下一行,然后加入一个else if判断(如下_体所C)?br />if (D=='CustomConfigurationsPath') FCKConfig[D]=E;else if (D=='uploaded') FCKConfig[D]=E;else if (E.toLowerCase()=="true") this.PageConfig[D]=true;
6.最后在fckeditor.rb里的#{options[:path]}来自于我们前台的view了。如下粗体所C,把标准的fckeditor_textarea新增加了一个参敎ͼ其中params[:user_id]是把用户的ID值做?/span>目录名。这样就实现了动态改变FCKEditor的上传目录?/span>
<%=fckeditor_textarea(:topic, :content, :ajax => true, :toolbarSet => 'Simple', :height => '400px', :path => "/uploads/#{params[:user_id]}") %>
修改完后需要重启WEB服务Q最后别忘记把public/javascripts/fckeditor和vendor/plugins/fckeditor/public/javascripts同步一下,原因见http://www.aygfsteel.com/chengang/archive/2007/09/24/147867.html

]]>