springboot 使用kindeditor 頁面跨域 圖片上傳 圖片獲取 前后分離


今天使用springboot 集成 kindeditor 本來以為挺簡單 結果搞了我一天 才弄好。主要是圖片上傳的問題。吐槽一下 網上好多介紹說的都不完善 搞死我了。我這一篇絕對是完善的(相對比較完善。。)

1.kindeditor 下載地址:http://kindeditor.net/down.php 直接下載

  下載后解壓 目錄如下圖 里面有asp jsp php的例子。jsp已經過時了,所以想直接用html來集成【下圖中的index.html Jquery,redirect.html是我后來加上去的】

2.springboot

  最簡單就是:start.spring.io直接生成一個簡單的springboot

3.廢話不多說 開始集成

 3.1:首先創建一個html 我這里是index.html  index.html里的內容是 jsp->demo.jsp里的內容 刪掉jsp特有的東西 

  附加kindeditor非常簡單 代碼如下

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="kindeditor-all-min.js"></script>
        <script src="lang/zh-CN.js"></script>
        <script src="jquery-3.1.0.min.js"></script>
        
        <title></title>
    </head>
    <body>
        <textarea id="txtEditor" name="content1" style="height: 300px;width: 100%;"></textarea>
        <button type="button" onclick="upload();">上傳</button>
    </body>
    <script>
        var callback = "redirect.html";
        var editor1;
        var editor = KindEditor.ready(function(K) {
             editor1 = K.create('textarea[name="content1"]', {
                cssPath : '../plugins/code/prettify.css',
                uploadJson : 'http://127.0.0.1:8081/upload/upmethod?callBackPath='+callback,
                fileManagerJson : '../jsp/file_manager_json.jsp',
                allowFileManager : true,
                afterCreate : function() {
                    var self = this;
                    K.ctrl(document, 13, function() {
                        self.sync();
                        document.forms['example'].submit();
                    });
                    K.ctrl(self.edit.doc, 13, function() {
                        self.sync();
                        document.forms['example'].submit();
                    });
                }
            });
        });
        
    </script>
    <script src="upload.js"></script>
</html>

 

這樣我們就可以打開index看看效果了 如下圖

 

上傳圖片:這里用html上傳圖片

首先創建redirect.html  我是直接放在項目目錄下 和index.html同級 redirect.html的內容如下:

 redirect.html 的作用是解決frame域的問題 這個問題搞了我很長時間。kindeditor是用frame 

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>ie </title>
    <script type="text/javascript">
    function getParameter(val) {
        var uri = decodeURI(window.location.search);
        var re = new RegExp("" + val + "=([^&?]*)", "ig");
        return ((uri.match(re)) ? (uri.match(re)[0].substr(val.length + 1)) : null);
    }

        var upload_callback = function() {
            var error = getParameter("error");
            error = parseInt(error)
            var dataObject;
            if(error==0){
                var url = getParameter("url");
                dataObject = {"error": error, "url": url};
            }else{
                var message = getParameter("message");
                dataObject = {"error": error, "message": message};
            }
            var data =  JSON.stringify(dataObject)
            document.getElementsByTagName("body")[0].innerHTML = '<pre>' + data + '</pre>';
        }
    </script>
</head>
<body onload="upload_callback();">
</body>
</html>

 

 

后台項目結構如下 首先需要先把kindeditor的jar包附加到springboot項目中

 

主Application的內容就是原來的內容不變

主要是imgUploadController 圖片上傳類 內容如下

package com.example.upload.up;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("/upload")
public class imgUploadController {
    
    @RequestMapping("/subContent")
    public void getTextAreaContent(@RequestParam String context1) {
        String contentx = context1;
        System.out.println(contentx);
    }
    
