springmvc和layui富文字編輯器實時上傳圖片功能實現
本文將介紹 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>
- <artifactId>commons-fileupload</artifactId>
- <version>1.2.2</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
json 依賴
- <dependency>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- <version>20170516</version>
- </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 檔案建立一個 編輯器和讓圖片按鈕能傳送資料
- <script>
- 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' //介面url
- ,type: 'post' //預設post
- }
- });
- //建立一個編輯器
- var editIndex = layedit.build('content',{
- height:400
- }
- );
- });
- </script>
注意:上傳圖片的程式碼必須放在 建立一個編輯器 前面
具體文件: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">
- <!--設定上傳最大尺寸為5MB-->
- <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 =request.getServletContext().getRealPath("/resource/uploads/");//target的目錄
- //本地使用
- 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);
- //完整的url
- String fileUrl = "/uploads/"+date.get(Calendar.YEAR)+ "/"+(date.get(Calendar.MONTH)+1)+ "/"+ newFileName;
- Map<String,Object> map = new HashMap<String,Object>();
- Map<String,Object> map2 = new HashMap<String,Object>();
- map.put("code",0);//0表示成功,1失敗
- map.put("msg","上傳成功");//提示訊息
- map.put("data",map2);
- map2.put("src",fileUrl);//圖片url
- 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">
- <!-- SingleSignOn valve, share authentication between web applications
- Documentation at: /docs/config/valve.html -->
- <!--
- <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
- -->
- <!-- Access log processes all example.
- Documentation at: /docs/config/valve.html
- Note: The pattern used is equivalent to using pattern="common" -->
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
- <!-- 增加的靜態資源對映配置 -->
- <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,大家可根據自己情況填寫