CKEditor+Struts2實(shí)現(xiàn)文件上傳總結(jié)

這段時(shí)間在做一個(gè)Java Web項(xiàng)目需要用到CKEditor做編輯器,但這個(gè)編輯器取值和圖片上傳不太好弄铅歼,特別是圖片上傳公壤,寫(xiě)篇文章紀(jì)念一下。

寫(xiě)在最前:Eclipse如何將項(xiàng)目部署到tomcat椎椰,而不是workspace的somewhere

這個(gè)很重要厦幅,不然上傳的文件怎么生成URI呢?MyEclipse不知道有沒(méi)有這個(gè)問(wèn)題慨飘,本人沒(méi)有測(cè)試确憨。但Eclipse是默認(rèn)將web項(xiàng)目部署到.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps下的,很無(wú)語(yǔ)套媚!

  • 先放一張配置好后的Server


    正確配置的Server

Step 1:停掉你的Tomcat服務(wù)器缚态,并刪除當(dāng)前配置的server

  • 一般雙擊Server看到的Server Locations是灰掉的,不能操作堤瘤,所以要?jiǎng)h掉重配


    默認(rèn)的Server配置

Step 2:直接新建一個(gè)Server

點(diǎn)這里新建就好

Step 3:雙擊Server進(jìn)行配置

  • 選擇Deploy path到你tomcat的webapps下
重新配置Server
  • 重新發(fā)布項(xiàng)目到Server就可以在tomcat的webapps下看到你的項(xiàng)目了凉当。

在JSP中引入CKEditor

Step 1:首先你得需要一個(gè)CKEditor

鏈接:http://pan.baidu.com/s/1dECfVax 密碼:mzbw
  • 將整個(gè)文件夾拷到你得WebContent下


    目錄結(jié)構(gòu)
  • 然后導(dǎo)入CKEditor的核心jar包厦取,我這兒也有
鏈接:http://pan.baidu.com/s/1b1wEq6 密碼:xd4n

Step 2:使用CKEditor

  • 在合適位置(一般是在head里)引用CKEditor的JS文件
//appPath是你得項(xiàng)目路徑赖淤,這個(gè)可以很容易獲得= =不行就用相對(duì)路徑試試
<script type="text/javascript" src="<%=appPath%>/ckeditor/ckeditor.js"></script>
  • 遵循官網(wǎng)推薦的原則,使用自帶的taglib
//在JSP頁(yè)面的Page標(biāo)簽后引入
<%@ taglib uri="http://ckeditor.com" prefix="ckeditor"%>
//一般是要有form包裹起來(lái)慎皱,因?yàn)楹竺孢€要提交到服務(wù)器的
<textarea name="editor" cols="100" id="editor" rows="10"></textarea>
<ckeditor:replace replace="editor" basePath="/ckeditor/" />//這里的replace后跟的是textarea的name值

這里用的是經(jīng)典的方法老虫,利用CKEditor替換掉textarea中的值。網(wǎng)上也有一些使用JS來(lái)替換的茫多,我也試了但并沒(méi)有成功祈匙,還是taglib比較給力。

  • 成功后頁(yè)面是這樣的天揖。
ckeditor長(zhǎng)這樣
  • 當(dāng)然你見(jiàn)到的這些東西都是可設(shè)置的夺欲,就在ckeditor文件夾下的config.js中,網(wǎng)上有太多的教程今膊,就不說(shuō)明了些阅。這里推薦一篇超詳細(xì)的配置

Step 3:重點(diǎn)來(lái)了,如何獲得CKEditor的內(nèi)容呢斑唬?

我嘗試了N遍市埋,試圖直接從被替換掉的textarea中獲取前臺(tái)輸入的內(nèi)容黎泣,然而并沒(méi)有成功,永遠(yuǎn)得到的都是null

  • 換個(gè)思路缤谎!在前臺(tái)使用一個(gè)什么來(lái)代替ckeditor框來(lái)上傳到后臺(tái)抒倚,賦值的事就交給JS來(lái)處理
          <div class="control-group">
              <input name="articleContent" id="content" type="hidden" />//中轉(zhuǎn)的input框
          </div>
      </form>
    //ckeditor框中內(nèi)容并沒(méi)有提交到后臺(tái)
      <div class="control-group">
                <label>內(nèi)容:</label><br />
                <textarea name="editor" cols="100" id="editor" rows="10"></textarea>
                <ckeditor:replace replace="editor" basePath="/ckeditor/" />
        </div>
  • 注意:我的textarea框在</form>后,并沒(méi)有提交到后臺(tái)坷澡,而是通過(guò)JS獲得textarea的值再賦給隱藏的input的value
  • JS賦值衡便,下面的代碼寫(xiě)在你提交事件的那個(gè)函數(shù)里,然后后臺(tái)就可以通過(guò)獲取articleContent的值來(lái)間接得到CKEditor中輸入的值了~
