本文将介绍 springmvc 上传功能实现,以及layui 前端插件的使用,尤其是其富文本编辑器的上传图片接口的实现。
一、开发准备
1、layui 官网:http://www.layui.com/
点击"立即下载"可以获取前端框架,没有使用过的朋友可以自行了解下。
下载好后,引入其核心 js 和 css 文件,可以测试是否按照成功。
2、layui 富文本编辑器文档:http://www.layui.com/doc/modules/layedit.html
3、几个必备的 依赖jar,用于上传和 json 数据返回
上传必备依赖
- <dependency>
- <groupId>commons-fileuploadgroupId>
- <artifactId>commons-fileuploadartifactId>
- <version>1.2.2version>
- dependency>
- <dependency>
- <groupId>commons-iogroupId>
- <artifactId>commons-ioartifactId>
- <version>2.4version>
- dependency>
json 依赖
- <dependency>
- <groupId>org.jsongroupId>
- <artifactId>jsonartifactId>
- <version>20170516version>
- dependency>
二、layui 代码部署
1、layui 完整的文件

那几个 js 文件 ,只需要引入 layui.all.js 即可,之前要引入 jQuery库
2、引入 核心 css 和 js 文件
css
- <link rel="stylesheet" href="${pageContext.request.contextPath}/plugin/layer/css/layui.css">
js
- <script src="${pageContext.request.contextPath}/js/jquery.min.js">script>
- <script src="${pageContext.request.contextPath}/plugin/layer/layui.all.js">script>
- <script>
- //JavaScript代码区域
- layui.use('element', function(){
- var element = layui.element;
- });
- script>
3、实现一个编辑器
代码可以从 layui 官网导航上的 "文档"-->"表单"获取
地址:http://www.layui.com/demo/form.html
我们拷贝一段代码
- <form class="layui-form" method="post" id="myForm" enctype="multipart/form-data">
- <div class="layui-form-item layui-form-text">
- <label class="layui-form-label">内容label>
- <div class="layui-input-block">
- <textarea class="layui-textarea layui-hide" name="content" lay-verify="content" id="content">textarea>
- div>
- div>
- form>
注意:form表单的class需要加上 layui-form
textarea 标签的 name 和 id,要和下面一致
然后在 其后加上 js 文件创建一个 编辑器和让图片按钮能发送数据
- layui.use(['form', 'layedit', 'laydate'], function() {
- var form = layui.form
- , layer = layui.layer
- , layedit = layui.layedit
- , laydate = layui.laydate;
-
- layedit.set({
- uploadImage: {
- url: '${pageContext.request.contextPath}/uploadFile'
- ,type: 'post'
- }
- });
-
- var editIndex = layedit.build('content',{
- height:400
- }
- );
- });
注意:上传图片的代码必须放在 创建一个编辑器 前面
具体文档:http://www.layui.com/doc/modules/layedit.html
4、这个时候,应该可以看到一个 富文本编辑框了

这个编辑框的高度不知为什么设置无效,暂时不管了。
三、springmvc 实现上传功能
1、加入基本的 依赖
前面已经说了,上传需要两个 jar,另外我们需要返回 Json 数据,也需要一个 Json 的jar
2、spirngmvc.xml 配置文件上传
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
-
- <property name="maxUploadSizePerFile" value="5242880"/>
- <property name="defaultEncoding" value="UTF-8"/>
- <property name="resolveLazily" value="true"/>
- bean>
如果你发现,无法获得上传的文件,通常是没有添加此处代码
3、新建一个上传文件的控制器
- package com.liuyanzhao.blog.controller.common;
- import org.apache.ibatis.annotations.Param;
- import org.json.JSONObject;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.multipart.MultipartFile;
- import javax.servlet.http.HttpServletRequest;
- import java.io.File;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- @Controller
- public class UploadFileController {
-
- @ResponseBody
- @RequestMapping(value = "/uploadFile")
- public String uploadFile(HttpServletRequest request,@Param("file") MultipartFile file) throws IOException {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
- String res = sdf.format(new Date());
-
-
-
- String rootPath ="/Users/liuyanzhao/Documents/uploads/";
-
- String originalFilename = file.getOriginalFilename();
-
- String newFileName = res+originalFilename.substring(originalFilename.lastIndexOf("."));
-
- Calendar date = Calendar.getInstance();
- File dateDirs = new File(date.get(Calendar.YEAR)
- + File.separator + (date.get(Calendar.MONTH)+1));
-
- File newFile = new File(rootPath+File.separator+dateDirs+File.separator+newFileName);
-
- if(!newFile.getParentFile().exists()) {
-
- newFile.getParentFile().mkdirs();
- }
- System.out.println(newFile);
-
- file.transferTo(newFile);
-
- String fileUrl = "/uploads/"+date.get(Calendar.YEAR)+ "/"+(date.get(Calendar.MONTH)+1)+ "/"+ newFileName;
- Map map = new HashMap();
- Map map2 = new HashMap();
- map.put("code",0);
- map.put("msg","上传成功");
- map.put("data",map2);
- map2.put("src",fileUrl);
- map2.put("title",newFileName);
- String result = new JSONObject(map).toString();
- return result;
- }
- }
注意:
① 博主这里文件是上传到本地的 /Users/liuyanzhao/Documents/uploads/ 目录,大家自行修改。待会儿还要在 Tomcat 或者 IDE 里配置静态资源虚拟映射(即55行的路径,/uploads ),才能在浏览器里访问图片
② 图片上传,以 年/月/文件名 形式储存,其中文件名是按时间自动命名
③ 第 55 行的是图片的 url,/ 表示根目录,会自动加上 域名的,大家可根据自己情况修改
④ 第 59-66 行代码是生产 以 Map 方式 创建JSON,最终返回给 前台
这里的 JSON,layui 是有要求的,如图

创建 JSON 的方法很多,这里不介绍了,记得 JSON 区分大小写,不支持注释 即可
关于 JSON 的大家可以百度或者上慕课网找教程
⑤ 这个方法的路径映射是 /uploadFile 要和 我们上面配置的 接口 url 一致,否则无法上传
四、静态资源虚拟路径配置
这里介绍两种方法。
1、Tomcat 的server.xml 里配置
如果使用IDE如IntellJ IDEA运行Tomcat,无效。如果是部署到服务器上,可以使用
打开 Tomcat 安装目录 下的 conf/server.xml
在 Host 标签里添加一行 context 配置即可,如下
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
-
-
- <Context path="/uploads" docBase="/Users/liuyanzhao/Documents/uploads" reloadable="true" crossContext="true">Context>
- Host>
注意:
path 是服务器上的虚拟路径
docBase 是你的本地物理路径
比如,我在本地测试,项目地址(相当于域名)是 http://localhost:8090/Blog
我要访问 /Users/liuyanzhao/Documents/uploads/2017/9/hello.png 这张图片,在浏览器上只需要输入
http://localhost:8090/Blog/uploads/2017/9/hello.png 就能访问
2、在IDE 里配置
因为我们通常是用 IDE 来运行 Tomcat,似乎这时候 本地Tomcat 安装目录的 配置不生效,暂时不追究
具体方法如下,因为博主用的是 IntelliJ IDEA,这里介绍IDEA 如果配置静态资源映射
(1) 点击右上角的Tomcat 配置
(2)点击 Deployment,点击下面的 加号 ,添加一条映射

因为我的项目文件夹的映射是 /Blog ,所以这里前面也加了/Blog,大家可根据自己情况填写
五、效果如下

本文地址:https://liuyanzhao.com/6223.html