    @ResponseBody
    @RequestMapping("/upmethod")
    public void uploadMethod(@RequestParam String callBackPath,@RequestParam(value="imgFile",required=false)MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws FileUploadException, IOException {
         response.setContentType("text/html;charset=UTF-8");
        String savePath = "D://imgSavePath/";
        String saveUrl = request.getContextPath() + "/imgSavePath/";
        //定義允許上傳的文件擴展名
        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 = 100000000;

        response.setContentType("text/html; charset=UTF-8");

        if(!ServletFileUpload.isMultipartContent(request)){
            System.out.println("請選擇文件。");
            response.sendRedirect(getError("請選擇文件.",callBackPath));
            return;
        }
        //檢查目錄
        File uploadDir = new File(savePath);
        if(!uploadDir.isDirectory()){
            System.out.println("上傳目錄不存在。");
            response.sendRedirect(getError("上傳目錄不存在。",callBackPath));
            return;
        }
        //檢查目錄寫權限
        if(!uploadDir.canWrite()){
            System.out.println("上傳目錄沒有寫權限。");
            response.sendRedirect(getError("上傳目錄沒有寫權限。",callBackPath));
            return;
        }

        String dirName = request.getParameter("dir");
        if (dirName == null) {
            dirName = "image";
        }
        if(!extMap.containsKey(dirName)){
            System.out.println("目錄名不正確。");
            response.sendRedirect(getError("目錄名不正確。",callBackPath));
            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();
        }

            String fileName = file.getOriginalFilename();
            long fileSize = file.getSize();
//            if (!item.isFormField()) {
                //檢查文件大小
                if(file.getSize() > maxSize){
                    System.out.println("上傳文件大小超過限制。");
                    response.sendRedirect(getError("上傳文件大小超過限制。",callBackPath));
                    return;
                }
                //檢查擴展名
                String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
                if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
                    System.out.println("上傳文件擴展名是不允許的擴展名。\n只允許" + extMap.get(dirName) + "格式。");
                    response.sendRedirect(getError("上傳文件擴展名是不允許的擴展名。\n只允許" + extMap.get(dirName) + "格式。",callBackPath));
                    return;
                }

                SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
                try{
                    File uploadedFile = new File(savePath, newFileName);
                    OutputStream os = new FileOutputStream(uploadedFile);
                    InputStream inputStream = file.getInputStream();
                    byte[] buf = new byte[1024];
                    int length = 0;
                    while((length = inputStream.read(buf))!=-1)
                    {
                        os.write(buf,0,length);
                    }
                    inputStream.close();
                    os.close();
                }catch(Exception e){
                    System.out.println("上傳文件失敗。");
                    response.sendRedirect(getError("上傳文件失敗。",callBackPath));
                    return;
                }

                Map<String, Object> msgMap = new HashMap<String, Object>();
                msgMap.put("error", 0);
                msgMap.put("url", "");
                String urlString = "";
                //根據自己實際情況做修改
                urlString = "http://127.0.0.1:8020/kindeditor-4.1.11-zh-CN/kindeditor/"+callBackPath+"?error=0&url="+"http://127.0.0.1:8081/OTA/"+ymd+"/"+newFileName;
                response.sendRedirect(urlString);
            }
        
        private String getError(String message,String callBackPath) throws UnsupportedEncodingException {
            Map<String, Object> msg = new HashMap<String, Object>();
            msg.put("error", 1);
            msg.put("message", message);
            
            String urlString = "http://127.0.0.1:8020/kindeditor-4.1.11-zh-CN/kindeditor/"+callBackPath+"?error=1&message="+URLEncoder.encode(message, "UTF-8");
            return urlString;
        }
        
        
}

 

 

內容寫的不太完善 這不重要 重要的是后面的一段代碼

我們返回內容重定向到redirect.html 並且返回數據:error 和 url 我這里在static目錄下放了一張圖片1.png

urlString = "http://127.0.0.1:8020/kindeditor-4.1.11-zh-CN/kindeditor/"+callBackPath+"?error=0&url="+"http://127.0.0.1:8081/static/1.png";
response.sendRedirect(urlString);

 說到圖片地址的url這里需要配置一下 我是用的一個配置類 ImgPathConf.java 位置放的不太規范 不過這不重要。。

 ImgPathConf.java內容如下 是配置訪問圖片資源的 這里定義了訪問項目目錄下 和 不在項目目錄下的兩種方法

package com.example.upload.up;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SuppressWarnings("deprecation")
@Configuration
public class ImgPathConf extends WebMvcConfigurerAdapter{
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //和頁面有關的靜態目錄都放在項目的static目錄下
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //上傳的圖片在D盤下的OTA目錄下,訪問路徑如:http://localhost:8081/OTA/1.jpg
        //其中OTA表示訪問的前綴。"file:D:/OTA/"是文件真實的存儲路徑
        registry.addResourceHandler("/OTA/**").addResourceLocations("file:D:/OTA/");
    }
}

到這里 我們的項目已經可以跑起來了

效果如下 這里用到了Hbuilder 跑html還是挺方便的。

查看這個源碼

 

 可以看到圖片是一個url地址 我們獲取到textarea的內容 保存到數據庫就OK了。

附加一個ajax提交內容的js 我的是upload.js

function upload(){
    editor1.sync(); //將編輯器的內容設置到原來的textarea控件里。
    var content=editor1.html();
    url = "http://127.0.0.1:8081/upload/subContent";
    $.post(
        url,
        {
            context1:content,
        },
        function(retData) {
        });
}

至此一個完整的圖片上傳,內容提交就完成了 后台獲取的內容打印如下 保存到數據庫就OK了

 


免責聲明!

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



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