var value = CKEDITOR.instances.editor.getData();//固定格式洋访,沒(méi)什么毛病
$("#content").val(value);//這里用的JQuery,比較清爽= =

Step 4:該上傳圖片了

配置好CKEditor后谴餐,是可以直接從其他網(wǎng)站Copy文章(帶圖片)然后上傳的姻政,但是如果我的文章是原創(chuàng)怎么辦呢,那就不得不上傳圖片了岂嗓。嘗試過(guò)去給CKEditor配它的另一半CKfinder汁展,但沒(méi)有成功,上傳服務(wù)器那一下總是出錯(cuò)厌殉。此路不通食绿,只有繞行~

思路:利用Struts2的圖片上傳綁定到CKEditor

  • 首先,你得有上傳這個(gè)功能(默認(rèn)是沒(méi)有的9薄)器紧,找到WebContent\ckeditor\plugins\image\dialogs目錄下的image.js,搜索upload楼眷,將hidden改為false或0铲汪,這樣點(diǎn)擊圖像就能看到上傳功能了。
  • 然后罐柳,寫(xiě)一個(gè)Struts2上傳文件(圖片)的功能掌腰,擢這里參考人家寫(xiě)好的代碼,比較詳細(xì)但只取Action與Util類以及action配置就好张吉,其它的有些問(wèn)題齿梁,需要做些小修改。
  • 導(dǎo)入文章中的代碼后肮蛹,小修改下
//some code
//修改編碼為UTF-8勺择,其實(shí)這兒GBK也沒(méi)什么不可,我強(qiáng)迫癥蔗崎!
response.setCharacterEncoding("UTF-8"); 
//some code
//修改上傳路徑(物理路徑)酵幕,到Apache tomcat下面的webapps文件中的一個(gè)目錄(便于給URL),這樣重新部署時(shí)之前上傳的文件就不會(huì)被刪除
String uploadPath =  "C:\\AllProjects\\apache-tomcat\\webapps\\uploads\\"+DateUtil.getDirDate()+"\\";
//修改返回圖像URL到你剛剛指定的目錄
out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",'" + "http://localhost:8080/uploads/"+ DateUtil.getDirDate() +"/"+ fileName + "','')");    
  • 配置Struts的Action缓苛。
<action name="uploadfile" class="com.xxx.web.action.CkeditorUploadAction"></action>

這里要是運(yùn)行報(bào)錯(cuò)芳撒,可能就是action配置的namespace錯(cuò)了邓深,根據(jù)報(bào)錯(cuò)將action配置到指定的namespace就好

  • 最后,綁定CKEditor的上傳事件到剛剛的action笔刹,打開(kāi)CKEditor的config.js加入下面這一句
config.filebrowserUploadUrl = 'uploadfile';//這個(gè)uploadfile是你剛剛的Action的name

16.04.24更新

  • 之前的部分只能實(shí)現(xiàn)簡(jiǎn)單的圖片上傳芥备,需求不止于此。如果要上傳附件(即不止是圖片舌菜,可能是任何文件)萌壳,該怎么辦呢。這里需要對(duì)上傳Action進(jìn)行處理下日月,并且將Struts2的上傳文件大小限制調(diào)整到適合大小即可袱瓮。

step 1:對(duì)原來(lái)的上傳Action進(jìn)行處理

package com.xxx.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import util.DateUtil;
import com.opensymphony.xwork2.ActionSupport;
 
public class CkeditorUploadAction  extends ActionSupport{
    private File upload; 
    private String uploadContentType; 
    private String uploadFileName; 
 
    public File getUpload() { 
      return upload; 
    } 
 
    public void setUpload(File upload) { 
 
      this.upload = upload; 
    } 
 
    public String getUploadContentType() { 
      return uploadContentType; 
    } 
 
    public void setUploadContentType(String uploadContentType) { 
      this.uploadContentType = uploadContentType; 
    } 
 
    public String getUploadFileName() { 
      return uploadFileName; 
    } 
 
    public void setUploadFileName(String uploadFileName) { 
      this.uploadFileName = uploadFileName; 
    } 
 
