啥也不说了,亮代码。
RemoteUploadServlet.java 远程文件url处理。
package com.ccr.web.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.fckeditor.connector.Messages;
import net.fckeditor.handlers.ConnectorHandler;
import net.fckeditor.handlers.ExtensionsHandler;
import net.fckeditor.handlers.RequestCycleHandler;
import net.fckeditor.handlers.ResourceTypeHandler;
import net.fckeditor.response.UploadResponse;
import net.fckeditor.tool.Utils;
import net.fckeditor.tool.UtilsFile;
import net.fckeditor.tool.UtilsResponse;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ccr.tools.RemoteFile;
public class RemoteUploadServlet extends HttpServlet {
private static final long serialVersionUID = -648261400947668425L;
private static final Logger logger = LoggerFactory
.getLogger(RemoteUploadServlet.class);
/**
* Initialize the servlet.<br>
* The default directory for user files will be constructed.
*/
public void init() throws ServletException, IllegalArgumentException {
// check, if 'baseDir' exists
String realDefaultUserFilesPath = getServletContext().getRealPath(
ConnectorHandler.getDefaultUserFilesPath());
File defaultUserFilesDir = new File(realDefaultUserFilesPath);
UtilsFile.checkDirAndCreate(defaultUserFilesDir);
logger.info("RemoteUploadServlet successful initialized!");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.debug("Entering RemoteUploadServlet#doGet");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/xml; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
String commandStr = request.getParameter("Command");
String typeStr = request.getParameter("Type");
String currentFolderStr = request.getParameter("CurrentFolder");
logger.debug("Parameter Command: {}", commandStr);
logger.debug("Parameter Type: {}", typeStr);
logger.debug("Parameter CurrentFolder: {}", currentFolderStr);
out.print("");
out.flush();
out.close();
logger.debug("Exiting ConnectorServlet#doGet");
}
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.debug("Entering RemoteUploadServlet#doPost");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
String commandStr = request.getParameter("Command");
String typeStr = request.getParameter("Type");
String currentFolderStr = request.getParameter("CurrentFolder");
logger.debug("Parameter Command: {}", commandStr);
logger.debug("Parameter Type: {}", typeStr);
logger.debug("Parameter CurrentFolder: {}", currentFolderStr);
UploadResponse ur;
// if this is a QuickUpload-Request, 'commandStr' and 'currentFolderStr' are empty
if (Utils.isEmpty(commandStr) && Utils.isEmpty(currentFolderStr)) {
commandStr = "Remote";
currentFolderStr = "/";
}
if (!RequestCycleHandler.isEnabledForFileUpload(request))
ur = new UploadResponse(UploadResponse.EN_SECURITY_ERROR, null, null,
Messages.NOT_AUTHORIZED_FOR_UPLOAD);
else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr))
ur = new UploadResponse(UploadResponse.EN_ERROR, null, null, Messages.INVALID_TYPE);
else if (!UtilsFile.isValidPath(currentFolderStr))
ur = UploadResponse.UR_INVALID_CURRENT_FOLDER;
else {
ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr);
String typePath = UtilsResponse.constructResponseUrl(request, resourceType,
currentFolderStr, false, false);
String typeDirPath = getServletContext().getRealPath(typePath);
File typeDir = new File(typeDirPath);
UtilsFile.checkDirAndCreate(typeDir);
File currentDir = new File(typeDir, currentFolderStr);
if (!currentDir.exists())
ur = UploadResponse.UR_INVALID_CURRENT_FOLDER;
else {
String saveFilenames = "";
String pathFilename = "";
String contentString;
String remoteFileurl = null;
String newFilename = null;
int nFileNum = 0;
contentString = request.getParameter("editor_UploadText");
if (!Utils.isEmpty(contentString)) {
Pattern pRemoteFileurl = Pattern
.compile("((http|https|ftp|rtsp|mms):(//|\\\\){1}(([A-Za-z0-9_-])+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(\\S*/)((\\S)+[.]{1}([^'\" ])+))");
Matcher mRemoteFileurl = pRemoteFileurl.matcher(contentString);
StringBuffer sb = new StringBuffer();
while (mRemoteFileurl.find()) {
remoteFileurl = mRemoteFileurl.group(0);
String remoteFilename =remoteFileurl.substring(remoteFileurl.lastIndexOf("/") + 1);
String rawName = UtilsFile.sanitizeFileName(remoteFilename);
String filename = FilenameUtils.getName(rawName);
String baseName = FilenameUtils.removeExtension(filename);
String extension = FilenameUtils.getExtension(filename);
if (ExtensionsHandler.isAllowed(resourceType, extension)) {
String fileUrl = "";
// construct an unique file name
File pathToSave = new File(currentDir, filename);
int counter = 1;
while (pathToSave.exists()) {
newFilename = baseName.concat("(").concat(String.valueOf(counter))
.concat(")").concat(".").concat(extension);
pathToSave = new File(currentDir, newFilename);
counter++;
}
if (Utils.isEmpty(newFilename)) {
fileUrl = UtilsResponse.constructResponseUrl(request, resourceType, currentFolderStr,
true, ConnectorHandler.isFullUrl()).concat(filename);
newFilename = filename;
}
else {
fileUrl = UtilsResponse.constructResponseUrl(request, resourceType,
currentFolderStr, true, ConnectorHandler.isFullUrl())
.concat(newFilename);
}
if (RemoteFile.saveUrlAs(remoteFileurl, pathToSave.getAbsolutePath())) {
nFileNum ++;
if (nFileNum > 1) {
saveFilenames += "|";
pathFilename += "|";
}
saveFilenames += newFilename;
pathFilename += fileUrl;
mRemoteFileurl.appendReplacement(sb,
fileUrl);
}
}
}
mRemoteFileurl.appendTail(sb);
contentString = sb.toString();
contentString=inHTML(contentString);
}
ur = new UploadResponse(UploadResponse.EN_OK, pathFilename, saveFilenames, contentString.replaceAll("'", "{\"}"));
}
}
out.print(ur);
out.flush();
out.close();
logger.debug("Exiting Connector#doPost");
}
private String inHTML(String str)
{
String sTemp;
sTemp = str;
if(sTemp.equals(""))
{
System.exit(0);
}
sTemp = sTemp.replaceAll("&", "&");
sTemp = sTemp.replaceAll("<", "<");
sTemp = sTemp.replaceAll(">", ">");
return sTemp;
}
}
RemoteFile.java 远程文件保存
package com.ccr.tools;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class RemoteFile {
public static boolean saveUrlAs(String fileUrl, String savePath) {
try {
URL url = new URL(fileUrl);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
DataInputStream in = new DataInputStream(connection
.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(
savePath));
byte[] buffer = new byte[4096];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
connection.disconnect();
return true;
} catch (Exception e) {
System.out.println(e + fileUrl + savePath);
return false;
}
}
/**
* 兼容HTTP和FTP协议
* @param urlString
* @return
*/
public static String getDocumentAt(String urlString) {
StringBuffer document = new StringBuffer();
try {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
document.append(line + "\n");
}
reader.close();
} catch (MalformedURLException e) {
System.out.println("Unable to connect to URL: " + urlString);
} catch (IOException e) {
System.out.println("IOException when connecting to URL: "
+ urlString);
}
return document.toString();
}
/**
*
* @param args
*/
public static void main(String[] args) {
String photoUrl = "http://www.zhplc.com/468x60.gif";
String fileName = photoUrl.substring(photoUrl.lastIndexOf("/"));
String filePath = "c:\\";
boolean flag = RemoteFile.saveUrlAs(photoUrl, filePath + fileName);
System.out.println("Run ok!\n Get URL file " + flag);
}
}
myfckconfig.js
FCKConfig.Plugins.Add( 'remoteupload', 'en,zh-cn' ) ; FCKConfig.ToolbarSets["test"] = [ ['Source'], ['RemoteUpload'] ] ; FCKConfig.RemoteUpload = true ; FCKConfig.RemoteUploadURL = FCKConfig.BasePath + 'filemanager/remoteupload/' + _QuickUploadLanguage + '/upload.' + _QuickUploadExtension + '?Type=Image' ; // Edit by lurocky for setUploadFile FCKConfig.setUploadFile = function( A ) { if( !A ) { return; } var B = FCKURLParams['Savepathfilename']; if (B) { var C = parent.document.getElementsByName( B )[0]; if ( C ){ if ( C.value.indexOf( A ) == -1 ) { if ( C.value !== "" ){ C.value = C.value + "|" + A; } else { C.value = A; } if ( C.onchange ) { C.onchange(); } } } } }; FCKConfig.uploadFileUrl = ''; FCKConfig.getEvalString = function( A ) { var B = A.toString(); return B.substring(B.indexOf("{") + 1, B.lastIndexOf("}")); }; FCKConfig.FCKLanguageManagerTranslatePageString = FCKConfig.getEvalString(FCKLanguageManager.TranslatePage); FCKConfig.OnUploadCompleted = function ( errorNumber, fileUrl, fileName, customMsg ) {}; FCKConfig.Ok = function () {}; FCKLanguageManager.TranslatePage = function( A ) { eval(FCKConfig.FCKLanguageManagerTranslatePageString); var DLwin = A.defaultView || A.parentWindow; if (DLwin.OnUploadCompleted) { FCKConfig.OnUploadCompleted = DLwin.OnUploadCompleted; DLwin.OnUploadCompleted = function ( errorNumber, fileUrl, fileName, customMsg ) { if (fileUrl !== '') { FCKConfig.uploadFileUrl = fileUrl; } return FCKConfig.OnUploadCompleted ( errorNumber, fileUrl, fileName, customMsg ); }; if (DLwin.Ok) { FCKConfig.Ok = DLwin.Ok; DLwin.Ok = function () { if (FCKConfig.uploadFileUrl !== '' && FCKConfig.uploadFileUrl == DLwin.GetE('txtUrl').value) { FCKConfig.setUploadFile(DLwin.GetE('txtUrl').value); } return FCKConfig.Ok(); }; } } }; // Edit end
fckplugin.js remoteupload plugin file
/* * For FCKeditor 2.6 * * File Name: fckplugin.js * Add a toolbar button to RemoteUpload. * * File Authors: * lurocky */ function splitTextField(objField, html) { objField.value = html; if (_QuickUploadLanguage != "asp") { return; } var strFieldName = objField.name; var objForm = objField.form; var objDocument = objField.document; var FormLimit = 50000; var elements = objDocument.getElementsByName(strFieldName); for (var i = 1; i < elements.length; i++) { elements[i].value = ""; } if (html.length > FormLimit) { objField.value = html.substr(0, FormLimit); html = html.substr(FormLimit); while (html.length > 0) { var ObjTEXTAREA = objDocument.createElement("<TEXTAREA NAME='" + strFieldName + "'></TEXTAREA>"); objTEXTAREA.style.display = "none"; objTEXTAREA.value = html.substr(0, FormLimit); objForm.appendChild(objTEXTAREA); html = html.substr(FormLimit); } } } var ProcessingMsg = (function () { var baseZIndex; var processingdiv; // The document that holds the dialog. var topWindow = window.parent; while (topWindow.parent && topWindow.parent != topWindow) { try { if (topWindow.parent.document.domain != document.domain) { break; } if (topWindow.parent.document.getElementsByTagName("frameset").length > 0) { break; } } catch (e) { break; } topWindow = topWindow.parent; } var topDocument = topWindow.document; var getZIndex = function () { if (!baseZIndex) { baseZIndex = FCKConfig.FloatingPanelsZIndex + 999; } return ++baseZIndex; }; return {DisplayMainprocessingdiv:function (msg) { processingdiv = topDocument.createElement("div"); var height = 30; var width = 200; var viewSize = FCKTools.GetViewPaneSize(topWindow); var scrollPosition = FCKTools.GetScrollPosition(topWindow); var iTop = Math.max(scrollPosition.Y + (viewSize.Height - height - 20) / 2, 0); var iLeft = Math.max(scrollPosition.X + (viewSize.Width - width - 20) / 2, 0); FCKDomTools.SetElementStyles(processingdiv, {"position":"absolute", "zIndex":getZIndex(), "top":iTop + "px", "left":iLeft + "px", "width":width + "px", "height":height + "px"}); processingdiv.innerHTML = "<table border=0 cellpadding=0 cellspacing=1 bgcolor='#000000' width='100%' height='100%'><tr bgcolor=#3a6ea5><td><marquee id='msgProcessing' align='middle' behavior='alternate' scrollamount='5' style='font-size:9pt;color:#ffffff'>" + msg + "</marquee></td></tr></table>"; topDocument.body.appendChild(processingdiv); var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject("frameElement"); el._fck_originalTabIndex = el.tabIndex; el.tabIndex = -1; }, HideMainprocessingdiv:function () { FCKDomTools.RemoveNode(processingdiv); var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject("frameElement"); el.tabIndex = el._fck_originalTabIndex; FCKDomTools.ClearElementJSProperty(el, "_fck_originalTabIndex"); }, Getprocessingdiv:function () { return processingdiv; }}; })(); var RemoteUploadInit = false; var sEventUploadAfter; FCK.remoteUpload = function (strEventUploadAfter) { if (!FCKConfig.RemoteUpload) { return; } var htmlValue = FCK.GetXHTML(); if (htmlValue == "") { return; } if (!RemoteUploadInit) { var eRemoteUploadDiv = document.createElement("div"); eRemoteUploadDiv.style.cssText = "position:absolute; display:none;"; var eRemoteUploadForm = document.createElement("form"); eRemoteUploadForm.id = "editor_UploadForm"; eRemoteUploadForm.action = FCKConfig.RemoteUploadURL; eRemoteUploadForm.method = "post"; eRemoteUploadForm.target = "editor_UploadTarget"; var eRemoteUploadInput, eRemoteUploadIframe; if (FCKBrowserInfo.IsIE) { eRemoteUploadInput = document.createElement("<input type=\"hidden\" name=\"editor_UploadText\" value=\"\">"); eRemoteUploadIframe = document.createElement("<iframe name=\"editor_UploadTarget\"></iframe>"); } else { eRemoteUploadInput = document.createElement("input"); eRemoteUploadInput.name = "editor_UploadText"; eRemoteUploadInput.type = "hidden"; eRemoteUploadIframe = document.createElement("iframe"); eRemoteUploadIframe.name = "editor_UploadTarget"; } eRemoteUploadForm.appendChild(eRemoteUploadInput); eRemoteUploadIframe.style.cssText = "position:absolute; display:none; width:0px; height:0px;"; eRemoteUploadIframe.src = "javascript: void(0);"; eRemoteUploadDiv.appendChild(eRemoteUploadForm); eRemoteUploadDiv.appendChild(eRemoteUploadIframe); document.body.appendChild(eRemoteUploadDiv); RemoteUploadInit = true; } if (strEventUploadAfter) { sEventUploadAfter = strEventUploadAfter; } splitTextField(document.getElementsByName("editor_UploadText")[0], htmlValue); ProcessingMsg.DisplayMainprocessingdiv(FCKLang["MsgRemoteUploading"]); document.getElementById("editor_UploadForm").submit(); }; function remoteUploadOK() { ProcessingMsg.HideMainprocessingdiv(); if (FCK.LinkedField) { if (sEventUploadAfter) { var sScript = "parent." + sEventUploadAfter; if (window.execScript) { window.execScript(sScript, "JavaScript"); } else { if (FCKBrowserInfo.IsGecko10) { eval.call(window, sScript); } else { if (FCKBrowserInfo.IsAIR) { FCKAdobeAIR.FCKeditorAPI_Evaluate(window, sScript); } else { if (FCKBrowserInfo.IsSafari || FCKBrowserInfo.IsGecko19) { var eScript = document.createElement("script"); eScript.appendChild(document.createTextNode(sScript)); document.documentElement.appendChild(eScript); } else { window.eval(sScript); } } } } eval("parent." + sEventUploadAfter); } } } function OnUploadCompleted(errorNumber, fileUrl, fileName, customMsg) { switch (errorNumber) { case 0: // No errors alert("Your file has been successfully uploaded"); break; case 1: // Custom error alert(customMsg); return; case 101: // Custom warning alert(customMsg); break; case 201: alert("A file with the same name is already available. The uploaded file has been renamed to \"" + fileName + "\""); break; case 202: alert("Invalid file type"); return; case 203: alert("Security error. You probably don't have enough permissions to upload. Please check your server."); return; case 500: alert("The connector is disabled"); break; default: alert("Error on file upload. Error number: " + errorNumber); return; } if (fileUrl) { var fileUrls = fileUrl.split("|"); for (var i = 0; i < fileUrls.length; i++) { if (FCKConfig.setUploadFile) { FCKConfig.setUploadFile(fileUrls[i]); } } } FCK.SetData(FCKTools.HTMLDecode(customMsg.ReplaceAll(["{\"}"], ["'"]))); remoteUploadOK(); } var RemoteUploadCommand = function (command) { this.Name = command; }; RemoteUploadCommand.prototype.Execute = function () { FCK.remoteUpload(); }; RemoteUploadCommand.prototype.GetState = function () { return FCK_TRISTATE_OFF; }; // Register the related commands. FCKCommands.RegisterCommand("RemoteUpload", new RemoteUploadCommand(FCKLang["RemoteUpload"])); // Create the "RemoteUpload" toolbar button. var RemoteUploadItem = new FCKToolbarButton("RemoteUpload", FCKLang["RemoteUpload"]); RemoteUploadItem.IconPath = FCKConfig.PluginsPath + "remoteupload/remoteupload.gif"; FCKToolbarItems.RegisterItem("RemoteUpload", RemoteUploadItem); // 'RemoteUpload' is the name used in the Toolbar config.