Bladeren bron

add ueditor

zhou-hao 7 jaren geleden
bovenliggende
commit
ed048108db
25 gewijzigde bestanden met toevoegingen van 1625 en 0 verwijderingen
  1. 41 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/pom.xml
  2. 125 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/ActionEnter.java
  3. 208 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/ConfigManager.java
  4. 9 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/Context.java
  5. 24 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/Encoder.java
  6. 157 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/PathFormat.java
  7. 42 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/ActionMap.java
  8. 5 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/ActionState.java
  9. 81 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/AppInfo.java
  10. 87 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/BaseState.java
  11. 35 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/FileType.java
  12. 23 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/MIMEType.java
  13. 104 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/MultiState.java
  14. 18 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/State.java
  15. 89 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/hunter/FileManager.java
  16. 129 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/hunter/ImageHunter.java
  17. 50 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/Base64Uploader.java
  18. 86 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/BinaryUploader.java
  19. 149 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/StorageManager.java
  20. 32 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/Uploader.java
  21. 13 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/org/hswebframework/web/thirdpart/ueditor/UeditorAutoConfiguration.java
  22. 86 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/org/hswebframework/web/thirdpart/ueditor/UeditorController.java
  23. 10 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/resources/META-INF/additional-spring-configuration-metadata.json
  24. 3 0
      hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/resources/META-INF/spring.factories
  25. 19 0
      hsweb-thirdparty/pom.xml

+ 41 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/pom.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-thirdparty</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-thirdparty-ueditor</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-system-file-service-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.5</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.2</version>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+</project>

+ 125 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/ActionEnter.java

@@ -0,0 +1,125 @@
+package com.baidu.ueditor;
+
+import com.baidu.ueditor.define.ActionMap;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.State;
+import com.baidu.ueditor.hunter.FileManager;
+import com.baidu.ueditor.hunter.ImageHunter;
+import com.baidu.ueditor.upload.Uploader;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+public class ActionEnter {
+	
+	private HttpServletRequest request = null;
+	
+	private String rootPath = null;
+	private String contextPath = null;
+	
+	private String actionType = null;
+	
+	private ConfigManager configManager = null;
+
+	public ActionEnter ( HttpServletRequest request, String rootPath ) {
+		
+		this.request = request;
+		this.rootPath = rootPath;
+		this.actionType = request.getParameter( "action" );
+		this.contextPath = request.getContextPath();
+		this.configManager = ConfigManager.getInstance( this.rootPath, this.contextPath, request.getRequestURI() );
+	}
+	
+	public String exec () {
+		
+		String callbackName = this.request.getParameter("callback");
+		
+		if ( callbackName != null ) {
+
+			if ( !validCallbackName( callbackName ) ) {
+				return new BaseState( false, AppInfo.ILLEGAL ).toJSONString();
+			}
+			
+			return callbackName+"("+this.invoke()+");";
+			
+		} else {
+			return this.invoke();
+		}
+
+	}
+	
+	public String invoke() {
+		
+		if ( actionType == null || !ActionMap.mapping.containsKey( actionType ) ) {
+			return new BaseState( false, AppInfo.INVALID_ACTION ).toJSONString();
+		}
+		
+		if ( this.configManager == null || !this.configManager.valid() ) {
+			return new BaseState( false, AppInfo.CONFIG_ERROR ).toJSONString();
+		}
+		
+		State state = null;
+		
+		int actionCode = ActionMap.getType(this.actionType);
+		
+		Map<String, Object> conf = null;
+		
+		switch ( actionCode ) {
+		
+			case ActionMap.CONFIG:
+				return this.configManager.getAllConfig().toString();
+				
+			case ActionMap.UPLOAD_IMAGE:
+			case ActionMap.UPLOAD_SCRAWL:
+			case ActionMap.UPLOAD_VIDEO:
+			case ActionMap.UPLOAD_FILE:
+				conf = this.configManager.getConfig( actionCode );
+				state = new Uploader( request, conf ).doExec();
+				break;
+				
+			case ActionMap.CATCH_IMAGE:
+				conf = configManager.getConfig( actionCode );
+				String[] list = this.request.getParameterValues( (String)conf.get( "fieldName" ) );
+				state = new ImageHunter( conf ).capture( list );
+				break;
+				
+			case ActionMap.LIST_IMAGE:
+			case ActionMap.LIST_FILE:
+				conf = configManager.getConfig( actionCode );
+				int start = this.getStartIndex();
+				state = new FileManager( conf ).listFile( start );
+				break;
+				
+		}
+		
+		return state.toJSONString();
+		
+	}
+	
+	public int getStartIndex () {
+		
+		String start = this.request.getParameter( "start" );
+		
+		try {
+			return Integer.parseInt(start);
+		} catch ( Exception e ) {
+			return 0;
+		}
+		
+	}
+	
+	/**
+	 * callback参数验证
+	 */
+	public boolean validCallbackName ( String name ) {
+		
+		if ( name.matches( "^[a-zA-Z_]+[\\w0-9_]*$" ) ) {
+			return true;
+		}
+		
+		return false;
+		
+	}
+	
+}

+ 208 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/ConfigManager.java

