webwork中richtexteditor标签图片上传配置和创建中文多级目录乱码问题解决

1.webwork中的rechtexteditor图片上传时在使用过程中可能会出现如下问题:
 Error on file upload.Error number:203
 Invalid file
 XML request error:Not Found(404)
同时在创建中文多级目录时候,文件目录为乱码,上传含中文名称图片为乱码,
需要对webwork源码进行修改配置来解决上述出现的问题。

2.\webwork-2.2.4-sources\com\opensymphony\webwork\static\richtexteditor\拷贝到工程的\webapp\webwork\richtexteditor\目录下面(如果\webwork\richtexteditor\目录不存在,手动建立),同时在webapp目录下面手动建立\upload\Image\文件夹,用来保存上传的图片
主要对\webwork-2.2.4-sources\~\static\richtexteditor\editor\filemanager\browser\default\下面源文件修改,
目标:上传图片名称里面含中文避免乱码
位置:\webapp\webwork\richtexteditor\editor\filemanager\browser\default\frmupload.html
添加代码:<meta http-equiv="content-type" content="text/html; charset=UTF-8">
 
目标:创建目录名称里面含中文避免乱码
位置:\webapp\webwork\richtexteditor\editor\filemanager\browser\default\frmcreatefolder.html
代码:oConnector.SendCommand( 'CreateFolder', 'NewFolderName=' + escape( sFolderName) , CreateFolderCallBack ) ;
换成:oConnector.SendCommand( 'CreateFolder', 'NewFolderName=' +  sFolderName , CreateFolderCallBack ) ;

位置:\webapp\webwork\richtexteditor\editor\filemanager\browser\default\browser.html
代码:
oConnector.SendCommand = function( command, params, callBackFunction )
{
 var sUrl = this.ConnectorUrl + 'Command=' + command ;
 sUrl += '&Type=' + this.ResourceType ;
 sUrl += '&CurrentFolder=' + escape( this.CurrentFolder ) ;
 
 if ( params ) sUrl += '&' + params ;

 var oXML = new FCKXml() ;
 
 if ( callBackFunction )
  oXML.LoadUrl( sUrl, callBackFunction ) ; // Asynchronous load.
 else
  return oXML.LoadUrl( sUrl ) ;
}
换成:
oConnector.SendCommand = function( command, params, callBackFunction )
{
 var sUrl = this.ConnectorUrl + 'Command=' + command ;
 sUrl += '&Type=' + this.ResourceType ;
 sUrl += '&CurrentFolder=' +  this.CurrentFolder  ;
 
 if ( params ) sUrl += '&' + params ;

 var oXML = new FCKXml() ;
 
 if ( callBackFunction )
  oXML.LoadUrl( sUrl, callBackFunction ) ; // Asynchronous load.
 else
  return oXML.LoadUrl( sUrl ) ;
}

3.修改webwork.properties文件,使用当前的端口和\webapp\webwork\文件夹

### used to build URLs, such as the UrlTag
webwork.url.http.port = 8081

###false not to read webwork.jar.but to read the webwork folder under ther website
webwork.serve.static=false

 

4.在src目录下面建立4个java文件,如:

org.RichtexteditorConnector,

org.RichtexteditorCreateFolderResultLocal,

org.RichtexteditorGetFoldersAndFilesResultLocal,

org.RichtexteditorGetFoldersResultLocal
代码(org.RichtexteditorConnector):

/**
 * @author hjl
 * @date 2009-4-17
 * @function 
 * @version 
 */
public class RichtexteditorConnector extends DefaultRichtexteditorConnector {

	private static final long serialVersionUID = 1L;

	protected String calculateActualServerPath(String actualServerPath,
			String type, String folderPath) throws Exception {//解决不能创建目录问题
		String path = StringUtils
				.replaceChars("file:///"
						+ servletContext.getRealPath("/" + actualServerPath),
						'\\', '/');
		makeDirIfNotExists(path);
		path = path.endsWith("/") ? path : path + "/";
		return path + type + folderPath;
	}

	/**
	 * 创建中文目录时转码
	 */
	@Override
	protected CreateFolderResult createFolder(String virtualFolderPath, String type, String newFolderName) {
		try {
			String tmpPath = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
			tmpPath = tmpPath+newFolderName;
			//dir 中文
			tmpPath = new String(tmpPath.getBytes("ISO-8859-1"),"gbk");
//			System.out.println("tmpPath:"+tmpPath);
			boolean alreadyExists = makeDirIfNotExists(tmpPath);
			if (alreadyExists) {
				return CreateFolderResult.folderAlreadyExists();
			}
		} catch(Exception e) {
			return CreateFolderResult.unknownError();
		}
		return CreateFolderResult.noErrors();
	}

