1. 程式人生 > >Ueditor實現自定義conttoller請求或跨域請求

Ueditor實現自定義conttoller請求或跨域請求

UEditor 是由百度「FEX前端研發團隊」開發的所見即所得富文字web編輯器,具有輕量,可定製,注重使用者體驗等特點,開源基於MIT協議,允許自由使用和修改程式碼。我們在做網站文字編輯的時候會經常用到它。但是ueditor預設支援儲存圖片在網站的根目錄下面。但是,對於網站來說,我們大多數的時候都要把靜態資源儲存到另外的伺服器上,與應用伺服器分開,以增加網站的效能

下面介紹一下這個方法:

一,

ueditor 1.4.2+ 推薦使用唯一的請求地址,通過GET引數action指定不同請求型別。 但很多使用者都希望使用自己寫好的上傳地址,下面提供一種解決方法: 由於所有ueditor請求都通過editor物件的getActionUrl方法獲取請求地址,可以直接通過複寫這個方法實現,把這段js單獨寫到一個js中,加入的網頁,並且在放在引用uditor的js之後。例子如下:

UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;
UE.Editor.prototype.getActionUrl =function(action){if(action =='uploadimage'|| action =='uploadscrawl'|| action =='uploadimage'){return'http://a.b.com/upload.php';}elseif(action =='uploadvideo'){return'http://a.b.com/video.php';}else
{returnthis._bkGetActionUrl.call(this, action);}}

action型別以及說明

  • uploadimage://執行上傳圖片或截圖的action名稱
  • uploadscrawl://執行上傳塗鴉的action名稱
  • uploadvideo://執行上傳視訊的action名稱
  • uploadfile://controller裡,執行上傳視訊的action名稱
  • catchimage://執行抓取遠端圖片的action名稱
  • listimage://執行列出圖片的action名稱
  • listfile://執行列出檔案的action名稱

把上面的返回地址換成自己的controller地址或跨域地址就可以了 二,定義返回值的格式
  由於ueditor是使用ajax的請求的,所以返回的格式是一個json串。格式如下: {
"state": "SUCCESS",
"url": "upload/demo.jpg",
"title": "demo.jpg",
"original": "demo.jpg",
"type":".jpg", "size" :"1024" }
其中type是圖片的型別;size是圖片的大小,url就是圖片插入到ueditor中的圖片可訪問的地址 我們還有另外一種方式知道返回的格式,就是在ueditor預設的配置情況下,看一下上傳圖片後成功的返回值格式就可以了。在瀏覽器上按下f12,點network->response 三,圖片中文名返回亂碼的解決方案  當圖片的名字是中文的時候,返回的結果中中文卻是亂碼,比如:???;就算是配置了所有的編碼是utf8之後也不可以。這是因為在顯示的時候ueditor是按unicode方式顯示的。這個時候我們需要把返回結果的json串轉成unicode格式,如下: (1) 接收圖片的controller:
package com.gametech.controller;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

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

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 org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import com.alibaba.fastjson.JSON;
import com.gametech.entity.ReturnUpLoadImage;
import com.gametech.utils.StringUtils;

@Controller
@RequestMapping("upload")
public class UploadController {
	/**
	 * 
	 * @return
	 */
	@RequestMapping("upImage")
	@ResponseBody
	public String upImage(HttpServletRequest request, HttpServletResponse response) {
		// 建立一個通用的多部分解析器
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
				request.getSession().getServletContext());
		String[] filenames = null;
		// 判斷 request 是否有檔案上傳,即多部分請求
		//{"state": "SUCCESS","title": "1437299650668072896.jpg","original": "rdn_508f4a9624572.jpg","type": ".jpg","url": "/ueditor/upload/image/20150719/1437299650668072896.jpg","size": "14262"}
		
		ReturnUpLoadImage upLoadImage = new ReturnUpLoadImage();
		upLoadImage.setUrl("upload/1.jpg");
		if (multipartResolver.isMultipart(request)) {
			// 轉換成多部分request
			//MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request);
<span style="white-space:pre">		</span>MultipartHttpServletRequest multiRequest =  (MultipartHttpServletRequest) request;
			filenames = new String[multiRequest.getFileMap().size()];
			// 取得request中的所有檔名
			Iterator<String> iter = multiRequest.getFileNames();
			int i = 0;
			while (iter.hasNext()) {
				// 記錄上傳過程起始時的時間,用來計算上傳時間
				int pre = (int) System.currentTimeMillis();
				// 取得上傳檔案
				MultipartFile file = multiRequest.getFile(iter.next());
				if (file != null) {
					// 取得當前上傳檔案的檔名稱
					String myFileName = file.getOriginalFilename();
					upLoadImage.setOriginal(myFileName);
					// 如果名稱不為“”,說明該檔案存在,否則說明該檔案不存在
					if (myFileName.trim() != "") {
						System.out.println(myFileName);
						// 重新命名上傳後的檔名
						String fileName = "demoUpload" + file.getOriginalFilename();
						upLoadImage.setTitle(fileName);
						filenames[i] = fileName;
						i++;
						// 定義上傳路徑
						String path = "E:/" + fileName;
						File localFile = new File(path);
						try {
							file.transferTo(localFile);
						} catch (IllegalStateException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
				// 記錄上傳該檔案後的時間
				int finaltime = (int) System.currentTimeMillis();
				System.out.println(finaltime - pre);
			}

		}
		upLoadImage.setType(".jpg");
		upLoadImage.setSize("1024");
		String result = JSON.toJSONString(upLoadImage);
		result = StringUtils.chinaToUnicode(result);
		return result;
		//return "{\"state\": \"SUCCESS\",\"title\": \"1437300241099035569.jpg\",\"original\": \"QQ\u622a\u56fe20150327230133.jpg\",\"type\": \".jpg\",\"url\": \"/ueditor/upload/image/20150719/1437300241099035569.jpg\",\"size\": \"463908\"}";
	}
}

(2) 中文轉unicode方法
/** 
     * 把中文轉成Unicode碼 
     * @param str 
     * @return 
     */  
    public static String chinaToUnicode(String str){  
        String result="";  
        for (int i = 0; i < str.length(); i++){  
            int chr1 = (char) str.charAt(i);  
            if(chr1>=19968&&chr1<=171941){//漢字範圍 \u4e00-\u9fa5 (中文)  
                result+="\\u" + Integer.toHexString(chr1);  
            }else{  
                result+=str.charAt(i);  
            }  
        }  
        return result;  
    } 

ok,這樣就可以了。更多文章請訪問:http://www.youxijishu.com

掃描關注遊戲技術網:

如轉載,請註明來自:遊戲技術網