<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    子在川上曰

      逝者如斯夫不舍晝夜
    隨筆 - 71, 文章 - 0, 評論 - 915, 引用 - 0
    數據加載中……

    讓Rails版的FCKEditor支持動態設置上傳目錄

    一個多用戶的系統,上傳圖像文件等,希望不同用戶的圖像上傳到它專有的目錄里。我最初查到在PHP版的FCKEditor是通過設置$Config('UserFilesPath')來實現,但Rails版的FCKEditor沒有此項設置(搜索UserFilesPath關鍵字后做出此判斷)。接著,我查看了FCKEditor關鍵的fckeditor_controller.rb的源代碼,似乎它并不支持此項設置。再看javaeye是怎么用FCKEditor的,發現它放棄了FCKEditor的上傳功能。google了半天,除了那些轉來轉去的相同內容的帖子之外(搞不懂有了google之后,怎么還會有人費勁去轉帖別人的文章),一點營養也沒有。在JavaEye發了個求助帖,沒人理 :-( 。 傳說中高手云集的JavaEye,其Rails版塊真是冷清,給人陰颼颼的感覺。沒辦法,自己改源代碼吧。
    文/陳剛 www.chengang.com.cn 轉載請保留出處
    1.修改fckeditor_controller.rb,把它那幾個private方法修改如下:
    ??
    ??
    private
    ??def?current_directory_path
    ????base_dir?
    =?"#{RAILS_ROOT}/public"

    ????#TODO?在創建用戶時,就建立好目錄。這時可以去掉這部份代碼,提高運行效率。
    ????(
    "#{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

    另外,它前面的常量UPLOADED_ROOT也沒用了,可以刪掉。


    2. 在上面的代碼中params[:uploaded]是關鍵,它就是我們動態定義的上傳目錄。該值來自于FCKEditor的一些html頁面,它是通過get參數傳入的。修改browser.html文件(如下粗體部份),在它的url請求中把我們定義目錄加入到get參數列中,這樣它就可以傳到fckeditor_controller.rb里了


    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.js(如下粗體部份),把uploaded加入到get參數列中。

    //?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?
    =?'微軟雅黑;宋體;黑體;隸書;楷體_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中加入一句(如下粗體所示)。
    ??????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']的值要傳到fckcustom.js的FCKConfig.uploaded里,還需要修改fckeditorcode_gecko.js和fckeditorcode_ie.js(這兩個文件對javascript進行了壓縮處理,修改起來較難操作)。我是參考了oFCKeditor.Config['CustomConfigurationsPath'] 這個參數的載入實現,才找到這種鳥不生蛋的地方。搜索這兩個文件的關鍵字CustomConfigurationsPath,找到如下一行,然后加入一個else if判斷(如下粗體所示)。
    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了。如下粗體所示,把標準的fckeditor_textarea新增加了一個參數,其中params[:user_id]是把用戶的ID值做為目錄名。這樣就實現了動態改變FCKEditor的上傳目錄。

    <%=fckeditor_textarea(:topic,?:content,?:ajax?=>?true,?:toolbarSet?=>?'Simple',?:height?=>?'400px',? :path?=>?"/uploads/#{params[:user_id]}")?%>


    修改完后需要重啟WEB服務,最后別忘記把public/javascripts/fckeditor和vendor/plugins/fckeditor/public/javascripts同步一下,原因見http://www.tkk7.com/chengang/archive/2007/09/24/147867.html

    posted on 2007-09-26 10:13 陳剛 閱讀(4306) 評論(5)  編輯  收藏 所屬分類: Rails&Ruby

    評論

    # re: 讓Rails版的FCKEditor支持動態設置上傳目錄  回復  更多評論   

    不可奪得得好文章.很不錯,試驗一下....
    2007-09-26 14:32 | weskycn

    # re: 讓Rails版的FCKEditor支持動態設置上傳目錄  回復  更多評論   

    用戶是不是可以無限制的上傳文件?
    2007-09-27 09:07 | 路人甲

    # re: 讓Rails版的FCKEditor支持動態設置上傳目錄  回復  更多評論   

    @路人甲
    好象沒發現FCKEditor有文件大小限制
    2007-09-28 08:26 | 陳剛

    # re: 讓Rails版的FCKEditor支持動態設置上傳目錄  回復  更多評論   

    不知道現在還行不行了。按照這個方法不行了。
    2008-05-23 00:57 | chiuras

    # re: 讓Rails版的FCKEditor支持動態設置上傳目錄  回復  更多評論   

    是我失誤了,可以用,非常感謝。
    2008-05-23 01:06 | chiuras
    主站蜘蛛池模板: 在线免费一区二区| 亚洲冬月枫中文字幕在线看| 2021久久精品免费观看| 爱情岛论坛免费视频| 亚洲午夜国产精品| 狠狠色伊人亚洲综合成人| 四虎永久免费影院| 久久WWW色情成人免费观看| 国产成人AV片无码免费| 一级毛片在线免费视频| 亚洲av综合av一区二区三区| 亚洲中字慕日产2021| 午夜亚洲AV日韩AV无码大全| 亚洲日本中文字幕天堂网| 国产美女a做受大片免费| 欧美大尺寸SUV免费| 91福利免费视频| 久久免费看少妇高潮V片特黄| 一区二区三区免费在线视频| 亚洲日韩国产欧美一区二区三区| 亚洲成人福利在线| 亚洲成色在线影院| 亚洲av中文无码乱人伦在线播放| 亚洲日韩在线观看| 亚洲成网777777国产精品| 国产精品视频免费一区二区三区| 天天摸天天操免费播放小视频 | 在线看片无码永久免费视频| 日韩在线不卡免费视频一区| 中文字幕一区二区三区免费视频| 免费在线观看自拍性爱视频| 国产成人综合久久精品亚洲| 爱情岛亚洲论坛在线观看| 亚洲Av无码国产一区二区| 亚洲av永久无码精品秋霞电影秋 | 亚洲人成在线中文字幕| 亚洲三级中文字幕| 亚洲人成在线中文字幕| 亚洲一区二区影视| 亚洲综合欧美色五月俺也去| 亚洲av无一区二区三区|