	/**
	 * 中文文件夹显示转码
	 */
	@Override
	protected FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, String type) throws Exception {
		String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
		//dir 中文
		path = new String(path.getBytes("ISO-8859-1"),"gbk");
		makeDirIfNotExists(path);
		java.io.File f = new java.io.File(new URI(path));
		java.io.File[] children = f.listFiles();
		
		List directories = new ArrayList();
		List files = new ArrayList();
		for (int a=0; a< children.length; a++) {
			if (children[a].isDirectory()) {
				directories.add(new Folder(children[a].getName()));
			}
			else {
				try {
					files.add(new File(children[a].getName(), fileSizeInKBytes(children[a])));
				}
				catch(Exception e) {
					e.printStackTrace();
				}
			}
		}
		return new FoldersAndFiles(
				(Folder[]) directories.toArray(new Folder[0]), 
				(File[]) files.toArray(new File[0])
		);
	}
	
	@Override
	protected Folder[] getFolders(String virtualFolderPath, String type) throws Exception {
		String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
		//dir 中文
		path = new String(path.getBytes("ISO-8859-1"),"gbk");
		makeDirIfNotExists(path);
		java.io.File f = new java.io.File(new URI(path));
		java.io.File[] children = f.listFiles(new FileFilter() {
			public boolean accept(java.io.File pathname) {
				if (! pathname.isFile()) {
					return true;
				}
				return false;
			}
		});
		
		List tmpFolders = new ArrayList();
		for (int a=0; a< children.length; a++) {
			tmpFolders.add(new Folder(children[a].getName()));
		}
		
		return (Folder[]) tmpFolders.toArray(new Folder[0]);
	}

	@Override
	protected FileUploadResult fileUpload(String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
		try {
			virtualFolderPath = new String(virtualFolderPath.getBytes("ISO-8859-1"),"UTF-8");
			String tmpDir = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
			makeDirIfNotExists(tmpDir);
			String tmpFile = tmpDir + filename;
			if(makeFileIfNotExists(tmpFile)) {
				// already exists
				int a=0;
				String ext = String.valueOf(a);
				tmpFile = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath)+filename+ext;
				while(makeFileIfNotExists(tmpFile)) {
					a = a + 1;
					ext = String.valueOf(a);
					if (a > 100) {
						return FileUploadResult.invalidFile();
					}
				}
				copyFile(newFile, new java.io.File(new URI(tmpFile)));
				return FileUploadResult.uploadCompleteWithFilenamChanged(filename+ext);
			}
			else {
				copyFile(newFile, new java.io.File(new URI(tmpFile)));
				return FileUploadResult.uploadComplete();
			}
		}
		catch(Exception e) {
			return FileUploadResult.invalidFile();
		}
	}
	private ServletContext servletContext;

	public void setServletContext(ServletContext servletContext) {
		this.servletContext = servletContext;
	}
}

 
代码(org.RichtexteditorCreateFolderResultLocal):

/**
 * @author hjl
 * @date 2009-4-20
 * @function 
 * @version 
 */
public class RichtexteditorCreateFolderResultLocal
		extends
			RichtexteditorCreateFolderResult {

	@Override
	public void execute(ActionInvocation invocation) throws Exception {
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("text/xml; charset=UTF-8");
		response.setHeader("Cache-Control","no-cache");
		
		OutputStream os = response.getOutputStream();
		
		CreateFolderResult createFolderResult = richtexteditorCreateFolderResult(invocation);
		
//		CurrentFolder问题,转换为中文
		String currentFolder_path = getFolderPath(invocation);
		currentFolder_path = new String(currentFolder_path.getBytes("ISO-8859-1"),"GBK");
		
		String currentFolder_url = getServerPath(invocation);
		currentFolder_url = new String(currentFolder_url.getBytes("ISO-8859-1"),"GBK");
		
		Document document = buildDocument();
		Element root = buildCommonResponseXml(document, 
				getCommand(invocation), getType(invocation), 
				currentFolder_path, currentFolder_url);
		
		Element errorElement = document.createElement("Error");
		errorElement.setAttribute("number", createFolderResult.getCode());
		root.appendChild(errorElement);
		
//		if (_log.isDebugEnabled()) {
//			String result = stringFromDocument(document);
//			_log.debug(result);
//		}
		
		writeDocumentToStream(document, os);
		os.flush();
		os.close();
	}
	

}

 

代码(org.RichtexteditorGetFoldersAndFilesResultLocal):

/**
 * @author hjl
 * @date 2009-4-20
 * @function 
 * @version 
 */
