1. 程式人生 > >ueditor+requirejs+springMVC+七牛(富文字編輯器圖片上傳到指定伺服器)

ueditor+requirejs+springMVC+七牛(富文字編輯器圖片上傳到指定伺服器)

為了能較少引用js,提高頁面載入速度,requirejs逐漸流行起來。本文是requirejs和當下主流外掛結合的使用總結。

其中:富文字編輯器是百度的UEditor,MVC框架是java開發最流行的SpringMVC,伺服器是小使用者使用較多的七牛雲(跟阿里雲等沒法比,但是很經濟實惠才是硬道理大笑),不多說,寫下自己能使用的解決方案,以備將來之用,也給別人送支玫瑰。

一、requirejs配置檔案引入ueditor:

// 配置依賴
require.config({
    baseUrl: '/lib',
    paths: {
        'ueditor': 'ueditor/ueditor.all.min',
        'ueditor.config': 'ueditor/ueditor.config',
        'ZeroClipboard' : 'ueditor/third-party/zeroclipboard/ZeroClipboard'
    },
    shim: {
        'ueditor': {  deps: ['ueditor.config'] }
    }
});
// 主函式
require([ 'ZeroClipboard',  'ueditor'], function (ZeroClipboard) {
     // 初始化ZeroClipboard,此處一定要有,不然會報錯
     window['ZeroClipboard'] = ZeroClipboard;
	……
});

二、ueditor.config.js配置


其中的window.UEDITOR_HOME_URL必須有,配置為相對路徑即可。

imageUrl配置為自己的後臺處理介面。

三、後臺介面程式碼:

    private final static String[] imageAllowFiles = { ".jpg",".jpeg",".png" };

   /**
     * UEditor上傳配置
     *
     * @return
     */
    @RequestMapping("/ueditor/config")
    @ResponseBody
    public Map<String, Object> upload(String action,
                                      @RequestParam(required = false, value = "image") CommonsMultipartFile image) throws IOException {
        long imageMaxSize = 2048000L; //上傳大小限制,單位B
        Map<String, Object> resultMap = new HashMap<>();

        // ueditor請求後臺配置時的相應函式
        if (StringUtils.isNotBlank(action) && action.equals("config")) {

            resultMap.put("imageActionName", "uploadimage"); // 上傳圖片的action

            // 這個配置是ueditor上傳檔案的name屬性
            resultMap.put("imageFieldName", "image");
            resultMap.put("imageMaxSize", imageMaxSize);
            resultMap.put("imageAllowFiles", imageAllowFiles);//必須指定,不然多圖片上傳時,會提示”檔案格式不允許”
            resultMap.put("imageUrlPrefix", "");
            resultMap.put("state", "SUCCESS");
        } else {
            if (null == image) {
                resultMap.put("state", "上傳失敗,上傳的圖片為空");
            } else {
                String imgName = image.getOriginalFilename();
                String type = imgName.lastIndexOf(".") == -1 ? "" : imgName.substring(imgName.lastIndexOf("."));
                resultMap.put("original", image.getOriginalFilename());
                resultMap.put("type", type);
                if (!checkImageType(imgName)) {
                    resultMap.put("state", "上傳失敗,目前支援" + Arrays.toString(imageAllowFiles) + "型別的圖片");
                } else {
                    long size = image.getSize();
                    resultMap.put("size", size);
                    if (size > imageMaxSize) {
                        resultMap.put("state", "上傳失敗,檔案大小不能超過[" + (imageMaxSize / 1024 / 1024) + "]M");
                    } else {
                        resultMap.putAll(qiniuUtil.upLoadByte(image.getBytes(),type.toLowerCase()));
                        resultMap.put("state", "SUCCESS");
                    }
                }
            }
        }
        return resultMap;
    }

    /**
     * 判斷檔名稱是否是允許的檔案型別
     *
     * @param fileName
     * @return
     */
    private boolean checkImageType(String fileName) {
        if (StringUtils.isBlank(fileName)) {
            return false;
        }
        int i = fileName.lastIndexOf(".");
        if (i == -1) {
            return false;
        }
        String type = fileName.substring(i);

        for (String ext : imageAllowFiles) {
            if (ext.equalsIgnoreCase(type)) {
                return true;
            }
        }
        return false;
    }

四、Ueditor選擇圖片彈出選擇框過慢

這個是因為沒有指定可接受圖片型別,將所引用的ueditor.all.js(或ueditor.all.min.js,看引用的是哪一個)中的接受型別由”image/*”改為自己需要的型別,以下是我修改後的。


五、備註

1:程式碼中涉及的util需要自己定義;

2:本文是將圖片直接上傳到七牛雲,所以需要自己拼接返回前端的引數。

3:前端需要引數如下:

"state"=> "", //上傳狀態,上傳成功時必須返回"SUCCESS"

"url"=> "", //返回的地址

"title"=> "", //新檔名

"original"=> "", //原始檔名

"type"=> "" //檔案型別

"size"=> "", //檔案大小

4:七牛上傳程式碼如下,其中返回了前端需要的url和title。

public Map<String,Object> upLoadByte(byte[] data, String type){
		Map<String, Object> res = new HashMap<>();
		String key = getKey()+type;
		Configuration cfg = new Configuration(Zone.autoZone());
		UploadManager uploadManager=new UploadManager(cfg);
		try {
			Response response= uploadManager.put(data, key, getUpToken());
			if (response.isOK()){
				res.put("url",domain+"/"+key);
				res.put("title",key);
			}
		} catch (QiniuException e) {
			Response r = e.response;
			System.err.println(r.toString());
		}
		return res;
	}

5:切記(提醒自己和七牛使用者)

七牛7.2.2以上java-sdk版本才有

Configurationcfg = new Configuration(Zone.autoZone());

         UploadManageruploadManager=new UploadManager(cfg);

低版本沒有Configuration,不可用。如果直接使用無參構造定義UploadManager uploadManager=new UploadManager();會出現初始化錯誤。