    public String execute() throws Exception { 
 
      HttpServletResponse response = ServletActionContext.getResponse(); 
      response.setCharacterEncoding("UTF-8"); 
      PrintWriter out = response.getWriter(); 
 
      // CKEditor提交的很重要的一個(gè)參數(shù) 
      String callback = ServletActionContext.getRequest().getParameter("CKEditorFuncNum");    
 
      InputStream is = new FileInputStream(upload); 
//      String uploadPath = ServletActionContext.getServletContext().getRealPath("uploads/"+DateUtil.getDirDate());//這個(gè)目錄是在你的項(xiàng)目下
      String uploadPath =  "C:\\AllProjects\\apache-tomcat\\webapps\\uploads\\"+DateUtil.getDirDate()+"\\";//這里改成tomcat下的webapps下
      System.out.println("uploadpath:"+uploadPath);
      File dirfile=new File(uploadPath);
      if(!dirfile.exists()){
           dirfile.mkdirs();
          }
 
      System.out.println("filename:"+uploadFileName);//直接使用上傳文件的名字,沒(méi)有重新命名了= =偷懶爱咬,但也有好處
      File toFile = new File(uploadPath, uploadFileName);
 
      OutputStream os = new FileOutputStream(toFile);    
      byte[] buffer = new byte[1024];    
      int length = 0; 
      while ((length = is.read(buffer)) > 0) {    
        os.write(buffer, 0, length);    
      }    
      is.close(); 
      os.close(); 
 
      // 返回“圖像”選項(xiàng)卡并顯示圖片 
      out.println("<script type=\"text/javascript\">");   
      out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",'" + "http://localhost:8080/uploads/"+ DateUtil.getDirDate() +"/"+ uploadFileName + "','')");
      out.println("</script>"); 
      return null; 
    } 
}

Step 2:修改struts.properties

  • 在struts.properties將struts.multipart.maxSize改為適當(dāng)?shù)拇笮〕呓瑁J(rèn)為2M,一般不適用
struts.multipart.maxSize=52428800 <!-- 這里是50M精拟,單位是Byte燎斩,根據(jù)需要調(diào)整-> 

生命不息,折騰不止

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜂绎,一起剝皮案震驚了整個(gè)濱河市栅表,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌师枣,老刑警劉巖怪瓶,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坛吁,居然都是意外死亡劳殖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)拨脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哆姻,“玉大人,你說(shuō)我怎么就攤上這事玫膀∶В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵帖旨,是天一觀的道長(zhǎng)箕昭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)解阅,這世上最難降的妖魔是什么落竹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮货抄,結(jié)果婚禮上述召,老公的妹妹穿的比我還像新娘朱转。我一直安慰自己,他們只是感情好积暖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布藤为。 她就那樣靜靜地躺著,像睡著了一般夺刑。 火紅的嫁衣襯著肌膚如雪缅疟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天遍愿,我揣著相機(jī)與錄音存淫,去河邊找鬼。 笑死沼填,一個(gè)胖子當(dāng)著我的面吹牛纫雁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倾哺,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刽脖!你這毒婦竟也來(lái)了羞海?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤曲管,失蹤者是張志新(化名)和其女友劉穎却邓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體院水,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腊徙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檬某。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撬腾。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恢恼,靈堂內(nèi)的尸體忽然破棺而出民傻,到底是詐尸還是另有隱情,我是刑警寧澤场斑,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布漓踢,位于F島的核電站,受9級(jí)特大地震影響漏隐,放射性物質(zhì)發(fā)生泄漏喧半。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一青责、第九天 我趴在偏房一處隱蔽的房頂上張望挺据。 院中可真熱鬧取具,春花似錦、人聲如沸吴菠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)做葵。三九已至占哟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酿矢,已是汗流浹背榨乎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘫筐,地道東北人蜜暑。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像策肝,于是被迫代替她去往敵國(guó)和親肛捍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理之众,服務(wù)發(fā)現(xiàn)拙毫,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Struts2框架 Struts由來(lái) Struts最早是作為ApacheJakarta項(xiàng)目的組成部分棺禾,項(xiàng)目的創(chuàng)立者...
    whilewrongDebug閱讀 1,561評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法缀蹄,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法膘婶,繼承相關(guān)的語(yǔ)法缺前,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,581評(píng)論 18 399
  • 6月5日悬襟,“羅馬尼亞珍寶展”在四川博物院開(kāi)幕衅码。展覽由羅馬尼亞文化部、羅馬尼亞駐華大使館與中國(guó)國(guó)家文物局聯(lián)合主辦脊岳,羅...
    忘川卡隆閱讀 549評(píng)論 0 0
  • 導(dǎo)語(yǔ):減肥便秘不是病逸绎,解不出來(lái)真要命惹恃!為了解決這件減肥瘦身的尷尬事,多少人千方百計(jì)地“通便”棺牧、“排宿便”巫糙,沒(méi)想到減...
    瘦身寶典閱讀 546評(píng)論 0 4