<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 陳剛 閱讀(4323) 評論(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
    主站蜘蛛池模板: 夜夜爽免费888视频| 亚洲国产精华液网站w| 久久青草免费91线频观看站街| 一本色道久久88—综合亚洲精品| 国产成人无码综合亚洲日韩| 又黄又爽一线毛片免费观看| 国产精品怡红院永久免费| 国产成人自产拍免费视频| 最新亚洲春色Av无码专区| 久久亚洲熟女cc98cm| 亚洲精品国精品久久99热一| 全亚洲最新黄色特级网站| 成全影视免费观看大全二| 蜜桃AV无码免费看永久| 国内永久免费crm系统z在线 | 九九热久久免费视频| 亚洲国产精品无码中文lv| 亚洲成人免费电影| 久久久久亚洲av无码专区导航| 红杏亚洲影院一区二区三区| 四只虎免费永久观看| 在线观看免费大黄网站| 一本无码人妻在中文字幕免费| 91精品国产免费网站| 久久香蕉国产线看免费| 日韩av无码免费播放| 韩日电影在线播放免费版| 国产精品九九久久免费视频| 免费国产va视频永久在线观看| 亚洲AV成人无码网天堂| 亚洲国产精品日韩av不卡在线| 国产午夜亚洲精品| 中文文字幕文字幕亚洲色| 亚洲一区二区三区在线观看蜜桃| 亚洲国产精品免费在线观看| 亚洲性一级理论片在线观看| 亚洲剧情在线观看| 国产色在线|亚洲| 四虎亚洲精品高清在线观看| 亚洲欧美国产精品专区久久| 亚洲精品久久久久无码AV片软件|