大家都知道了struts2 和fckEditor结合中为了上传图片
需要把
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
换掉
/*
但是在后来使用时发现标签datetimepicker不能使用了
后来发现生成的页面中有如下代码
<link rel="stylesheet" href="/workStation/struts/xhtml/styles.css" type="text/css"/>
<script language="JavaScript" type="text/javascript">
// Dojo configuration
djConfig = {
baseRelativePath: "/workStation/struts/dojo",
isDebug: false,
bindEncoding: "gb2312",
debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes
};
</script>
<script language="JavaScript" type="text/javascript"
src="/workStation/struts/dojo/dojo.js"></script>
<script language="JavaScript" type="text/javascript"
src="/workStation/struts/simple/dojoRequire.js"></script>
所以就应加上
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
要不然会找不到相应的js和css文件,大家遇到希望有帮助(结合时不要忘了在<head>中加入 <s:head />它会自动加上上面的代码)
----------------------------------------
一 Webwork2 + FCkeditor
/Files/tunaic/webwork_test.rar
需要把
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
换掉
/*
但是在后来使用时发现标签datetimepicker不能使用了
后来发现生成的页面中有如下代码
<link rel="stylesheet" href="/workStation/struts/xhtml/styles.css" type="text/css"/>
<script language="JavaScript" type="text/javascript">
// Dojo configuration
djConfig = {
baseRelativePath: "/workStation/struts/dojo",
isDebug: false,
bindEncoding: "gb2312",
debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes
};
</script>
<script language="JavaScript" type="text/javascript"
src="/workStation/struts/dojo/dojo.js"></script>
<script language="JavaScript" type="text/javascript"
src="/workStation/struts/simple/dojoRequire.js"></script>
所以就应加上
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
要不然会找不到相应的js和css文件,大家遇到希望有帮助(结合时不要忘了在<head>中加入 <s:head />它会自动加上上面的代码)
----------------------------------------
一 Webwork2 + FCkeditor
Java代码
/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.leo.controller;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.webwork.WebWorkException;
import com.opensymphony.webwork.components.AbstractRichtexteditorConnector;
import com.opensymphony.webwork.components.DefaultRichtexteditorConnector;
import com.opensymphony.webwork.util.ServletContextAware;
import com.opensymphony.webwork.views.util.UrlHelper;
import com.opensymphony.xwork.ActionContext;
/**
*
* @author tm_jee
* @version $Date: 2007-03-29 08:02:59 +0200 (Do, 29 Mrz 2007) $ $Id: DefaultRichtexteditorConnector.java 2883 2007-03-29 06:02:59Z tm_jee $
*/
public class MyConnector extends AbstractRichtexteditorConnector implements ServletContextAware {
private static final Log _log = LogFactory.getLog(DefaultRichtexteditorConnector.class);
private static final long serialVersionUID = -3792445192115623052L;
protected String _actualServerPath = "/user_file/";
protected String _serverPath = "/user_file/";
public String getActualServerPath() { return _actualServerPath; }
public void setActualServerPath(String actualServerPath) { _actualServerPath = actualServerPath; }
protected String calculateServerPath(String serverPath, String folderPath, String type) throws Exception {
//return UrlHelper.buildUrl(serverPath, _request, _response, null, _request.getScheme(), true, true, true);
return UrlHelper.buildUrl(serverPath+type+folderPath, _request, _response, new HashMap(), _request.getScheme(), true, true, true);
}
protected String calculateActualServerPath(String actualServerPath, String type, String folderPath) throws Exception {
String path = "file:////"+servletContext.getRealPath(actualServerPath);
path = path.trim();
path = path.replace('\\', '/');
makeDirIfNotExists(path);
path = path.endsWith("/") ? path : path+"/";
return path+type+folderPath;
}
private ServletContext servletContext;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
protected Folder[] getFolders(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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]);
}
protected FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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) {
_log.error("cannot deal with file "+children[a], e);
}
}
}
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
return new FoldersAndFiles(
(Folder[]) directories.toArray(new Folder[0]),
(File[]) files.toArray(new File[0])
);
}
protected CreateFolderResult createFolder(String virtualFolderPath, String type, String newFolderName) {
try {
String tmpPath = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
tmpPath = tmpPath+newFolderName;
boolean alreadyExists = makeDirIfNotExists(tmpPath);
if (alreadyExists) {
return CreateFolderResult.folderAlreadyExists();
}
}
catch(Exception e) {
_log.error(e.toString(), e);
return CreateFolderResult.unknownError();
}
return CreateFolderResult.noErrors();
}
protected FileUploadResult fileUpload(String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
try {
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();
}
tmpFile = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath)+filename+ext;
}
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) {
_log.error(e.toString(), e);
return FileUploadResult.invalidFile();
}
}
protected void unknownCommand(String command, String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
throw new WebWorkException("unknown command "+command);
}
/**
*
* @param path
* @return true if file already exists, false otherwise.
*/
protected boolean makeDirIfNotExists(String path) throws URISyntaxException {
java.io.File dir = new java.io.File(new URI(path));
if (! dir.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("make directory "+dir);
}
boolean ok = dir.mkdirs();
if (! ok) {
throw new WebWorkException("cannot make directory "+dir);
}
return false;
}
return true;
}
/**
*
* @param filePath
* @return true if file already exists, false otherwise
*/
protected boolean makeFileIfNotExists(String filePath) throws IOException, URISyntaxException {
java.io.File f = new java.io.File(new URI(filePath));
if (! f.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("creating file "+filePath);
}
boolean ok = f.createNewFile();
if (! ok) {
throw new WebWorkException("cannot create file "+filePath);
}
return false;
}
return true;
}
protected void copyFile(java.io.File from, java.io.File to) throws FileNotFoundException, IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
if (_log.isDebugEnabled()) {
_log.debug("copy file from "+from+" to "+to);
}
fis = new FileInputStream(from);
fos = new FileOutputStream(to);
int tmpByte = fis.read();
while(tmpByte != -1) {
fos.write(tmpByte);
tmpByte = fis.read();
}
fos.flush();
}
finally {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
}
}
protected long fileSizeInKBytes(java.io.File file) throws FileNotFoundException, IOException {
FileInputStream fis = null;
long size = 0;
try {
fis = new FileInputStream(file);
size = fis.getChannel().size();
}
finally {
if (fis != null)
fis.close();
}
if (size > 0) {
size = (size / 100);
}
if (_log.isDebugEnabled()) {
_log.debug("size of file "+file+" is "+size+" kb");
}
return size;
}
public String get_serverPath() {
return _serverPath;
}
public void set_serverPath(String path) {
_serverPath = path;
}
}
/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.leo.controller;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.webwork.WebWorkException;
import com.opensymphony.webwork.components.AbstractRichtexteditorConnector;
import com.opensymphony.webwork.components.DefaultRichtexteditorConnector;
import com.opensymphony.webwork.util.ServletContextAware;
import com.opensymphony.webwork.views.util.UrlHelper;
import com.opensymphony.xwork.ActionContext;
/**
*
* @author tm_jee
* @version $Date: 2007-03-29 08:02:59 +0200 (Do, 29 Mrz 2007) $ $Id: DefaultRichtexteditorConnector.java 2883 2007-03-29 06:02:59Z tm_jee $
*/
public class MyConnector extends AbstractRichtexteditorConnector implements ServletContextAware {
private static final Log _log = LogFactory.getLog(DefaultRichtexteditorConnector.class);
private static final long serialVersionUID = -3792445192115623052L;
protected String _actualServerPath = "/user_file/";
protected String _serverPath = "/user_file/";
public String getActualServerPath() { return _actualServerPath; }
public void setActualServerPath(String actualServerPath) { _actualServerPath = actualServerPath; }
protected String calculateServerPath(String serverPath, String folderPath, String type) throws Exception {
//return UrlHelper.buildUrl(serverPath, _request, _response, null, _request.getScheme(), true, true, true);
return UrlHelper.buildUrl(serverPath+type+folderPath, _request, _response, new HashMap(), _request.getScheme(), true, true, true);
}
protected String calculateActualServerPath(String actualServerPath, String type, String folderPath) throws Exception {
String path = "file:////"+servletContext.getRealPath(actualServerPath);
path = path.trim();
path = path.replace('\\', '/');
makeDirIfNotExists(path);
path = path.endsWith("/") ? path : path+"/";
return path+type+folderPath;
}
private ServletContext servletContext;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
protected Folder[] getFolders(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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]);
}
protected FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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) {
_log.error("cannot deal with file "+children[a], e);
}
}
}
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
return new FoldersAndFiles(
(Folder[]) directories.toArray(new Folder[0]),
(File[]) files.toArray(new File[0])
);
}
protected CreateFolderResult createFolder(String virtualFolderPath, String type, String newFolderName) {
try {
String tmpPath = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
tmpPath = tmpPath+newFolderName;
boolean alreadyExists = makeDirIfNotExists(tmpPath);
if (alreadyExists) {
return CreateFolderResult.folderAlreadyExists();
}
}
catch(Exception e) {
_log.error(e.toString(), e);
return CreateFolderResult.unknownError();
}
return CreateFolderResult.noErrors();
}
protected FileUploadResult fileUpload(String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
try {
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();
}
tmpFile = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath)+filename+ext;
}
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) {
_log.error(e.toString(), e);
return FileUploadResult.invalidFile();
}
}
protected void unknownCommand(String command, String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
throw new WebWorkException("unknown command "+command);
}
/**
*
* @param path
* @return true if file already exists, false otherwise.
*/
protected boolean makeDirIfNotExists(String path) throws URISyntaxException {
java.io.File dir = new java.io.File(new URI(path));
if (! dir.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("make directory "+dir);
}
boolean ok = dir.mkdirs();
if (! ok) {
throw new WebWorkException("cannot make directory "+dir);
}
return false;
}
return true;
}
/**
*
* @param filePath
* @return true if file already exists, false otherwise
*/
protected boolean makeFileIfNotExists(String filePath) throws IOException, URISyntaxException {
java.io.File f = new java.io.File(new URI(filePath));
if (! f.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("creating file "+filePath);
}
boolean ok = f.createNewFile();
if (! ok) {
throw new WebWorkException("cannot create file "+filePath);
}
return false;
}
return true;
}
protected void copyFile(java.io.File from, java.io.File to) throws FileNotFoundException, IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
if (_log.isDebugEnabled()) {
_log.debug("copy file from "+from+" to "+to);
}
fis = new FileInputStream(from);
fos = new FileOutputStream(to);
int tmpByte = fis.read();
while(tmpByte != -1) {
fos.write(tmpByte);
tmpByte = fis.read();
}
fos.flush();
}
finally {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
}
}
protected long fileSizeInKBytes(java.io.File file) throws FileNotFoundException, IOException {
FileInputStream fis = null;
long size = 0;
try {
fis = new FileInputStream(file);
size = fis.getChannel().size();
}
finally {
if (fis != null)
fis.close();
}
if (size > 0) {
size = (size / 100);
}
if (_log.isDebugEnabled()) {
_log.debug("size of file "+file+" is "+size+" kb");
}
return size;
}
public String get_serverPath() {
return _serverPath;
}
public void set_serverPath(String path) {
_serverPath = path;
}
}
注意以下变量部分:
1.在MyConnector.java第42行的变量_actualServerPath 默认为值:/WEB-INF/classes/com/opensymphony/webwork/static/richtexteditor/data/,从源码com.opensymphony.webwork.components.DefaultRichtexteditorConnector.java的第38行
Java代码
protected String _actualServerPath = "/com/opensymphony/webwork/static/richtexteditor/data/";
protected String _actualServerPath = "/com/opensymphony/webwork/static/richtexteditor/data/";以及第51行
Java代码
String path = "file:////"+servletContext.getRealPath("/WEB-INF/classes"+actualServerPath);
String path = "file:////"+servletContext.getRealPath("/WEB-INF/classes"+actualServerPath);
可以得出。
因此,我这里改成/user_file文件夹作为文件上传路径,你可以自由选择。
2.在MyConnector.java第43行的变量_serverPath 表示的是上传完附件后,选择的路径,默认为: /webwork/richtexteditor/data/。从源码com.opensymphony.webwork.components.AbstractRichtexteditorConnector.java的第73行:
Java代码
protected String _serverPath = "/webwork/richtexteditor/data/";
protected String _serverPath = "/webwork/richtexteditor/data/"; 可以看到。但FCKEditor使用时,会变成:http://IP地址/项目/webwork/richtexteditor/data/. 记住,这里不会带端口号的,这也是唯一美中不足的地方,如果要修改,可能要改动很大了。
因此,我这里改成也/user_file文件夹,为了可以在上传成功后,FCKEditor能够选择上传成功的文件。
最后来到MyConnector.java 的第112行:
Java代码
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
这里我详细说一下:MyConnector.java 继承自 AbstractRichtexteditorConnector.java,在AbstractRichtexteditorConnector.java源码146行左右有这么一段:
Java代码
else if ("CreateFolder".equals(getCommand())) {
_log.debug("Command "+getCommand()+" detected \n\t type="+getType()+"\n\t folderPath="+getCurrentFolder()+"\n\t newFolderName="+getNewFolderName());
ActionContext.getContext().put("__richtexteditorCommand", getCommand());
ActionContext.getContext().put("__richtexteditorType", getType());
ActionContext.getContext().put("__richtexteditorFolderPath", getCurrentFolder());
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(getServerPath(), getCurrentFolder(), getType()));
CreateFolderResult createFolderResult = createFolder(getCurrentFolder(), getType(), getNewFolderName());
ActionContext.getContext().put("__richtexteditorCreateFolder", createFolderResult);
return CREATE_FOLDER;
}
else if ("CreateFolder".equals(getCommand())) {
_log.debug("Command "+getCommand()+" detected \n\t type="+getType()+"\n\t folderPath="+getCurrentFolder()+"\n\t newFolderName="+getNewFolderName());
ActionContext.getContext().put("__richtexteditorCommand", getCommand());
ActionContext.getContext().put("__richtexteditorType", getType());
ActionContext.getContext().put("__richtexteditorFolderPath", getCurrentFolder());
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(getServerPath(), getCurrentFolder(), getType()));
CreateFolderResult createFolderResult = createFolder(getCurrentFolder(), getType(), getNewFolderName());
ActionContext.getContext().put("__richtexteditorCreateFolder", createFolderResult);
return CREATE_FOLDER;
}
在这段代码的第7行,计算出的路径永远是父类里默认的 /webwork/richtexteditor/data/, 所以在它的子类MyConnector.java,我们重新赋值了一下: Java代码
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
这样,就能保证我们刚才定义的 user_file文件夹生效,文件通过FCKEditor上传完后,通过服务器端浏览,可以看到我们上传的图片,然后点确定就可以了。不过,如果你不是默认的80端口,那么可能要手动改一改,真是有点遗憾。最后一步,也是最重要的一步,配置我们刚才写的MyConnector.java
Xml代码
< package name ="richtexteditor-upload" extends ="webwork-default"
namespace ="/webwork/richtexteditor/editor/filemanager/upload" >
< action name ="uploader" class ="com.leo.controller.MyConnector"
method ="upload" >
< result name ="richtexteditorFileUpload" />
</ action >
</ package >
< package name ="richtexteditor-browse" extends ="webwork-default"
namespace ="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp" >
< action name ="connector" class ="com.leo.controller.MyConnector"
method ="browse" >
< 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 ="com.leo.controller.MyConnector"
method ="upload" >
< result name ="richtexteditorFileUpload" />
</ action >
</ package >
< package name ="richtexteditor-browse" extends ="webwork-default"
namespace ="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp" >
< action name ="connector" class ="com.leo.controller.MyConnector"
method ="browse" >
< result name ="getFolders" type ="richtexteditorGetFolders" />
< result name ="getFoldersAndFiles"
type ="richtexteditorGetFoldersAndFiles" />
< result name ="createFolder"
type ="richtexteditorCreateFolder" />
< result name ="fileUpload" type ="richtexteditorFileUpload" />
</ action >
</ package >
一切完成,直接在JSP里调用即可:Html代码
< ww:richtexteditor toolbarCanCollapse ="true" width ="700" label =""
name ="txt" value ="可以正常上传了。" />
< ww:richtexteditor toolbarCanCollapse ="true" width ="700" label =""
name ="txt" value ="可以正常上传了。" />
二 Struts2 + Dojo
Struts2部分更简单了。虽然Struts2不直接支持FCKeditor,但直接Dojo,而且个人更喜欢这种简洁的风格,我用的是Struts2.0.11版本进行测试,使用时,只要配置两个地方
1. 在HTML < head /> 标签之间,加上
Html代码
< s:head theme ="ajax" />
< s:head theme ="ajax" />
2. 将textarea加上主题 Html代码
< s:textarea theme ="ajax" />
< s:textarea theme ="ajax" />
就这么简单。
/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.leo.controller;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.webwork.WebWorkException;
import com.opensymphony.webwork.components.AbstractRichtexteditorConnector;
import com.opensymphony.webwork.components.DefaultRichtexteditorConnector;
import com.opensymphony.webwork.util.ServletContextAware;
import com.opensymphony.webwork.views.util.UrlHelper;
import com.opensymphony.xwork.ActionContext;
/**
*
* @author tm_jee
* @version $Date: 2007-03-29 08:02:59 +0200 (Do, 29 Mrz 2007) $ $Id: DefaultRichtexteditorConnector.java 2883 2007-03-29 06:02:59Z tm_jee $
*/
public class MyConnector extends AbstractRichtexteditorConnector implements ServletContextAware {
private static final Log _log = LogFactory.getLog(DefaultRichtexteditorConnector.class);
private static final long serialVersionUID = -3792445192115623052L;
protected String _actualServerPath = "/user_file/";
protected String _serverPath = "/user_file/";
public String getActualServerPath() { return _actualServerPath; }
public void setActualServerPath(String actualServerPath) { _actualServerPath = actualServerPath; }
protected String calculateServerPath(String serverPath, String folderPath, String type) throws Exception {
//return UrlHelper.buildUrl(serverPath, _request, _response, null, _request.getScheme(), true, true, true);
return UrlHelper.buildUrl(serverPath+type+folderPath, _request, _response, new HashMap(), _request.getScheme(), true, true, true);
}
protected String calculateActualServerPath(String actualServerPath, String type, String folderPath) throws Exception {
String path = "file:////"+servletContext.getRealPath(actualServerPath);
path = path.trim();
path = path.replace('\\', '/');
makeDirIfNotExists(path);
path = path.endsWith("/") ? path : path+"/";
return path+type+folderPath;
}
private ServletContext servletContext;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
protected Folder[] getFolders(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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]);
}
protected FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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) {
_log.error("cannot deal with file "+children[a], e);
}
}
}
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
return new FoldersAndFiles(
(Folder[]) directories.toArray(new Folder[0]),
(File[]) files.toArray(new File[0])
);
}
protected CreateFolderResult createFolder(String virtualFolderPath, String type, String newFolderName) {
try {
String tmpPath = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
tmpPath = tmpPath+newFolderName;
boolean alreadyExists = makeDirIfNotExists(tmpPath);
if (alreadyExists) {
return CreateFolderResult.folderAlreadyExists();
}
}
catch(Exception e) {
_log.error(e.toString(), e);
return CreateFolderResult.unknownError();
}
return CreateFolderResult.noErrors();
}
protected FileUploadResult fileUpload(String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
try {
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();
}
tmpFile = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath)+filename+ext;
}
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) {
_log.error(e.toString(), e);
return FileUploadResult.invalidFile();
}
}
protected void unknownCommand(String command, String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
throw new WebWorkException("unknown command "+command);
}
/**
*
* @param path
* @return true if file already exists, false otherwise.
*/
protected boolean makeDirIfNotExists(String path) throws URISyntaxException {
java.io.File dir = new java.io.File(new URI(path));
if (! dir.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("make directory "+dir);
}
boolean ok = dir.mkdirs();
if (! ok) {
throw new WebWorkException("cannot make directory "+dir);
}
return false;
}
return true;
}
/**
*
* @param filePath
* @return true if file already exists, false otherwise
*/
protected boolean makeFileIfNotExists(String filePath) throws IOException, URISyntaxException {
java.io.File f = new java.io.File(new URI(filePath));
if (! f.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("creating file "+filePath);
}
boolean ok = f.createNewFile();
if (! ok) {
throw new WebWorkException("cannot create file "+filePath);
}
return false;
}
return true;
}
protected void copyFile(java.io.File from, java.io.File to) throws FileNotFoundException, IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
if (_log.isDebugEnabled()) {
_log.debug("copy file from "+from+" to "+to);
}
fis = new FileInputStream(from);
fos = new FileOutputStream(to);
int tmpByte = fis.read();
while(tmpByte != -1) {
fos.write(tmpByte);
tmpByte = fis.read();
}
fos.flush();
}
finally {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
}
}
protected long fileSizeInKBytes(java.io.File file) throws FileNotFoundException, IOException {
FileInputStream fis = null;
long size = 0;
try {
fis = new FileInputStream(file);
size = fis.getChannel().size();
}
finally {
if (fis != null)
fis.close();
}
if (size > 0) {
size = (size / 100);
}
if (_log.isDebugEnabled()) {
_log.debug("size of file "+file+" is "+size+" kb");
}
return size;
}
public String get_serverPath() {
return _serverPath;
}
public void set_serverPath(String path) {
_serverPath = path;
}
}
/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.leo.controller;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.webwork.WebWorkException;
import com.opensymphony.webwork.components.AbstractRichtexteditorConnector;
import com.opensymphony.webwork.components.DefaultRichtexteditorConnector;
import com.opensymphony.webwork.util.ServletContextAware;
import com.opensymphony.webwork.views.util.UrlHelper;
import com.opensymphony.xwork.ActionContext;
/**
*
* @author tm_jee
* @version $Date: 2007-03-29 08:02:59 +0200 (Do, 29 Mrz 2007) $ $Id: DefaultRichtexteditorConnector.java 2883 2007-03-29 06:02:59Z tm_jee $
*/
public class MyConnector extends AbstractRichtexteditorConnector implements ServletContextAware {
private static final Log _log = LogFactory.getLog(DefaultRichtexteditorConnector.class);
private static final long serialVersionUID = -3792445192115623052L;
protected String _actualServerPath = "/user_file/";
protected String _serverPath = "/user_file/";
public String getActualServerPath() { return _actualServerPath; }
public void setActualServerPath(String actualServerPath) { _actualServerPath = actualServerPath; }
protected String calculateServerPath(String serverPath, String folderPath, String type) throws Exception {
//return UrlHelper.buildUrl(serverPath, _request, _response, null, _request.getScheme(), true, true, true);
return UrlHelper.buildUrl(serverPath+type+folderPath, _request, _response, new HashMap(), _request.getScheme(), true, true, true);
}
protected String calculateActualServerPath(String actualServerPath, String type, String folderPath) throws Exception {
String path = "file:////"+servletContext.getRealPath(actualServerPath);
path = path.trim();
path = path.replace('\\', '/');
makeDirIfNotExists(path);
path = path.endsWith("/") ? path : path+"/";
return path+type+folderPath;
}
private ServletContext servletContext;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
protected Folder[] getFolders(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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]);
}
protected FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, String type) throws Exception {
String path = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
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) {
_log.error("cannot deal with file "+children[a], e);
}
}
}
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
return new FoldersAndFiles(
(Folder[]) directories.toArray(new Folder[0]),
(File[]) files.toArray(new File[0])
);
}
protected CreateFolderResult createFolder(String virtualFolderPath, String type, String newFolderName) {
try {
String tmpPath = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath);
tmpPath = tmpPath+newFolderName;
boolean alreadyExists = makeDirIfNotExists(tmpPath);
if (alreadyExists) {
return CreateFolderResult.folderAlreadyExists();
}
}
catch(Exception e) {
_log.error(e.toString(), e);
return CreateFolderResult.unknownError();
}
return CreateFolderResult.noErrors();
}
protected FileUploadResult fileUpload(String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
try {
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();
}
tmpFile = calculateActualServerPath(getActualServerPath(), type, virtualFolderPath)+filename+ext;
}
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) {
_log.error(e.toString(), e);
return FileUploadResult.invalidFile();
}
}
protected void unknownCommand(String command, String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) {
throw new WebWorkException("unknown command "+command);
}
/**
*
* @param path
* @return true if file already exists, false otherwise.
*/
protected boolean makeDirIfNotExists(String path) throws URISyntaxException {
java.io.File dir = new java.io.File(new URI(path));
if (! dir.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("make directory "+dir);
}
boolean ok = dir.mkdirs();
if (! ok) {
throw new WebWorkException("cannot make directory "+dir);
}
return false;
}
return true;
}
/**
*
* @param filePath
* @return true if file already exists, false otherwise
*/
protected boolean makeFileIfNotExists(String filePath) throws IOException, URISyntaxException {
java.io.File f = new java.io.File(new URI(filePath));
if (! f.exists()) {
if (_log.isDebugEnabled()) {
_log.debug("creating file "+filePath);
}
boolean ok = f.createNewFile();
if (! ok) {
throw new WebWorkException("cannot create file "+filePath);
}
return false;
}
return true;
}
protected void copyFile(java.io.File from, java.io.File to) throws FileNotFoundException, IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
if (_log.isDebugEnabled()) {
_log.debug("copy file from "+from+" to "+to);
}
fis = new FileInputStream(from);
fos = new FileOutputStream(to);
int tmpByte = fis.read();
while(tmpByte != -1) {
fos.write(tmpByte);
tmpByte = fis.read();
}
fos.flush();
}
finally {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
}
}
protected long fileSizeInKBytes(java.io.File file) throws FileNotFoundException, IOException {
FileInputStream fis = null;
long size = 0;
try {
fis = new FileInputStream(file);
size = fis.getChannel().size();
}
finally {
if (fis != null)
fis.close();
}
if (size > 0) {
size = (size / 100);
}
if (_log.isDebugEnabled()) {
_log.debug("size of file "+file+" is "+size+" kb");
}
return size;
}
public String get_serverPath() {
return _serverPath;
}
public void set_serverPath(String path) {
_serverPath = path;
}
}
注意以下变量部分:
1.在MyConnector.java第42行的变量_actualServerPath 默认为值:/WEB-INF/classes/com/opensymphony/webwork/static/richtexteditor/data/,从源码com.opensymphony.webwork.components.DefaultRichtexteditorConnector.java的第38行
Java代码
protected String _actualServerPath = "/com/opensymphony/webwork/static/richtexteditor/data/";
protected String _actualServerPath = "/com/opensymphony/webwork/static/richtexteditor/data/";以及第51行
Java代码
String path = "file:////"+servletContext.getRealPath("/WEB-INF/classes"+actualServerPath);
String path = "file:////"+servletContext.getRealPath("/WEB-INF/classes"+actualServerPath);
可以得出。
因此,我这里改成/user_file文件夹作为文件上传路径,你可以自由选择。
2.在MyConnector.java第43行的变量_serverPath 表示的是上传完附件后,选择的路径,默认为: /webwork/richtexteditor/data/。从源码com.opensymphony.webwork.components.AbstractRichtexteditorConnector.java的第73行:
Java代码
protected String _serverPath = "/webwork/richtexteditor/data/";
protected String _serverPath = "/webwork/richtexteditor/data/"; 可以看到。但FCKEditor使用时,会变成:http://IP地址/项目/webwork/richtexteditor/data/. 记住,这里不会带端口号的,这也是唯一美中不足的地方,如果要修改,可能要改动很大了。
因此,我这里改成也/user_file文件夹,为了可以在上传成功后,FCKEditor能够选择上传成功的文件。
最后来到MyConnector.java 的第112行:
Java代码
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
这里我详细说一下:MyConnector.java 继承自 AbstractRichtexteditorConnector.java,在AbstractRichtexteditorConnector.java源码146行左右有这么一段:
Java代码
else if ("CreateFolder".equals(getCommand())) {
_log.debug("Command "+getCommand()+" detected \n\t type="+getType()+"\n\t folderPath="+getCurrentFolder()+"\n\t newFolderName="+getNewFolderName());
ActionContext.getContext().put("__richtexteditorCommand", getCommand());
ActionContext.getContext().put("__richtexteditorType", getType());
ActionContext.getContext().put("__richtexteditorFolderPath", getCurrentFolder());
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(getServerPath(), getCurrentFolder(), getType()));
CreateFolderResult createFolderResult = createFolder(getCurrentFolder(), getType(), getNewFolderName());
ActionContext.getContext().put("__richtexteditorCreateFolder", createFolderResult);
return CREATE_FOLDER;
}
else if ("CreateFolder".equals(getCommand())) {
_log.debug("Command "+getCommand()+" detected \n\t type="+getType()+"\n\t folderPath="+getCurrentFolder()+"\n\t newFolderName="+getNewFolderName());
ActionContext.getContext().put("__richtexteditorCommand", getCommand());
ActionContext.getContext().put("__richtexteditorType", getType());
ActionContext.getContext().put("__richtexteditorFolderPath", getCurrentFolder());
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(getServerPath(), getCurrentFolder(), getType()));
CreateFolderResult createFolderResult = createFolder(getCurrentFolder(), getType(), getNewFolderName());
ActionContext.getContext().put("__richtexteditorCreateFolder", createFolderResult);
return CREATE_FOLDER;
}
在这段代码的第7行,计算出的路径永远是父类里默认的 /webwork/richtexteditor/data/, 所以在它的子类MyConnector.java,我们重新赋值了一下: Java代码
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
// TODO 非常重要的一句话,这样才能使用自定义的路径。
ActionContext.getContext().put("__richtexteditorServerPath", calculateServerPath(get_serverPath(), getCurrentFolder(), getType()));
这样,就能保证我们刚才定义的 user_file文件夹生效,文件通过FCKEditor上传完后,通过服务器端浏览,可以看到我们上传的图片,然后点确定就可以了。不过,如果你不是默认的80端口,那么可能要手动改一改,真是有点遗憾。最后一步,也是最重要的一步,配置我们刚才写的MyConnector.java
Xml代码
< package name ="richtexteditor-upload" extends ="webwork-default"
namespace ="/webwork/richtexteditor/editor/filemanager/upload" >
< action name ="uploader" class ="com.leo.controller.MyConnector"
method ="upload" >
< result name ="richtexteditorFileUpload" />
</ action >
</ package >
< package name ="richtexteditor-browse" extends ="webwork-default"
namespace ="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp" >
< action name ="connector" class ="com.leo.controller.MyConnector"
method ="browse" >
< 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 ="com.leo.controller.MyConnector"
method ="upload" >
< result name ="richtexteditorFileUpload" />
</ action >
</ package >
< package name ="richtexteditor-browse" extends ="webwork-default"
namespace ="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp" >
< action name ="connector" class ="com.leo.controller.MyConnector"
method ="browse" >
< result name ="getFolders" type ="richtexteditorGetFolders" />
< result name ="getFoldersAndFiles"
type ="richtexteditorGetFoldersAndFiles" />
< result name ="createFolder"
type ="richtexteditorCreateFolder" />
< result name ="fileUpload" type ="richtexteditorFileUpload" />
</ action >
</ package >
一切完成,直接在JSP里调用即可:Html代码
< ww:richtexteditor toolbarCanCollapse ="true" width ="700" label =""
name ="txt" value ="可以正常上传了。" />
< ww:richtexteditor toolbarCanCollapse ="true" width ="700" label =""
name ="txt" value ="可以正常上传了。" />
二 Struts2 + Dojo
Struts2部分更简单了。虽然Struts2不直接支持FCKeditor,但直接Dojo,而且个人更喜欢这种简洁的风格,我用的是Struts2.0.11版本进行测试,使用时,只要配置两个地方
1. 在HTML < head /> 标签之间,加上
Html代码
< s:head theme ="ajax" />
< s:head theme ="ajax" />
2. 将textarea加上主题 Html代码
< s:textarea theme ="ajax" />
< s:textarea theme ="ajax" />
就这么简单。
/Files/tunaic/webwork_test.rar