public class RichtexteditorGetFoldersAndFilesResultLocal
		extends
			RichtexteditorGetFoldersAndFilesResult {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public void execute(ActionInvocation invocation) throws Exception {
//		System.out.println("====本地====");
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("text/xml; charset=UTF-8");
		response.setHeader("Cache-Control","no-cache");
		
		OutputStream os = response.getOutputStream();
		
		Document document = buildDocument();
		
		//CurrentFolder问题,转换为中文
		String currentFolder_path = getFolderPath(invocation);
		currentFolder_path = new String(currentFolder_path.getBytes("ISO-8859-1"),"GBK");
		
		String currentFolder_url = getServerPath(invocation);
		currentFolder_url = new String(currentFolder_url.getBytes("ISO-8859-1"),"GBK");
		
		
//		Element root = buildCommonResponseXml(document, 
//				getCommand(invocation), getType(invocation), 
//				getFolderPath(invocation), getServerPath(invocation));
		
		//buildCommonResponseXml这个方法是关键 MAIN()
		Element root = buildCommonResponseXml(document, 
				getCommand(invocation), getType(invocation), 
				currentFolder_path, currentFolder_url);
		
		FoldersAndFiles foldersAndFiles = richtexteditorFoldersAndFiles(invocation);
		
		Folder[] folders = foldersAndFiles.getFolders();
		File[] files = foldersAndFiles.getFiles();
		
		Element foldersElement = document.createElement("Folders");
		if (folders != null) {
			for (int a=0; a< folders.length; a++) {
				Element folderElement = document.createElement("Folder");
				folderElement.setAttribute("name", folders[a].getFoldername());
				foldersElement.appendChild(folderElement);
			}
		}
		root.appendChild(foldersElement);
		
		Element filesElement = document.createElement("Files");
		if (files != null) {
			for (int a=0; a< files.length; a++) {
				Element fileElement = document.createElement("File");
				fileElement.setAttribute("name", files[a].getFilename());
				fileElement.setAttribute("size", String.valueOf(files[a].getSizeInKb()));
				filesElement.appendChild(fileElement);
			}
		}
		root.appendChild(filesElement);
		
//		if (_log.isDebugEnabled()) {
//			String result = stringFromDocument(document);
//			_log.debug(result);
//		}
		
		writeDocumentToStream(document, os);
		os.flush();
		os.close();
	}
}

 
代码(org.RichtexteditorGetFoldersResultLocal):

/**
 * @author hjl
 * @date 2009-4-20
 * @function 
 * @version 
 */
public class RichtexteditorGetFoldersResultLocal
		extends
			RichtexteditorGetFoldersResult {

	@Override
	public void execute(ActionInvocation invocation) throws Exception {
		Folder[] folders = richtexteditorFolders(invocation);
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("text/xml; charset=UTF-8");
		response.setHeader("Cache-Control","no-cache");
		
		OutputStream os = response.getOutputStream();

		Document document = buildDocument();
		
//		CurrentFolder问题,转换为中文
		String currentFolder_path = getFolderPath(invocation);
		currentFolder_path = new String(currentFolder_path.getBytes("ISO-8859-1"),"GBK");
		
		String currentFolder_url = getServerPath(invocation);
		currentFolder_url = new String(currentFolder_url.getBytes("ISO-8859-1"),"GBK");
		
		Element root = buildCommonResponseXml(document, 
				getCommand(invocation), getType(invocation), 
				currentFolder_path, currentFolder_url);
		
		Element foldersElement = document.createElement("Folders");
		if (folders != null) {
			for (int a=0; a< folders.length; a++) {
				Element folderElement = document.createElement("Folder");
				folderElement.setAttribute("name", folders[a].getFoldername());
				foldersElement.appendChild(folderElement);
			}
		}
		root.appendChild(foldersElement);
		
//		if (_log.isDebugEnabled()) {
//			String result = stringFromDocument(document);
//			_log.debug(result);
//		}
		
		writeDocumentToStream(document, os);
		os.flush();
		os.close();
	}

}

 
5.在xwork.xml文件中添加如下代码:

<package name="richtexteditor-browse" extends="webwork-default" namespace="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp">
    	<result-types>
            <result-type name="richtexteditorGetFolders" class="org.RichtexteditorGetFoldersResultLocal" />    		
            <result-type name="richtexteditorGetFoldersAndFiles" class="org.RichtexteditorGetFoldersAndFilesResultLocal" />    		
            <result-type name="richtexteditorCreateFolder" class="org.RichtexteditorCreateFolderResultLocal" />    		    	
    	</result-types>
    	<action name="connector" class="org.RichtexteditorConnector" method="browse">
    		<param name="actualServerPath">
            /upload/
            </param>
            <param name="serverPath">
            /upload/
            </param>
    		<result name="getFolders" type="richtexteditorGetFolders" />
    		<result name="getFoldersAndFiles" type="richtexteditorGetFoldersAndFiles" />
    		<result name="createFolder" type="richtexteditorCreateFolder" />
    		<result name="fileUpload" type="richtexteditorFileUpload" />
    	</action>
    </package>
    
    <package name="richtexteditor-upload" extends="webwork-default" namespace="/webwork/richtexteditor/editor/filemanager/upload">
		<action name="uploader" class="org.RichtexteditorConnector" method="upload">
			<param name="actualServerPath">
            /upload/
            </param>
            <param name="serverPath">
            /upload/
            </param>
			<result name="richtexteditorFileUpload" />
		</action>    
    </package>

 
6.同时pom.xml jar必须有:

<dependencies>
    <dependency>
      <groupId>opensymphony</groupId>
      <artifactId>webwork</artifactId>
      <version>2.2.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring</artifactId>
      <version>2.0-rc2</version>
    </dependency>
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.1</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.4</version>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
  </dependencies>

 
最后在ftl页面中显示出来:

<@ww.richtexteditor 
   defaultLanguage ="zh-cn" 
   toolbarCanCollapse="false" 
   label="内容(content):" 
        height ="360" 
   name="model.content"/>

 
一步一步配置就可以将问题解决了。

你可能感兴趣的:(cache,OS,ext,Webwork,360)