文獻: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,則此插件上傳圖片會出錯。