@@ -0,0 +1,208 @@
+package com.baidu.ueditor;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baidu.ueditor.define.ActionMap;
+import org.hsweb.commons.file.FileUtils;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * 配置管理器
+ *
+ * @author hancong03@baidu.com
+ */
+public final class ConfigManager {
+
+    private final String rootPath;
+    private final String originalPath;
+    // private final String contextPath;
+    private static final String configFileName = "config.json";
+    private String parentPath = null;
+    private JSONObject jsonConfig = null;
+    // 涂鸦上传filename定义
+    private final static String SCRAWL_FILE_NAME = "scrawl";
+    // 远程图片抓取filename定义
+    private final static String REMOTE_FILE_NAME = "remote";
+
+    /*
+     * 通过一个给定的路径构建一个配置管理器, 该管理器要求地址路径所在目录下必须存在config.properties文件
+     */
+    private ConfigManager(String rootPath, String contextPath, String uri) throws IOException {
+
+
+        rootPath = rootPath.replace("\\", "/");
+
+        this.rootPath = rootPath;
+        // this.contextPath = contextPath;
+
+        if (contextPath.length() > 0) {
+            this.originalPath = this.rootPath + uri.substring(contextPath.length());
+        } else {
+            this.originalPath = this.rootPath + uri;
+        }
+
+        this.initEnv();
+
+    }
+
+    /**
+     * 配置管理器构造工厂
+     *
+     * @param rootPath    服务器根路径
+     * @param contextPath 服务器所在项目路径
+     * @param uri         当前访问的uri
+     * @return 配置管理器实例或者null
+     */
+    public static ConfigManager getInstance(String rootPath, String contextPath, String uri) {
+
+        try {
+            return new ConfigManager(rootPath, contextPath, uri);
+        } catch (Exception e) {
+            return null;
+        }
+
+    }
+
+    // 验证配置文件加载是否正确
+    public boolean valid() {
+        return this.jsonConfig != null;
+    }
+
+    public JSONObject getAllConfig() {
+
+        return this.jsonConfig;
+
+    }
+
+    public Map<String, Object> getConfig(int type) {
+
+        Map<String, Object> conf = new HashMap<String, Object>();
+        String savePath = null;
+
+        switch (type) {
+
+            case ActionMap.UPLOAD_FILE:
+                conf.put("isBase64", "false");
+                conf.put("maxSize", this.jsonConfig.getLong("fileMaxSize"));
+                conf.put("allowFiles", this.getArray("fileAllowFiles"));
+                conf.put("fieldName", this.jsonConfig.getString("fileFieldName"));
+                savePath = this.jsonConfig.getString("filePathFormat");
+                break;
+
+            case ActionMap.UPLOAD_IMAGE:
+                conf.put("isBase64", "false");
+                conf.put("maxSize", this.jsonConfig.getLong("imageMaxSize"));
+                conf.put("allowFiles", this.getArray("imageAllowFiles"));
+                conf.put("fieldName", this.jsonConfig.getString("imageFieldName"));
+                savePath = this.jsonConfig.getString("imagePathFormat");
+                break;
+
+            case ActionMap.UPLOAD_VIDEO:
+                conf.put("maxSize", this.jsonConfig.getLong("videoMaxSize"));
+                conf.put("allowFiles", this.getArray("videoAllowFiles"));
+                conf.put("fieldName", this.jsonConfig.getString("videoFieldName"));
+                savePath = this.jsonConfig.getString("videoPathFormat");
+                break;
+
+            case ActionMap.UPLOAD_SCRAWL:
+                conf.put("filename", ConfigManager.SCRAWL_FILE_NAME);
+                conf.put("maxSize", this.jsonConfig.getLong("scrawlMaxSize"));
+                conf.put("fieldName", this.jsonConfig.getString("scrawlFieldName"));
+                conf.put("isBase64", "true");
+                savePath = this.jsonConfig.getString("scrawlPathFormat");
+                break;
+
+            case ActionMap.CATCH_IMAGE:
+                conf.put("filename", ConfigManager.REMOTE_FILE_NAME);
+                conf.put("filter", this.getArray("catcherLocalDomain"));
+                conf.put("maxSize", this.jsonConfig.getLong("catcherMaxSize"));
+                conf.put("allowFiles", this.getArray("catcherAllowFiles"));
+                conf.put("fieldName", this.jsonConfig.getString("catcherFieldName") + "[]");
+                savePath = this.jsonConfig.getString("catcherPathFormat");
+                break;
+
+            case ActionMap.LIST_IMAGE:
+                conf.put("allowFiles", this.getArray("imageManagerAllowFiles"));
+                conf.put("dir", this.jsonConfig.getString("imageManagerListPath"));
+                conf.put("count", this.jsonConfig.getIntValue("imageManagerListSize"));
+                break;
+
+            case ActionMap.LIST_FILE:
+                conf.put("allowFiles", this.getArray("fileManagerAllowFiles"));
+                conf.put("dir", this.jsonConfig.getString("fileManagerListPath"));
+                conf.put("count", this.jsonConfig.getIntValue("fileManagerListSize"));
+                break;
+
+        }
+
+        conf.put("savePath", savePath);
+        conf.put("rootPath", this.rootPath);
+
+        return conf;
+
+    }
+
+    private void initEnv() throws IOException {
+        try {
+            JSONObject jsonConfig = JSON.parseObject(FileUtils.reader2String("config/ueditor.json"));
+            this.jsonConfig = jsonConfig;
+        } catch (Exception e) {
+            this.jsonConfig = null;
+        }
+
+    }
+
+    private String getConfigPath() {
+        return this.parentPath + File.separator + ConfigManager.configFileName;
+    }
+
+    private String[] getArray(String key) {
+
+        JSONArray jsonArray = this.jsonConfig.getJSONArray(key);
+        String[] result = new String[jsonArray.size()];
+
+        for (int i = 0, len = jsonArray.size(); i < len; i++) {
+            result[i] = jsonArray.getString(i);
+        }
+
+        return result;
+
+    }
+
+    private String readFile(String path) throws IOException {
+        Collection<String> str = Collections.synchronizedCollection(new ArrayList<String>());
+
+        StringBuilder builder = new StringBuilder();
+
+        try {
+
+            InputStreamReader reader = new InputStreamReader(new FileInputStream(path), "UTF-8");
+            BufferedReader bfReader = new BufferedReader(reader);
+
+            String tmpContent = null;
+
+            while ((tmpContent = bfReader.readLine()) != null) {
+                builder.append(tmpContent);
+            }
+
+            bfReader.close();
+
+        } catch (UnsupportedEncodingException e) {
+            // 忽略
+        }
+
+        return this.filter(builder.toString());
+
+    }
+
+    // 过滤输入字符串, 剔除多行注释以及替换掉反斜杠
+    private String filter(String input) {
+
+        return input.replaceAll("/\\*[\\s\\S]*?\\*/", "");
+
+    }
+
+}

