connector.cfm
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:9k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. <cfsetting enablecfoutputonly="true" showdebugoutput="false">
  2. <!--- @Packager.Header
  3. <FileDescription>
  4. This is the File Browser Connector for ColdFusion.
  5. Notice: 
  6. FCKeditor needs an UTF-8 encoded XML packet. 
  7. Only CFMX can encode in UTF-8. If this browser doesn't work in CF 4.0/4.5/5,
  8. please send me a notice. We then can use an more object oriented approach (CFC)
  9. to clean up this code :)
  10. Please declare the base path (e.g. /UserFiles/) as an Application or Server variable
  11. Directory structure (with optional subdirectories built by the user). 
  12. The "Type" subdirectory is automatically submitted by FCKeditor:
  13. /UserFiles/Image/
  14. /UserFiles/Flash/
  15. /UserFiles/File/
  16. /UserFiles/Media/
  17. </FileDescription>
  18. <Author name="Hendrik Kramer" email="hk@lwd.de" />
  19. --->
  20. <cfparam name="URL.Command" type="string">
  21. <cfparam name="URL.Type" type="string">
  22. <cfparam name="URL.CurrentFolder" type="string">
  23. <!--- ::
  24. * Get base url path to the userfiles directory (may be set in Application.cfm or anywhere else)
  25. :: --->
  26. <cfif isDefined('APPLICATION.userFilesPath')>
  27. <cflock scope="Application" type="readonly" timeout="3">
  28. <cfset sUserFilesURL = APPLICATION.userFilesPath>
  29. </cflock>
  30. <cfelseif isDefined('SERVER.userFilesPath')>
  31. <cflock scope="SERVER" type="readonly" timeout="3">
  32. <cfset sUserFilesURL = SERVER.userFilesPath>
  33. </cflock>
  34. <cfelse>
  35. <!--- :: then use default :: --->
  36. <cfset sUserFilesURL = "/UserFiles/">
  37. </cfif>
  38. <cfif not len( sUserFilesURL )>
  39. <cfthrow type="fckeditor.connector" message="You must supply a full path to the userFiles base URL in APPLICATION or SERVER Scope.">
  40. </cfif>
  41. <cfscript>
  42. /**
  43.   * We must extract the physical server directory for the webroot of this project to append the base url path
  44.       * e.g. 
  45.       * PATH=c:inetpubwwwrootproject1fckeditoreditorfilemanagerbrowserdefaultconnectorscfmconnector.cfm 
  46.       * URL =/fckeditor/editor/filemanager/browser/default/connectors/cfm/connector.cfm 
  47.       * ROOT=c:inetpubwwwrootproject1
  48.       *
  49.       * This may fail if you use an symbolic link inside your webroot
  50.       */
  51. sRootDir = replace( getBaseTemplatePath(), "", "/", "ALL");
  52. iLen = listLen( cgi.script_name, '/' );
  53. for( i=iLen; i GTE 1; i=i-1 )
  54. {
  55. iPos = listFindNoCase( sRootDir, listGetAt( cgi.script_name, i, '/' ), '/' );
  56. if( iPos GT 0 )
  57. sRootDir = listDeleteAt( sRootDir, iPos, '/' );
  58. }
  59. // replace backslashes in URL with normal slashes
  60. sUserFilesURL = replace( sUserFilesURL, "", "/", "ALL");
  61. // Check the base folder syntax (must end with a slash).
  62. if( compare( right( sUserFilesURL, 1), "/" ) )
  63. sUserFilesURL = sUserFilesURL & "/";
  64. // Create the physical path to the media root directory
  65. sUserFilesPath = sRootDir & sUserFilesURL;
  66. sUserFilesPath = replace( sUserFilesPath, '//', '/', 'ALL' );
  67. // Check the current folder syntax (must begin and start with a slash).
  68. if( compare( left( URL.CurrentFolder, 1), "/" ) )
  69. URL.CurrentFolder = "/" & URL.CurrentFolder;
  70. if( compare( right( URL.CurrentFolder, 1), "/" ) )
  71. URL.CurrentFolder = URL.CurrentFolder & "/";
  72. /**
  73.   * Prepare the XML Header and Footer
  74.   */
  75. sXMLHeader = '<?xml version="1.0" encoding="utf-8" ?><Connector command="#URL.Command#" resourceType="#URL.Type#">';
  76. sXMLHeader = sXMLHeader & '<CurrentFolder path="#URL.CurrentFolder#" url="#sUserFilesURL##URL.Type##URL.CurrentFolder#" />';
  77. sXMLFooter = '</Connector>';
  78. sXMLContent = '';
  79. </cfscript>
  80. <!--- :: Make sure that current base path exists as a directory :: --->
  81. <cfif not directoryExists( sUserFilesPath & URL.Type & URL.CurrentFolder )>
  82. <cfdirectory 
  83. action="create" 
  84. directory="#sUserFilesPath##URL.Type##URL.CurrentFolder#"
  85. >
  86. </cfif>
  87. <!--- :: Switch command arguments :: --->
  88. <cfswitch expression="#URL.Command#">
  89. <cfcase value="FileUpload">
  90. <cfset sFileName = "">
  91. <cfset sFileExt = "">
  92. <cftry>
  93. <!--- :: first upload the file with an unique filename :: --->
  94. <cffile action="UPLOAD"
  95. fileField="NewFile"
  96. destination="#sUserFilesPath##URL.Type##URL.CurrentFolder#"
  97. nameConflict="MAKEUNIQUE"
  98. >
  99. <cfscript>
  100. sErrorNumber = 0;
  101. sFileName = CFFILE.ClientFileName;
  102. sFileExt = CFFILE.ServerFileExt;
  103. /**
  104.   * Validate filename for html download. Only a-z, 0-9, _, - and . are allowed.
  105.   */
  106. if( reFind("[^A-Za-z0-9_-.]", sFileName) )
  107. {
  108. sFilename = reReplace(sFilename, "[^A-Za-z0-9-.]", "_", "ALL");
  109. sFilename = reReplace(sFilename, "_{2,}", "_", "ALL");
  110. sFilename = reReplace(sFilename, "([^_]+)_+$", "1", "ALL");
  111. sFilename = reReplace(sFilename, "$_([^_]+)$", "1", "ALL");
  112. }
  113. // When the original filename already exists, add numbers (0), (1), (2), ... at the end of the filename.
  114. if( compare( CFFILE.ServerFileName, sFileName ) )
  115. {
  116. iCounter = 0;
  117. sTmpFileName = sFileName;
  118. while( fileExists('#sUserFilesPath##URL.Type##URL.CurrentFolder##sFilename#.#sFileExt#') )
  119. {
  120.    iCounter=iCounter+1;
  121. sFileName = sTmpFileName & '(#iCounter#)';
  122. }
  123. }
  124. </cfscript>
  125. <!--- :: Rename the uploaded file, if neccessary --->
  126. <cfif compare( CFFILE.ServerFileName, sFileName )>
  127. <cfset sErrorNumber = "201">
  128. <cffile
  129. action="RENAME"
  130. source="#sUserFilesPath##URL.Type##URL.CurrentFolder##CFFILE.ServerFileName#.#CFFILE.ServerFileExt#"
  131. destination="#sUserFilesPath##URL.Type##URL.CurrentFolder##sFileName#.#sFileExt#"
  132. mode="644"
  133. attributes="normal"
  134. >
  135. </cfif>
  136. <cfcatch type="Any">
  137. <cfset sErrorNumber = "202">
  138. </cfcatch>
  139. </cftry>
  140. <cfif sErrorNumber eq 201>
  141. <!--- :: file was changed (201), submit the new filename :: --->
  142. <cfoutput>
  143. <script type="text/javascript">
  144. window.parent.frames['frmUpload'].OnUploadCompleted(#sErrorNumber#,'#replace( sFileName & "." & sFileExt, "'", "'", "ALL")#');
  145. </script>
  146. </cfoutput>
  147. <cfelse>
  148. <!--- :: file was uploaded succesfully(0) or an error occured(202). Submit only the error code. :: --->
  149. <cfoutput>
  150. <script type="text/javascript">
  151. window.parent.frames['frmUpload'].OnUploadCompleted(#sErrorNumber#);
  152. </script>
  153. </cfoutput>
  154. </cfif>
  155. <cfabort>
  156. </cfcase>
  157. <cfcase value="GetFolders">
  158. <!--- :: Sort directories first, name ascending :: --->
  159. <cfdirectory 
  160. action="LIST" 
  161. directory="#sUserFilesPath##URL.Type##URL.CurrentFolder#" 
  162. name="qDir"
  163. sort="type,name"
  164. >
  165. <cfscript>
  166. iLen = qDir.recordCount;
  167. i=1;
  168. sFolders = '';
  169. while( i LTE iLen )
  170. {
  171. if( not compareNoCase( qDir.type[i], "FILE" ))
  172. break;
  173. if( not listFind(".,..", qDir.name[i]) )
  174. sFolders = sFolders & '<Folder name="#qDir.name[i]#" />';
  175. i=i+1;
  176. }
  177. sXMLContent = sXMLContent & '<Folders>' & sFolders & '</Folders>';
  178. </cfscript>
  179. </cfcase>
  180. <cfcase value="GetFoldersAndFiles">
  181. <!--- :: Sort directories first, name ascending :: --->
  182. <cfdirectory 
  183. action="LIST" 
  184. directory="#sUserFilesPath##URL.Type##URL.CurrentFolder#" 
  185. name="qDir"
  186. sort="type,name"
  187. >
  188. <cfscript>
  189. iLen = qDir.recordCount;
  190. i=1;
  191. sFolders = '';
  192. sFiles = '';
  193. while( i LTE iLen )
  194. {
  195. if( not compareNoCase( qDir.type[i], "DIR" ) and not listFind(".,..", qDir.name[i]) )
  196. {
  197. sFolders = sFolders & '<Folder name="#qDir.name[i]#" />';
  198. }
  199. else if( not compareNoCase( qDir.type[i], "FILE" ) )
  200. {
  201. iFileSize = int( qDir.size[i] / 1024 );
  202. sFiles = sFiles & '<File name="#qDir.name[i]#" size="#IIf( iFileSize GT 0, DE( iFileSize ), 1)#" />';
  203. }
  204. i=i+1;
  205. }
  206. sXMLContent = sXMLContent & '<Folders>' & sFolders & '</Folders>';
  207. sXMLContent = sXMLContent & '<Files>' & sFiles & '</Files>';
  208. </cfscript>
  209. </cfcase>
  210. <cfcase value="CreateFolder">
  211. <cfparam name="URL.NewFolderName" default="">
  212. <cfif not len( URL.NewFolderName ) or len( URL.NewFolderName ) GT 255>
  213. <cfset iErrorNumber = 102>
  214. <cfelseif directoryExists( sUserFilesPath & URL.Type & URL.CurrentFolder & URL.NewFolderName )>
  215. <cfset iErrorNumber = 101>
  216. <cfelseif reFind( "^..", URL.NewFolderName )>
  217. <cfset iErrorNumber = 103>
  218. <cfelse>
  219. <cfset iErrorNumber = 0>
  220. <cftry>
  221. <cfdirectory
  222. action="CREATE"
  223. directory="#sUserFilesPath##URL.Type##URL.CurrentFolder##URL.NewFolderName#"
  224. >
  225. <cfcatch>
  226. <!--- ::
  227. * Not resolvable ERROR-Numbers in ColdFusion:
  228. * 102 : Invalid folder name. 
  229. * 103 : You have no permissions to create the folder. 
  230. :: --->
  231. <cfset iErrorNumber = 110>
  232. </cfcatch>
  233. </cftry>
  234. </cfif>
  235. <cfset sXMLContent = sXMLContent & '<Error number="#iErrorNumber#" />'>
  236. </cfcase>
  237. <cfdefaultcase>
  238. <cfthrow type="fckeditor.connector" message="Illegal command: #URL.Command#">
  239. </cfdefaultcase>
  240. </cfswitch>
  241. <!--- ::
  242.    * output XML (no content caching) 
  243. :: --->
  244. <cfheader name="Pragma" value="no-cache">
  245. <cfheader name="Cache-Control" value="no-cache, no-store, must-revalidate">
  246. <cfcontent reset="true" type="text/xml; charset=UTF-8">
  247. <cfoutput>#sXMLHeader##sXMLContent##sXMLFooter#</cfoutput>
  248. <cfsetting enablecfoutputonly="false">