kindeditor在Java項目中的應用以及圖片上傳配置


在官網下載Kindededitor的開發包
 
在項目中javaweb項目中導入kindeditor必須要使用的Jar包(用於文件上傳,除非你的富文本編輯器不使用圖片上傳)jar包可以在官網的開發包中找到,注意下面圖jar包的位置
 
 
將官網開發包中的此jsp文件放在你的項目中,其實富文本編輯器在執行文件上傳的時候就是請求的是這個upload_json.jsp文件,這個upload_json.jsp文件起始就相當與一個用於文件上傳的Servlet
 
 
將kindeditor富文本編輯器需要使用到的css,js文件加入項目中,在這里最常用使用的是默認的css文件,全局的js文件,中文的js文件,如下圖所示
 
 

 

現在我們已經將kindeditor所需要的所有東西都加入項目中了,想在讓我們來編輯一個展示頁面來看卡看你kindetidor是什么效果,展示頁面的html代碼我粘貼在下面,方便各位看官觀看
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>this is test kindetior</title>

    <link href="http://localhost:8080/test/kindeditor-4.1.10/themes/default/default.css"
          type="text/css" rel="stylesheet">
    <script type="text/javascript" charset="utf-8"
            src="http://localhost:8080/test/kindeditor-4.1.10/kindeditor-all-min.js"></script>
    <script type="text/javascript" charset="utf-8"
            src="http://localhost:8080/test/kindeditor-4.1.10/lang/zh_CN.js"></script>
</head>

<body>


<form method="post" action="http://localhost:8080/test/kindservlet">
              <textarea id="editor_id" name="content"
                        style="width: 700px; height: 300px;">
        請輸入......
        </textarea>
    <input type="submit" value="提交" onclick="submitForm()">
</form>

<script>
    KindEditor.ready(function (K) {
        window.editor = K.create('#editor_id', {
//這里是指定的文件上傳input的的屬性名
            filePostName: "uploadFile",
//這里就是指定文件上傳的請求地址,上面也已經說了,upload_json.jsp就相當去一個servlet去進行保存文件,這個地方很重要
            uploadJson: 'upload_json.jsp',
            resizeType: 1,
            allowPreviewEmoticons: true,
            allowImageUpload: true,
        });
    })
</script>

</body>

 

效果如下
 
 
在這里我要提一下,這個富文本編輯器其實就是一個表單,表單的請求地址就是上面展示的html中的http://localhost:8080/test/kindservlet,這個servlet是自己寫的用於保存<textarea id="editor_id" name="content" style="width: 700px; height: 300px;"> 屬性名為content的值,當前這個Servlet接受過來的都是字符,你可能會有疑問?我要在富文本中上傳圖片或者圖片上傳到哪里了呢?在這里我要說一下,很多新接觸的伙伴們可能會有些陌生,其實當我們在進行上傳圖片的時候,已經請求了upload_json.jsp這個jsp文件,這個jsp的功能是和保存文件的servlet的功能是一樣的,所以上傳的文件按是在這個upload_json.jsp文件中已經保存了,並且這個upload_json.jsp文件會在保存了文件后響應一個路徑地址,也就是文件保存的地址,相應的地址會插入到content文本域中,格式是<img src="http://xxxx.com/xxx/xxx.jsp">,插入數據庫的就是<img src="http://xxxx.com/xxx/xxx.jsp">就是這個img標簽,所以在查數據庫的時候圖片就顯示出來了,具體的文件上傳文件邏輯官方來寫在upload_json.jsp文件中的。
 
現在我們來進行上傳一張圖片試一下,看看能不能上傳
 
 

 

 
 

 

很遺憾,並沒有上傳成功,現在提示上傳的目錄不存在,如果沒有錯的話應該是upload_json.jsp這個文件中的問題,現在我們來看一下upload_json.jsp里面是怎么寫的
可以看到圖片上傳的時候默認是將圖片文件上傳到項目的attached目錄下,現在我們項目中沒有這個文件夾,現在讓我們在項目的編譯的目錄下創建一個名為attached的文件夾,注意是項目的編譯目錄
 
現在我們再來試一下能否上傳圖片
 
編譯目

 

錄的attached文件夾里面也有了這張圖片
可以看到圖片已經上傳成功了,並且upload_json.jsp又把上傳成功的圖片地址給回傳了回來,點擊富文本的左上角可以看到到真正表單需要提交的東東。。
 
其實表單再上傳的時候就是上傳的這些內容哈,所以從數據庫取出來這些文本的時候就能夠直接顯示了哈,是不是很簡單。
 
現在我們來分析一下這個upload_json.jsp文件的一點核心的東西,其實在上傳圖片到upload_json.jsp的時候,kindetidor富文本也不知道上傳成功不成功,也不知道該如何提示用戶是否上傳成功,那么它是怎么知道是否是上傳成功的呢?來看一段upload_json.jsp中的源碼
可以看到在upload_json.jsp保存成功文件的時候會返回一個JSONObject對象,對象中放了兩個map,一個是error,一個url,可以看到在上傳成功的時候就返回個Map,一個是error值為0代表已經上傳成功,一個是url代表的是上傳成功后的圖片的地址用於在富文本中回顯圖片。
 
可以看到當圖片保存失敗或者有錯誤的時候返回的也是一個經過toString的Object對象,這個對象中同樣有個Map一個是error值為1代表上傳失敗,一個是message代表着錯誤原因,也就是為什么會失敗。
后面我們可以重寫這個upload_json.jsp文件,應為官方在代碼里面寫了不太安全,還請各位看官自己從新寫一下,大概也就是吧upload_json中的文件上傳代碼copy到一個Servlet上,再改一下展示頁面的文件上傳請求地址,就ok了.
 
 

 下面就是我將upload_json.jsp中的文件上傳代碼copy到一個servlet中,各位看官可以參考一下修改,在下沒做什么修改。

package kindeditor;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.json.simple.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author:jimisun
 * @Description:
 * @Date:Created in 16:26 2018/8/2
 * @Modified By:
 */
@WebServlet("/kindeditor/upload")
public class KindEditorUpload extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設置Response響應的編碼
        resp.setContentType("text/html; charset=UTF-8");


        //獲取一個Response的Write對象
        PrintWriter writer = resp.getWriter();


        //文件保存目錄路徑
        String savePath = req.getServletContext().getRealPath("/") + "attached/";
        System.out.println(savePath);

        //文件保存目錄URL
        String saveUrl = req.getContextPath() + "/attached/";
        System.out.print(saveUrl);

        //定義允許上傳的文件擴展名
        HashMap<String, String> extMap = new HashMap<String, String>();
        extMap.put("image", "gif,jpg,jpeg,png,bmp");
        extMap.put("flash", "swf,flv");
        extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
        extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");


        //最大文件大小
        long maxSize = 1000000;


        //判斷是否是一個文件
        if (!ServletFileUpload.isMultipartContent(req)) {
            writer.println(getError("請選擇文件。"));
            return;
        }
        //檢查目錄
        File uploadDir = new File(savePath);
        if (!uploadDir.isDirectory()) {
            writer.println(getError("上傳目錄不存在。"));
            return;
        }
        //檢查目錄寫權限
        if (!uploadDir.canWrite()) {
            writer.println(getError("上傳目錄沒有寫權限。"));
            return;
        }

        String dirName = req.getParameter("dir");
        if (dirName == null) {
            dirName = "image";
        }
        if (!extMap.containsKey(dirName)) {
            writer.println(getError("目錄名不正確。"));
            return;
        }


        //創建文件夾
        savePath += dirName + "/";
        saveUrl += dirName + "/";
        File saveDirFile = new File(savePath);
        if (!saveDirFile.exists()) {
            saveDirFile.mkdirs();
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String ymd = sdf.format(new Date());
        savePath += ymd + "/";
        saveUrl += ymd + "/";
        File dirFile = new File(savePath);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }

        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");
        List items = null;
        try {
            items = upload.parseRequest(req);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        Iterator itr = items.iterator();
        while (itr.hasNext()) {
            FileItem item = (FileItem) itr.next();
            String fileName = item.getName();
            long fileSize = item.getSize();
            if (!item.isFormField()) {
                //檢查文件大小
                if (item.getSize() > maxSize) {
                    writer.println(getError("上傳文件大小超過限制。"));
                    return;
                }
                //檢查擴展名
                String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
                if (!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)) {
                    writer.println(getError("上傳文件擴展名是不允許的擴展名。\n只允許" + extMap.get(dirName) + "格式。"));
                    return;
                }

                SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
                try {
                    File uploadedFile = new File(savePath, newFileName);
                    item.write(uploadedFile);
                } catch (Exception e) {
                    writer.println(getError("上傳文件失敗。"));
                    return;
                }

                JSONObject obj = new JSONObject();
                obj.put("error", 0);
                obj.put("url", saveUrl + newFileName);
                writer.println(obj.toJSONString());
            }
        }


        //將writer對象中的內容輸出
        writer.flush();
        //關閉writer對象
        writer.close();
    }


    //一個私有的方法,用於響應錯誤信息
    private String getError(String message) {
        JSONObject obj = new JSONObject();
        obj.put("error", 1);
        obj.put("message", message);
        return obj.toJSONString();
    }


}
View Code

好啦到這里了該下班了,寫了一下午,真累。。。。


免責聲明!

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



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