+ 9 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/Context.java

@@ -0,0 +1,9 @@
+package com.baidu.ueditor;
+
+import org.hswebframework.web.service.file.FileInfoService;
+import org.hswebframework.web.service.file.FileService;
+
+public class Context {
+    public static FileService FILE_SERVICE;
+    public static FileInfoService RESOURCES_SERVICE;
+}

+ 24 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/Encoder.java

@@ -0,0 +1,24 @@
+package com.baidu.ueditor;
+
+public class Encoder {
+
+	public static String toUnicode ( String input ) {
+		
+		StringBuilder builder = new StringBuilder();
+		char[] chars = input.toCharArray();
+		
+		for ( char ch : chars ) {
+			
+			if ( ch < 256 ) {
+				builder.append( ch );
+			} else {
+				builder.append( "\\u" +  Integer.toHexString(ch & 0xffff) );
+			}
+			
+		}
+		
+		return builder.toString();
+		
+	}
+	
+}

+ 157 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/PathFormat.java

@@ -0,0 +1,157 @@
+package com.baidu.ueditor;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class PathFormat {
+	
+	private static final String TIME = "time";
+	private static final String FULL_YEAR = "yyyy";
+	private static final String YEAR = "yy";
+	private static final String MONTH = "mm";
+	private static final String DAY = "dd";
+	private static final String HOUR = "hh";
+	private static final String MINUTE = "ii";
+	private static final String SECOND = "ss";
+	private static final String RAND = "rand";
+	
+	private static Date currentDate = null;
+	
+	public static String parse ( String input ) {
+		
+		Pattern pattern = Pattern.compile("\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE);
+		Matcher matcher = pattern.matcher(input);
+		
+		PathFormat.currentDate = new Date();
+		
+		StringBuffer sb = new StringBuffer();
+		
+		while ( matcher.find() ) {
+			
+			matcher.appendReplacement(sb, PathFormat.getString(matcher.group(1)) );
+			
+		}
+		
+		matcher.appendTail(sb);
+		
+		return sb.toString();
+	}
+	
+	/**
+	 * 格式化路径, 把windows路径替换成标准路径
+	 * @param input 待格式化的路径
+	 * @return 格式化后的路径
+	 */
+	public static String format ( String input ) {
+		
+		return input.replace( "\\", "/" );
+		
+	}
+
+	public static String parse ( String input, String filename ) {
+	
+		Pattern pattern = Pattern.compile("\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE);
+		Matcher matcher = pattern.matcher(input);
+		String matchStr = null;
+		
+		PathFormat.currentDate = new Date();
+		
+		StringBuffer sb = new StringBuffer();
+		
+		while ( matcher.find() ) {
+			
+			matchStr = matcher.group( 1 );
+			if ( matchStr.indexOf( "filename" ) != -1 ) {
+				filename = filename.replace( "$", "\\$" ).replaceAll( "[\\/:*?\"<>|]", "" );
+				matcher.appendReplacement(sb, filename );
+			} else {
+				matcher.appendReplacement(sb, PathFormat.getString(matchStr) );
+			}
+			
+		}
+		
+		matcher.appendTail(sb);
+		
+		return sb.toString();
+	}
+		
+	private static String getString ( String pattern ) {
+		
+		pattern = pattern.toLowerCase();
+		
+		// time 处理
+		if ( pattern.indexOf( PathFormat.TIME ) != -1 ) {
+			return PathFormat.getTimestamp();
+		} else if ( pattern.indexOf( PathFormat.FULL_YEAR ) != -1 ) {
+			return PathFormat.getFullYear();
+		} else if ( pattern.indexOf( PathFormat.YEAR ) != -1 ) {
+			return PathFormat.getYear();
+		} else if ( pattern.indexOf( PathFormat.MONTH ) != -1 ) {
+			return PathFormat.getMonth();
+		} else if ( pattern.indexOf( PathFormat.DAY ) != -1 ) {
+			return PathFormat.getDay();
+		} else if ( pattern.indexOf( PathFormat.HOUR ) != -1 ) {
+			return PathFormat.getHour();
+		} else if ( pattern.indexOf( PathFormat.MINUTE ) != -1 ) {
+			return PathFormat.getMinute();
+		} else if ( pattern.indexOf( PathFormat.SECOND ) != -1 ) {
+			return PathFormat.getSecond();
+		} else if ( pattern.indexOf( PathFormat.RAND ) != -1 ) {
+			return PathFormat.getRandom(pattern);
+		}
+		
+		return pattern;
+		
+	}
+
+	private static String getTimestamp () {
+		return System.currentTimeMillis() + "";
+	}
+	
+	private static String getFullYear () {
+		return new SimpleDateFormat( "yyyy" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getYear () {
+		return new SimpleDateFormat( "yy" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getMonth () {
+		return new SimpleDateFormat( "MM" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getDay () {
+		return new SimpleDateFormat( "dd" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getHour () {
+		return new SimpleDateFormat( "HH" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getMinute () {
+		return new SimpleDateFormat( "mm" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getSecond () {
+		return new SimpleDateFormat( "ss" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getRandom ( String pattern ) {
+		
+		int length = 0;
+		pattern = pattern.split( ":" )[ 1 ].trim();
+		
+		length = Integer.parseInt(pattern);
+		
+		return ( Math.random() + "" ).replace( ".", "" ).substring( 0, length );
+		
+	}
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+
+	}
+
+}

+ 42 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/ActionMap.java

@@ -0,0 +1,42 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 定义请求action类型
+ * @author hancong03@baidu.com
+ *
+ */
+@SuppressWarnings("serial")
+public final class ActionMap {
+
+	public static final Map<String, Integer> mapping;
+	// 获取配置请求
+	public static final int CONFIG = 0;
+	public static final int UPLOAD_IMAGE = 1;
+	public static final int UPLOAD_SCRAWL = 2;
+	public static final int UPLOAD_VIDEO = 3;
+	public static final int UPLOAD_FILE = 4;
+	public static final int CATCH_IMAGE = 5;
+	public static final int LIST_FILE = 6;
+	public static final int LIST_IMAGE = 7;
+	
+	static {
+		mapping = new HashMap<String, Integer>(){{
+			put( "config", ActionMap.CONFIG );
+			put( "uploadimage", ActionMap.UPLOAD_IMAGE );
+			put( "uploadscrawl", ActionMap.UPLOAD_SCRAWL );
+			put( "uploadvideo", ActionMap.UPLOAD_VIDEO );
+			put( "uploadfile", ActionMap.UPLOAD_FILE );
+			put( "catchimage", ActionMap.CATCH_IMAGE );
+			put( "listfile", ActionMap.LIST_FILE );
+			put( "listimage", ActionMap.LIST_IMAGE );
+		}};
+	}
+	
+	public static int getType ( String key ) {
+		return ActionMap.mapping.get( key );
+	}
+	
+}

+ 5 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/ActionState.java

@@ -0,0 +1,5 @@
+package com.baidu.ueditor.define;
+
+public enum ActionState {
+	UNKNOW_ERROR
+}

+ 81 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/AppInfo.java

@@ -0,0 +1,81 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public final class AppInfo {
+
+	public static final int SUCCESS = 0;
+	public static final int MAX_SIZE = 1;
+	public static final int PERMISSION_DENIED = 2;
+	public static final int FAILED_CREATE_FILE = 3;
+	public static final int IO_ERROR = 4;
+	public static final int NOT_MULTIPART_CONTENT = 5;
+	public static final int PARSE_REQUEST_ERROR = 6;
+	public static final int NOTFOUND_UPLOAD_DATA = 7;
+	public static final int NOT_ALLOW_FILE_TYPE = 8;
+
+	public static final int INVALID_ACTION = 101;
+	public static final int CONFIG_ERROR = 102;
+
+	public static final int PREVENT_HOST = 201;
+	public static final int CONNECTION_ERROR = 202;
+	public static final int REMOTE_FAIL = 203;
+
+	public static final int NOT_DIRECTORY = 301;
+	public static final int NOT_EXIST = 302;
+
+	public static final int ILLEGAL = 401;
+
+	public static Map<Integer, String> info = new HashMap<Integer, String>() {
+		private static final long serialVersionUID = 7957693488024072535L;
+
+		{
+
+			put(AppInfo.SUCCESS, "SUCCESS");
+
+			// 无效的Action
+			put(AppInfo.INVALID_ACTION, "\u65E0\u6548\u7684Action");
+			// 配置文件初始化失败
+			put(AppInfo.CONFIG_ERROR, "\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u5931\u8D25");
+			// 抓取远程图片失败
+			put(AppInfo.REMOTE_FAIL, "\u6293\u53D6\u8FDC\u7A0B\u56FE\u7247\u5931\u8D25");
+
+			// 被阻止的远程主机
+			put(AppInfo.PREVENT_HOST, "\u88AB\u963B\u6B62\u7684\u8FDC\u7A0B\u4E3B\u673A");
+			// 远程连接出错
+			put(AppInfo.CONNECTION_ERROR, "\u8FDC\u7A0B\u8FDE\u63A5\u51FA\u9519");
+
+			// "文件大小超出限制"
+			put(AppInfo.MAX_SIZE, "\u6587\u4ef6\u5927\u5c0f\u8d85\u51fa\u9650\u5236");
+			// 权限不足, 多指写权限
+			put(AppInfo.PERMISSION_DENIED, "\u6743\u9650\u4E0D\u8DB3");
+			// 创建文件失败
+			put(AppInfo.FAILED_CREATE_FILE, "\u521B\u5EFA\u6587\u4EF6\u5931\u8D25");
+			// IO错误
+			put(AppInfo.IO_ERROR, "IO\u9519\u8BEF");
+			// 上传表单不是multipart/form-data类型
+			put(AppInfo.NOT_MULTIPART_CONTENT, "\u4E0A\u4F20\u8868\u5355\u4E0D\u662Fmultipart/form-data\u7C7B\u578B");
+			// 解析上传表单错误
+			put(AppInfo.PARSE_REQUEST_ERROR, "\u89E3\u6790\u4E0A\u4F20\u8868\u5355\u9519\u8BEF");
+			// 未找到上传数据
+			put(AppInfo.NOTFOUND_UPLOAD_DATA, "\u672A\u627E\u5230\u4E0A\u4F20\u6570\u636E");
+			// 不允许的文件类型
+			put(AppInfo.NOT_ALLOW_FILE_TYPE, "\u4E0D\u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B");
+
+			// 指定路径不是目录
+			put(AppInfo.NOT_DIRECTORY, "\u6307\u5B9A\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55");
+			// 指定路径并不存在
+			put(AppInfo.NOT_EXIST, "\u6307\u5B9A\u8DEF\u5F84\u5E76\u4E0D\u5B58\u5728");
+
+			// callback参数名不合法
+			put(AppInfo.ILLEGAL, "Callback\u53C2\u6570\u540D\u4E0D\u5408\u6CD5");
+
+		}
+	};
+
+	public static String getStateInfo(int key) {
+		return AppInfo.info.get(key);
+	}
+
+}

+ 87 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/BaseState.java

@@ -0,0 +1,87 @@
+package com.baidu.ueditor.define;
+
+import com.baidu.ueditor.Encoder;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class BaseState implements State {
+
+	private boolean state = false;
+	private String info = null;
+	
+	private Map<String, String> infoMap = new HashMap<String, String>();
+	
+	public BaseState () {
+		this.state = true;
+	}
+	
+	public BaseState ( boolean state ) {
+		this.setState( state );
+	}
+	
+	public BaseState ( boolean state, String info ) {
+		this.setState( state );
+		this.info = info;
+	}
+	
+	public BaseState ( boolean state, int infoCode ) {
+		this.setState( state );
+		this.info = AppInfo.getStateInfo(infoCode);
+	}
+	
+	public boolean isSuccess () {
+		return this.state;
+	}
+	
+	public void setState ( boolean state ) {
+		this.state = state;
+	}
+	
+	public void setInfo ( String info ) {
+		this.info = info;
+	}
+	
+	public void setInfo ( int infoCode ) {
+		this.info = AppInfo.getStateInfo(infoCode);
+	}
+	
+	public String toJSONString() {
+		return this.toString();
+	}
+	
+	public String toString () {
+		
+		String key = null;
+		String stateVal = this.isSuccess() ? AppInfo.getStateInfo(AppInfo.SUCCESS) : this.info;
+		
+		StringBuilder builder = new StringBuilder();
+		
+		builder.append( "{\"state\": \"" + stateVal + "\"" );
+		
+		Iterator<String> iterator = this.infoMap.keySet().iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			key = iterator.next();
+			
+			builder.append( ",\"" + key + "\": \"" + this.infoMap.get(key) + "\"" );
+			
+		}
+		
+		builder.append( "}" );
+
+		return Encoder.toUnicode(builder.toString());
+
+	}
+
+	public void putInfo(String name, String val) {
+		this.infoMap.put(name, val);
+	}
+
+	public void putInfo(String name, long val) {
+		this.putInfo(name, val+"");
+	}
+
+}

+ 35 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/FileType.java

@@ -0,0 +1,35 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class FileType {
+
+	public static final String JPG = "JPG";
+	
+	private static final Map<String, String> types = new HashMap<String, String>(){
+
+		private static final long serialVersionUID = -935543810424292061L;
+
+	{
+		
+		put( FileType.JPG, ".jpg" );
+		
+	}};
+	
+	public static String getSuffix ( String key ) {
+		return FileType.types.get( key );
+	}
+	
+	/**
+	 * 根据给定的文件名,获取其后缀信息
+	 * @param filename
+	 * @return
+	 */
+	public static String getSuffixByFilename ( String filename ) {
+		
+		return filename.substring( filename.lastIndexOf( "." ) ).toLowerCase();
+		
+	}
+	
+}

+ 23 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/MIMEType.java

@@ -0,0 +1,23 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MIMEType {
+
+	public static final Map<String, String> types = new HashMap<String, String>(){ 
+		private static final long serialVersionUID = -2881802098108442811L;
+
+	{
+		put( "image/gif", ".gif" );
+		put( "image/jpeg", ".jpg" );
+		put( "image/jpg", ".jpg" );
+		put( "image/png", ".png" );
+		put( "image/bmp", ".bmp" );
+	}};
+	
+	public static String getSuffix ( String mime ) {
+		return MIMEType.types.get( mime );
+	}
+	
+}

+ 104 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/MultiState.java

@@ -0,0 +1,104 @@
+package com.baidu.ueditor.define;
+
+import com.baidu.ueditor.Encoder;
+
+import java.util.*;
+
+/**
+ * 多状态集合状态
+ * 其包含了多个状态的集合, 其本身自己也是一个状态
+ * @author hancong03@baidu.com
+ *
+ */
+public class MultiState implements State {
+
+	private boolean state = false;
+	private String info = null;
+	private Map<String, Long> intMap = new HashMap<String, Long>();
+	private Map<String, String> infoMap = new HashMap<String, String>();
+	private List<String> stateList = new ArrayList<String>();
+	
+	public MultiState ( boolean state ) {
+		this.state = state;
+	}
+	
+	public MultiState ( boolean state, String info ) {
+		this.state = state;
+		this.info = info;
+	}
+	
+	public MultiState ( boolean state, int infoKey ) {
+		this.state = state;
+		this.info = AppInfo.getStateInfo(infoKey);
+	}
+	
+	public boolean isSuccess() {
+		return this.state;
+	}
+	
+	public void addState ( State state ) {
+		stateList.add( state.toJSONString() );
+	}
+
+	/**
+	 * 该方法调用无效果
+	 */
+	public void putInfo(String name, String val) {
+		this.infoMap.put(name, val);
+	}
+
+	public String toJSONString() {
+		
+		String stateVal = this.isSuccess() ? AppInfo.getStateInfo(AppInfo.SUCCESS) : this.info;
+		
+		StringBuilder builder = new StringBuilder();
+		
+		builder.append( "{\"state\": \"" + stateVal + "\"" );
+		
+		// 数字转换
+		Iterator<String> iterator = this.intMap.keySet().iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			stateVal = iterator.next();
+			
+			builder.append( ",\""+ stateVal +"\": " + this.intMap.get( stateVal ) );
+			
+		}
+		
+		iterator = this.infoMap.keySet().iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			stateVal = iterator.next();
+			
+			builder.append( ",\""+ stateVal +"\": \"" + this.infoMap.get( stateVal ) + "\"" );
+			
+		}
+		
+		builder.append( ", list: [" );
+		
+		
+		iterator = this.stateList.iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			builder.append( iterator.next() + "," );
+			
+		}
+		
+		if ( this.stateList.size() > 0 ) {
+			builder.deleteCharAt( builder.length() - 1 );
+		}
+		
+		builder.append( " ]}" );
+
+		return Encoder.toUnicode(builder.toString());
+
+	}
+
+	public void putInfo(String name, long val) {
+		this.intMap.put( name, val );
+	}
+
+}

+ 18 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/define/State.java

@@ -0,0 +1,18 @@
+package com.baidu.ueditor.define;
+
+/**
+ * 处理状态接口
+ * @author hancong03@baidu.com
+ *
+ */
+public interface State {
+	
+	public boolean isSuccess();
+	
+	public void putInfo(String name, String val);
+	
+	public void putInfo(String name, long val);
+	
+	public String toJSONString();
+
+}

+ 89 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/hunter/FileManager.java

@@ -0,0 +1,89 @@
+package com.baidu.ueditor.hunter;
+
+import com.baidu.ueditor.define.MultiState;
+import com.baidu.ueditor.define.State;
+
+import java.io.File;
+import java.util.Map;
+
+public class FileManager {
+
+    private String   dir        = null;
+    private String   rootPath   = null;
+    private String[] allowFiles = null;
+    private int      count      = 0;
+
+    public FileManager(Map<String, Object> conf) {
+
+        this.rootPath = (String) conf.get("rootPath");
+        this.dir = this.rootPath + (String) conf.get("dir");
+        this.allowFiles = this.getAllowFiles(conf.get("allowFiles"));
+        this.count = (Integer) conf.get("count");
+
+    }
+
+    public State listFile(int index) {
+
+        State state = new MultiState(true);
+
+        state.putInfo("start", index);
+        state.putInfo("total",0);
+
+        return state;
+
+    }
+
+//    private State getState(List<FileInfoEntity> resources) {
+//
+//        MultiState state = new MultiState(true);
+//        BaseState fileState = null;
+//
+//        for (FileInfoEntity obj : resources) {
+//            if (obj == null) {
+//                break;
+//            }
+//            fileState = new BaseState(true);
+//            fileState.putInfo("url", rootPath + "file/download/" + obj.getId() + "/" + obj.getName());
+//            state.addState(fileState);
+//        }
+//
+//        return state;
+//
+//    }
+
+    private String getPath(File file) {
+
+        String path = file.getAbsolutePath();
+        path = path.replace("\\", "/");
+        return path.replace(this.rootPath, "/");
+
+    }
+
+    private String[] getAllowFiles(Object fileExt) {
+
+        String[] exts = null;
+        String ext = null;
+
+        if (fileExt == null) {
+            return new String[0];
+        }
+
+        exts = (String[]) fileExt;
+
+        for (int i = 0, len = exts.length; i < len; i++) {
+
+            ext = exts[i];
+            exts[i] = ext.replace(".", "");
+
+        }
+
+        return exts;
+
+    }
+
+    public static void main(String[] args) {
+        int n = 13;
+        System.out.println(n > 9 ? (char) (n - 10 + 'A') : n);
+        System.out.println(n > 9 ? (char) (n - 10 + 'A') : 1);
+    }
+}

+ 129 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/hunter/ImageHunter.java

@@ -0,0 +1,129 @@
+package com.baidu.ueditor.hunter;
+
+import com.baidu.ueditor.PathFormat;
+import com.baidu.ueditor.define.*;
+import com.baidu.ueditor.upload.StorageManager;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 图片抓取器
+ * @author hancong03@baidu.com
+ *
+ */
+public class ImageHunter {
+
+	private String filename = null;
+	private String savePath = null;
+	private String rootPath = null;
+	private List<String> allowTypes = null;
+	private long maxSize = -1;
+	
+	private List<String> filters = null;
+	
+	public ImageHunter ( Map<String, Object> conf ) {
+		
+		this.filename = (String)conf.get( "filename" );
+		this.savePath = (String)conf.get( "savePath" );
+		this.rootPath = (String)conf.get( "rootPath" );
+		this.maxSize = (Long)conf.get( "maxSize" );
+		this.allowTypes = Arrays.asList((String[]) conf.get("allowFiles"));
+		this.filters = Arrays.asList((String[]) conf.get("filter"));
+		
+	}
+	
+	public State capture ( String[] list ) {
+		
+		MultiState state = new MultiState( true );
+		
+		for ( String source : list ) {
+			state.addState( captureRemoteData( source ) );
+		}
+		
+		return state;
+		
+	}
+
+	public State captureRemoteData ( String urlStr ) {
+		
+		HttpURLConnection connection = null;
+		URL url = null;
+		String suffix = null;
+		
+		try {
+			url = new URL( urlStr );
+
+			if ( !validHost( url.getHost() ) ) {
+				return new BaseState( false, AppInfo.PREVENT_HOST );
+			}
+			
+			connection = (HttpURLConnection) url.openConnection();
+		
+			connection.setInstanceFollowRedirects( true );
+			connection.setUseCaches( true );
+		
+			if ( !validContentState( connection.getResponseCode() ) ) {
+				return new BaseState( false, AppInfo.CONNECTION_ERROR );
+			}
+			
+			suffix = MIMEType.getSuffix( connection.getContentType() );
+			
+			if ( !validFileType( suffix ) ) {
+				return new BaseState( false, AppInfo.NOT_ALLOW_FILE_TYPE );
+			}
+			
+			if ( !validFileSize( connection.getContentLength() ) ) {
+				return new BaseState( false, AppInfo.MAX_SIZE );
+			}
+			
+			String savePath = this.getPath( this.savePath, this.filename, suffix );
+			String physicalPath = this.rootPath + savePath;
+
+			State state = StorageManager.saveFileByInputStream( connection.getInputStream(), physicalPath );
+			
+			if ( state.isSuccess() ) {
+				state.putInfo( "url", PathFormat.format( savePath ) );
+				state.putInfo( "source", urlStr );
+			}
+			
+			return state;
+			
+		} catch ( Exception e ) {
+			return new BaseState( false, AppInfo.REMOTE_FAIL );
+		}
+		
+	}
+	
+	private String getPath ( String savePath, String filename, String suffix  ) {
+		
+		return PathFormat.parse( savePath + suffix, filename );
+		
+	}
+	
+	private boolean validHost ( String hostname ) {
+		
+		return !filters.contains( hostname );
+		
+	}
+	
+	private boolean validContentState ( int code ) {
+		
+		return HttpURLConnection.HTTP_OK == code;
+		
+	}
+	
+	private boolean validFileType ( String type ) {
+		
+		return this.allowTypes.contains( type );
+		
+	}
+	
+	private boolean validFileSize ( int size ) {
+		return size < this.maxSize;
+	}
+	
+}

+ 50 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/Base64Uploader.java

@@ -0,0 +1,50 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.Context;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.FileType;
+import com.baidu.ueditor.define.State;
+import org.apache.commons.codec.binary.Base64;
+import org.hswebframework.web.service.file.FileService;
+
+import java.io.ByteArrayInputStream;
+import java.util.Map;
+
+public final class Base64Uploader {
+
+    public static State save(String content, Map<String, Object> conf) {
+
+        byte[] data = decode(content);
+
+        long maxSize = (Long) conf.get("maxSize");
+
+        if (!validSize(data, maxSize)) {
+            return new BaseState(false, AppInfo.MAX_SIZE);
+        }
+        String fileUrlPrefix = (String) conf.get("rootPath");
+        String suffix = FileType.getSuffix("JPG");
+        try {
+            FileService fileService = Context.FILE_SERVICE;
+            String path = fileService.saveStaticFile(new ByteArrayInputStream(data), System.currentTimeMillis() + suffix);
+            State state = new BaseState(true);
+            state.putInfo("size", data.length);
+            state.putInfo("title", "");
+            state.putInfo("url", path);
+            state.putInfo("type", suffix);
+            return state;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new BaseState(false, AppInfo.IO_ERROR);
+    }
+
+    private static byte[] decode(String content) {
+        return Base64.decodeBase64(content);
+    }
+
+    private static boolean validSize(byte[] data, long length) {
+        return data.length <= length;
+    }
+
+}

+ 86 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/BinaryUploader.java

@@ -0,0 +1,86 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.Context;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.FileType;
+import com.baidu.ueditor.define.State;
+import org.apache.commons.fileupload.FileItemIterator;
+import org.apache.commons.fileupload.FileItemStream;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.hswebframework.web.service.file.FileService;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class BinaryUploader {
+
+    public static final State save(HttpServletRequest request, Map<String, Object> conf) {
+        FileItemStream fileStream = null;
+        boolean isAjaxUpload = request.getHeader("X_Requested_With") != null;
+
+        if (!ServletFileUpload.isMultipartContent(request)) {
+            return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);
+        }
+
+        ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
+
+        if (isAjaxUpload) {
+            upload.setHeaderEncoding("UTF-8");
+        }
+        try {
+            FileItemIterator iterator = upload.getItemIterator(request);
+
+            while (iterator.hasNext()) {
+                fileStream = iterator.next();
+
+                if (!fileStream.isFormField())
+                    break;
+                fileStream = null;
+            }
+            if (fileStream == null) {
+                return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);
+            }
+
+            String savePath = (String) conf.get("savePath");
+            String originFileName = fileStream.getName();
+            String suffix = FileType.getSuffixByFilename(originFileName);
+
+            originFileName = originFileName.substring(0, originFileName.length() - suffix.length());
+            if (!validType(suffix, (String[]) conf.get("allowFiles"))) {
+                return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);
+            }
+            InputStream is = fileStream.openStream();
+            try {
+                FileService fileService = Context.FILE_SERVICE;
+
+                String path = fileService.saveStaticFile(is, originFileName + suffix);
+                State state = new BaseState(true);
+                state.putInfo("size", 0);
+                state.putInfo("title", originFileName + suffix);
+                state.putInfo("url", path);
+                state.putInfo("type", suffix);
+                state.putInfo("original", originFileName + suffix);
+                return state;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (FileUploadException e) {
+            return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);
+        } catch (IOException e) {
+        }
+        return new BaseState(false, AppInfo.IO_ERROR);
+    }
+
+    private static boolean validType(String type, String[] allowTypes) {
+        List<String> list = Arrays.asList(allowTypes);
+
+        return list.contains(type);
+    }
+}

+ 149 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/StorageManager.java

@@ -0,0 +1,149 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.State;
+import org.apache.commons.io.FileUtils;
+
+import java.io.*;
+
+public class StorageManager {
+	public static final int BUFFER_SIZE = 8192;
+
+	public StorageManager() {
+	}
+
+	public static State saveBinaryFile(byte[] data, String path) {
+		File file = new File(path);
+
+		State state = valid(file);
+
+		if (!state.isSuccess()) {
+			return state;
+		}
+
+		try {
+			BufferedOutputStream bos = new BufferedOutputStream(
+					new FileOutputStream(file));
+			bos.write(data);
+			bos.flush();
+			bos.close();
+		} catch (IOException ioe) {
+			return new BaseState(false, AppInfo.IO_ERROR);
+		}
+
+		state = new BaseState(true, file.getAbsolutePath());
+		state.putInfo( "size", data.length );
+		state.putInfo( "title", file.getName() );
+		return state;
+	}
+
+	public static State saveFileByInputStream(InputStream is, String path,
+			long maxSize) {
+		State state = null;
+
+		File tmpFile = getTmpFile();
+
+		byte[] dataBuf = new byte[ 2048 ];
+		BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE);
+
+		try {
+			BufferedOutputStream bos = new BufferedOutputStream(
+					new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE);
+
+			int count = 0;
+			while ((count = bis.read(dataBuf)) != -1) {
+				bos.write(dataBuf, 0, count);
+			}
+			bos.flush();
+			bos.close();
+
+			if (tmpFile.length() > maxSize) {
+				tmpFile.delete();
+				return new BaseState(false, AppInfo.MAX_SIZE);
+			}
+
+			state = saveTmpFile(tmpFile, path);
+
+			if (!state.isSuccess()) {
+				tmpFile.delete();
+			}
+
+			return state;
+			
+		} catch (IOException e) {
+		}
+		return new BaseState(false, AppInfo.IO_ERROR);
+	}
+
+	public static State saveFileByInputStream(InputStream is, String path) {
+		State state = null;
+
+		File tmpFile = getTmpFile();
+
+		byte[] dataBuf = new byte[ 2048 ];
+		BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE);
+
+		try {
+			BufferedOutputStream bos = new BufferedOutputStream(
+					new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE);
+
+			int count = 0;
+			while ((count = bis.read(dataBuf)) != -1) {
+				bos.write(dataBuf, 0, count);
+			}
+			bos.flush();
+			bos.close();
+
+			state = saveTmpFile(tmpFile, path);
+
+			if (!state.isSuccess()) {
+				tmpFile.delete();
+			}
+
+			return state;
+		} catch (IOException e) {
+		}
+		return new BaseState(false, AppInfo.IO_ERROR);
+	}
+
+	private static File getTmpFile() {
+		File tmpDir = FileUtils.getTempDirectory();
+		String tmpFileName = (Math.random() * 10000 + "").replace(".", "");
+		return new File(tmpDir, tmpFileName);
+	}
+
+	private static State saveTmpFile(File tmpFile, String path) {
+		State state = null;
+		File targetFile = new File(path);
+
+		if (targetFile.canWrite()) {
+			return new BaseState(false, AppInfo.PERMISSION_DENIED);
+		}
+		try {
+			FileUtils.moveFile(tmpFile, targetFile);
+		} catch (IOException e) {
+			return new BaseState(false, AppInfo.IO_ERROR);
+		}
+
+		state = new BaseState(true);
+		state.putInfo( "size", targetFile.length() );
+		state.putInfo( "title", targetFile.getName() );
+		
+		return state;
+	}
+
+	private static State valid(File file) {
+		File parentPath = file.getParentFile();
+
+		if ((!parentPath.exists()) && (!parentPath.mkdirs())) {
+			return new BaseState(false, AppInfo.FAILED_CREATE_FILE);
+		}
+
+		if (!parentPath.canWrite()) {
+			return new BaseState(false, AppInfo.PERMISSION_DENIED);
+		}
+
+		return new BaseState(true);
+	}
+}

+ 32 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/com/baidu/ueditor/upload/Uploader.java

@@ -0,0 +1,32 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.define.State;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+public class Uploader {
+	public static String downloadApi = null;
+
+	private HttpServletRequest request = null;
+	private Map<String, Object> conf = null;
+
+	public Uploader(HttpServletRequest request, Map<String, Object> conf) {
+		this.request = request;
+		this.conf = conf;
+	}
+
+	public final State doExec() {
+		String filedName = (String) this.conf.get("fieldName");
+		State state = null;
+
+		if ("true".equals(this.conf.get("isBase64"))) {
+			state = Base64Uploader.save(this.request.getParameter(filedName),
+					this.conf);
+		} else {
+			state = BinaryUploader.save(this.request, this.conf);
+		}
+
+		return state;
+	}
+}

+ 13 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/org/hswebframework/web/thirdpart/ueditor/UeditorAutoConfiguration.java

@@ -0,0 +1,13 @@
+package org.hswebframework.web.thirdpart.ueditor;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class UeditorAutoConfiguration {
+
+    @Bean
+    public UeditorController ueditorController(){
+        return new UeditorController();
+    }
+}

+ 86 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/java/org/hswebframework/web/thirdpart/ueditor/UeditorController.java

@@ -0,0 +1,86 @@
+package org.hswebframework.web.thirdpart.ueditor;
+
+import com.baidu.ueditor.ActionEnter;
+import com.baidu.ueditor.Context;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.FileType;
+import com.baidu.ueditor.define.State;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.hswebframework.web.service.file.FileInfoService;
+import org.hswebframework.web.service.file.FileService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * ueditor 服务端实现
+ *
+ * @see FileService
+ * @since 2.0
+ */
+@RestController
+@RequestMapping("/ueditor")
+@Api(tags = "第三方-ueditor", value = "ueditor")
+public class UeditorController {
+
+    @Resource
+    private FileService fileService;
+
+    @Resource
+    private FileInfoService resourcesService;
+
+    @Value("${ueditor.rootPath:/}")
+    private String rootPath = "";
+
+    @PostConstruct
+    public void init() {
+        Context.FILE_SERVICE = fileService;
+        Context.RESOURCES_SERVICE = resourcesService;
+    }
+
+    private String getDownloadPath(HttpServletRequest request) {
+        return rootPath;
+//        String contextPath = request.getContextPath();
+//
+//        return (StringUtils.hasText(contextPath) || contextPath.equals("/") ? "/" : (contextPath.startsWith("/") ? contextPath : "/" + contextPath) + "/");
+    }
+
+    /**
+     * ueditor上传文件
+     *
+     * @return 上传结果
+     * @throws IOException 文件上传错误
+     */
+    @RequestMapping(method = RequestMethod.POST, consumes = "multipart/form-data")
+    @ApiOperation("上传文件")
+    public String upload(@RequestParam(value = "upfile", required = false) MultipartFile file) throws IOException {
+        String fileName = file.getOriginalFilename();
+        String suffix = FileType.getSuffixByFilename(fileName);
+
+        String path = fileService.saveStaticFile(file.getInputStream(), System.currentTimeMillis() + suffix);
+        State state = new BaseState(true);
+        state.putInfo("size", 0);
+        state.putInfo("title", file.getOriginalFilename());
+        state.putInfo("url", path);
+        state.putInfo("type", suffix);
+        state.putInfo("original", file.getOriginalFilename());
+        return state.toJSONString();
+    }
+
+    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})
+    @ApiOperation("初始化配置")
+    public String run(HttpServletRequest request) throws Exception {
+        return new ActionEnter(request, getDownloadPath(request)).exec();
+    }
+
+}

+ 10 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/resources/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,10 @@
+{
+  "properties": [
+    {
+      "name": "ueditor.rootPath",
+      "type": "java.lang.String",
+      "defaultValue": "/",
+      "description": "ueditor访问的根路径,例如:/ , http://file_server/."
+    }
+  ]
+}

+ 3 - 0
hsweb-thirdparty/hsweb-thirdparty-ueditor/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,3 @@
+# Auto Configure
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.hswebframework.web.thirdpart.ueditor.UeditorAutoConfiguration

+ 19 - 0
hsweb-thirdparty/pom.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-framework</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-thirdparty</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>hsweb-thirdparty-ueditor</module>
+    </modules>
+
+
+</project>