CKEDITOR最新版不能上傳圖片的解決


文獻:http://bbs.csdn.net/topics/390883077

代碼例子:http://download.csdn.net/download/itmyhome/7851265

1.原先

2.修改

<script type="text/javascript">
    window.onload = function(){
        var zy = null;//摘要
        zy = CKEDITOR.replace('zy',{
        language : 'zh-cn',
        filebrowserImageUploadUrl : '圖片上傳的servlet',   注意此處由於瀏覽器內核不同,路徑有些許不同。
        image_previewText : ' 預覽內容,此處設為空',
        });
        
    }
</script>

<textarea value="" name="zy" rows="8" class="form-control"></textarea>

3.修改后的樣子

4、實踐

js

<script type="text/javascript">
    window.onload = function(){
        var xwnr = null;//摘要
        xwnr = CKEDITOR.replace('xwnr',{
        language : 'zh-cn',
        filebrowserImageUploadUrl : 'login/newsphoto.do',
        image_previewText : '',
        });
    }
</script>

servlet

  1 public class NewsPhotoServlet extends HttpServlet {
  2 
  3     
  4     public void doPost(HttpServletRequest request, HttpServletResponse response)
  5             throws ServletException, IOException {
  6         
  7         response.setContentType("text/html");
  8         response.setCharacterEncoding("UTF-8");
  9         request.setCharacterEncoding("UTF-8");
 10         PrintWriter pout = response.getWriter();
 11         // CKEditor提交的很重要的一個參數
 12         String callback = request.getParameter("CKEditorFuncNum");
 13         //得到上傳文件的保存目錄,將上傳的文件存放於目錄下,
 14         String savePath = this.getServletContext().getRealPath("/files");
 15         //上傳時生成的臨時文件保存目錄
 16         String tempPath = this.getServletContext().getRealPath("/files/temp");
 17         File tmpFile = new File(tempPath);
 18         if(!tmpFile.exists()){
 19             //如果臨時目錄不存在,創建臨時目錄
 20             tmpFile.mkdir();
 21         }
 22         //圖片名稱
 23         String photoname = "";
 24         try {
 25             //使用Apache文件上傳組件處理文件上傳步驟:
 26             //1、創建一個DiskFileItemFactory工廠
 27             DiskFileItemFactory factory = new DiskFileItemFactory();
 28             //設置工廠的緩沖區的大小,當上傳的文件大小超過緩沖區的大小時,就會生成一個臨時文件存放到指定的臨時目錄當中。
 29             //設置緩沖區的大小為100KB,如果不指定,那么緩沖區的大小默認是10KB
 30             factory.setSizeThreshold(1024*100);
 31             //設置上傳時生成的臨時文件的保存目錄
 32             factory.setRepository(tmpFile);
 33             //2、創建一個文件上傳解析器
 34             ServletFileUpload upload = new ServletFileUpload(factory);
 35             //監聽文件上傳進度
 36             upload.setProgressListener(new ProgressListener(){
 37 
 38                 public void update(long pBytesRead, long pContentLength, int arg2) {
 39                     System.out.println("文件大小為:" + pContentLength + ",當前已處理:" + pBytesRead);
 40                 }
 41             });
 42             //解決上傳文件名的中文亂碼
 43             upload.setHeaderEncoding("UTF-8"); 
 44             //3、判斷提交上來的數據是否是上傳表單的數據
 45             if(!ServletFileUpload.isMultipartContent(request)){
 46                 //按照傳統方式獲取數據
 47                 return;
 48             }
 49             //設置上傳單個文件的大小的最大值,目前是設置為1024*1024字節,也就是1MB
 50             upload.setFileSizeMax(1024*1024);
 51             //設置上傳文件總量的最大值,最大值=同時上傳的多個文件的大小的最大值的和,目前設置為10MB
 52             upload.setSizeMax(1024*1024*10);
 53             //4、使用ServletFileUpload解析器解析上傳數據,
 54             //解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項
 55             List<FileItem> list = upload.parseRequest(request);
 56             for(FileItem item : list){
 57                 //如果fileitem中封裝的是普通輸入項的數據
 58                 if(item.isFormField()){
 59                     String name = item.getFieldName();
 60                     //解決普通輸入項的數據的中文亂碼問題
 61                     String value = item.getString("UTF-8");
 62                     System.out.println(name + "=" + value);
 63                 }else{
 64                     //如果fileitem中封裝的是上傳文件
 65                     //得到上傳的文件名稱,
 66                     String filename = item.getName();
 67                     System.out.println("filename:"+filename);
 68                     if(filename==null || filename.trim().equals("")){
 69                         continue;
 70                     }
 71                     //注意:不同的瀏覽器提交的文件名是不一樣的,
 72                     //有些瀏覽器提交上來的文件名是帶有路徑的,如:  c:\a\b\1.txt,
 73                     //而有些只是單純的文件名,如:1.txt
 74                     //處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分
 75                     filename = filename.substring(filename.lastIndexOf("\\")+1);
 76                     //得到上傳文件的擴展名
 77                     String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
 78                     //如果需要限制上傳的文件類型,那么可以通過文件的擴展名來判斷上傳的文件類型是否合法
 79                     System.out.println("上傳的文件的擴展名是:"+fileExtName);
 80                     //獲取item中的上傳文件的輸入流
 81                     InputStream in = item.getInputStream();
 82                     //得到文件保存的名稱
 83                     String saveFilename = makeFileName(filename);
 84                     if(saveFilename != null){
 85                         photoname = saveFilename;
 86                     }
 87                     //得到文件的保存目錄
 88                     String realSavePath = makePath(saveFilename, savePath);
 89                     System.out.println("realSavePath:"+realSavePath);
 90                     //創建一個文件輸出流
 91                     FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
 92                     //創建一個緩沖區
 93                     byte buffer[] = new byte[1024];
 94                     //判斷輸入流中的數據是否已經讀完的標識
 95                     int len = 0;
 96                     //循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據
 97                     while((len=in.read(buffer))>0){
 98                         //使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + "\\" + filename)當中
 99                         out.write(buffer, 0, len);
100                     }
101                     //關閉輸入流
102                     in.close();
103                     //關閉輸出流
104                     out.close();
105                     //刪除處理文件上傳時生成的臨時文件
106                     item.delete();
107                 }
108             }
109         } catch (FileUploadBase.FileSizeLimitExceededException e) {
110             e.printStackTrace();
111             return;
112             }catch (FileUploadBase.SizeLimitExceededException e) {
113             e.printStackTrace();
114             return;
115             }catch (Exception e) {
116             e.printStackTrace();
117             }
118             // 返回"圖像"選項卡並顯示圖片  request.getContextPath()為web項目名 
119             pout.println("<script type=\"text/javascript\">");
120             pout.println("window.parent.CKEDITOR.tools.callFunction(" + callback
121                     + ",'" + request.getContextPath() + "/files/photo/" + photoname + "','')");
122             pout.println("</script>");
123             System.out.println("ok1!");
124         
125     }
126     
127     //構造存儲文件名
128     private String makeFileName(String filename){  //2.jpg
129         //為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名
130         return UUID.randomUUID().toString() + "_" + filename;
131     }
132     
133     //構造存儲路徑
134     private String makePath(String filename,String savePath){
135         
136         String dir1 = "photo";
137         //構造新的保存目錄
138         String dir = savePath +"\\"+dir1;    //目錄:upload\photo
139         //File既可以代表文件也可以代表目錄
140         File file = new File(dir);
141         //如果目錄不存在
142         if(!file.exists()){
143             //創建目錄
144             file.mkdirs();
145         }
146         return dir;
147     }

 注意:如果這個頁面加了x-frame-options:deny,則此插件上傳圖片會出錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM