KindEditor 是一个比较老但依然在许多项目中使用的富文本编辑器,它的图片上传功能依赖于服务器端的处理,我们将分步完成整个流程:

- 准备工作:下载 KindEditor 并创建 Java Web 项目。
- 前端集成:在 JSP 页面中引入 KindEditor 并初始化。
- 后端实现:创建一个 Servlet 来接收和处理文件上传请求。
- 配置与测试:配置 Servlet 并测试上传功能。
第 1 步:准备工作
1 下载 KindEditor
访问 KindEditor 官网或 GitHub 下载最新版本,我们这里以 1.11 版本为例。
下载地址:https://github.com/kindsoft/kindeditor/releases
下载后,解压你会看到类似下面的目录结构:
kindeditor-4.1.11/
├── asp/ // ASP 示例
├── asp.net/ // ASP.NET 示例
├── php/ // PHP 示例
├── jsp/ // JSP 示例 (我们主要看这个)
├── examples/ // 演示页面
├── kindeditor-all.js // 核心 JS 文件
├── themes/ // 主题样式
├── lang/ // 语言包
└── ...
2 创建 Java Web 项目
在你的 IDE(如 Eclipse, IntelliJ IDEA)中创建一个 Dynamic Web Project。
3 添加 KindEditor 文件到项目
将 kindeditor-4.1.11 目录下的以下内容复制到你的 Web 项目的 WebContent 目录下:

kindeditor-all.jsthemes/lang/plugins/(包含图片上传等插件所需的文件)
你的项目结构可能看起来像这样:
KindEditorDemo/
├── src/
│ └── com/
│ └── example/
│ └── upload/
│ └── ImageUploadServlet.java
└── WebContent/
├── index.jsp
├── kindeditor-all.js
├── lang/
│ └── zh-CN.js
├── plugins/
│ └── ...
└── themes/
└── default/
└── default.css
4 添加上传所需的库
KindEditor 的 JSP 示例依赖两个 Apache Commons 库来处理文件上传,你需要将它们添加到项目的 WEB-INF/lib 目录下。
你可以从 Maven 中央仓库下载:
- commons-fileupload: https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
- commons-io: https://mvnrepository.com/artifact/commons-io/commons-io
如果你使用 Maven,在 pom.xml 中添加依赖:

<dependencies>
<!-- KindEditor 本身不需要,但它的JSP示例需要 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- Servlet API 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
第 2 步:前端集成 (JSP)
在 WebContent 目录下创建 index.jsp 文件,这个文件将包含一个 <textarea> 和用于初始化 KindEditor 的 JavaScript 代码。
WebContent/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">KindEditor Java 上传示例</title>
<script type="text/javascript" src="kindeditor-all.js"></script>
<script type="text/javascript" charset="utf-8" src="lang/zh-CN.js"></script>
<style>
.ke-container {
width: 800px;
}
</style>
</head>
<body>
<h1>KindEditor 图片上传演示</h1>
<form>
<textarea id="editor_id" name="content" style="width:800px;height:400px;">
<p>请在此输入内容,然后点击编辑器工具栏上的图片按钮上传图片。</p>
</textarea>
</form>
<script type="text/javascript">
KindEditor.ready(function(K) {
window.editor = K.create('#editor_id', {
// 指定上传图片的Servlet路径
// uploadJson: '/your-project-path/upload.do' // 这是官方示例的写法,但我们用Servlet
// 更推荐使用 fileManagerJson 来管理文件,但图片上传主要靠 uploadJson
// 注意:这里的路径必须和你在web.xml中配置的 <url-pattern> 一致
uploadJson : '/KindEditorDemo/upload/image',
// 允许上传的文件类型
allowImageUpload : true,
// 其他配置...
width : '800px',
height : '400px',
items : [
'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image', 'multiimage',
'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
'anchor', 'wordimage', 'map'
]
});
});
</script>
</body>
</html>
关键点说明:
uploadJson: '/KindEditorDemo/upload/image':这是最重要的配置,它告诉 KindEditor,当用户点击“上传图片”按钮时,应该向哪个 URL 发送文件。/KindEditorDemo是你的项目上下文路径,/upload/image是我们接下来要配置的 Servlet 的访问路径。
第 3 步:后端实现 (Servlet)
这是处理文件上传的核心部分,我们将创建一个 Servlet,它会接收来自 KindEditor 的文件,保存到服务器的指定目录,并返回一个 JSON 响应。
1 创建上传目录
在 WebContent 目录下创建一个 attached 文件夹,用于存放上传的图片。
WebContent/
└── attached/ // 用于存放上传的图片
└── image/ // 在 attached 下再建一个 image 文件夹,结构更清晰
2 编写 Servlet 代码
src/com/example/upload/ImageUploadServlet.java
package com.example.upload;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/upload/image") // 确保这里的注解路径和JSP中配置的uploadJson路径一致
public class ImageUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 上传文件存储目录
private static final String UPLOAD_DIR = "attached/image/";
// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 5; // 5MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 10; // 10MB
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 检查是否为 multipart/form-data 请求
if (!ServletFileUpload.isMultipartContent(request)) {
// 