[转载]UEditor就不多说了,它是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于BSD协议,允许自由使用和修改代码。
UEditor 源码自带一个图片上传的jsp代码,详见ueditor根目录下的“server/upload/jsp/imageUp.jsp”文件。但是如果项目中使用了Apache Struts2框架,由于该框架默认使用Apache的Commons FileUpload组件和内建的FileUploadInterceptor拦截器实现文件上传,将request中的文件域封装到action中的一个File类型的属性中,并删除request中的原有文件域,因此直接用imageUp.jsp上传文件会失败。
解决方法有很多,例如可以自己写一个action来处理文件上传(注意action中文件域的属性名是picdata);或者自定义一个拦截器栈,去掉默认的FileUpload拦截器;或者配置struts不对jsp文件进行过滤等方法。笔者认为对项目影响最少、最简单的方法是自定义一个过滤器,单独指定不对imageUp.jsp进行过滤;代码示例如下:
01 | package com.taiji.yagl.security; |
03 | import javax.servlet.FilterChain; |
04 | import javax.servlet.ServletRequest; |
05 | import javax.servlet.ServletResponse; |
06 | import javax.servlet.http.HttpServletRequest; |
08 | import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter; |
10 | public class MyStrutsFilter extends StrutsPrepareAndExecuteFilter{ |
12 | public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { |
13 | HttpServletRequest request = (HttpServletRequest) req; |
14 | String url = request.getRequestURI(); |
16 | if ( "imageUp.jsp" .equals(url.substring(url.length()- 11 ))) { |
17 | chain.doFilter(req, res); |
19 | super .doFilter(req, res, chain); |
22 | System.out.println( "Exception in MyStrutsFilter" ); |
然后在web.xml中将struts2的过滤器换成这个类就行了:
2 | < filter-name >struts2</ filter-name > |
3 | < filter-class >com.taiji.yagl.security.MyStrutsFilter</ filter-class > |
不过,这个imageUp.jsp也不是拿来就能用的,文件上传成功之后,它返回一个JSON格式的字符串,其中的url字段代表上传成功之后,通过url访问该文件的真实路径。ueditor根目录下的editor_config.js文件中的imagePath属性说是用来修正后台返回的“url”的,其实就是在“url”字符串的前面加上这个字符串而已。笔者直接将其置为空字符串""。 最后说一下文件上传位置的问题。默认是将文件上传到服务器部署的临时目录下的一个文件夹下;这样一旦服务器执行“clean”等清除操作,之前上传的文件都没了。而且图片或者附件这东西一般都比较大,直接传到服务器上,也不是长久之计,于是笔者建议将图片或附件上传到一个单独的服务器上。由于时间有限没有研究FTP服务器神马的高级玩意儿,笔者的方案是在服务器上用一个专用的账号(比如用户名guest,密码guest),共享一个专用的文件夹并对guest用户开放所有权限,然后把这个文件夹发布到web上。文件的上传使用了JCIFS的开源Smb组件;修改后的imageUp.jsp全文如下:
01 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" |
02 | pageEncoding= "UTF-8" %> |
03 | <%@ page import = "java.io.*" %> |
04 | <%@ page import = "org.apache.commons.fileupload.*" %> |
05 | <%@ page import = "org.apache.commons.fileupload.util.*" %> |
06 | <%@ page import = "org.apache.commons.fileupload.servlet.*" %> |
07 | <%@ page import = "org.apache.commons.fileupload.FileItemIterator" %> |
08 | <%@ page import = "org.apache.commons.fileupload.disk.DiskFileItemFactory" %> |
09 | <%@ page import = "java.util.regex.Matcher" %> |
10 | <%@ page import = "java.util.regex.Pattern" %> |
11 | <%@ page import = "java.util.Date" %> |
12 | <%@ page import = "jcifs.smb.SmbFile" %> |
13 | <%@ page import = "jcifs.smb.SmbFileInputStream" %> |
14 | <%@ page import = "jcifs.smb.SmbFileOutputStream" %> |
18 | String filePath = "/fj_yagl/upload/image" ; |
20 | String realPath = "smb://guest:guest@WIN-FILESERVER/NetShare" + filePath; |
21 | <pre name= "code" class = "java" > |
22 | DiskFileItemFactory dff = new DiskFileItemFactory(); dff.setRepository(dir); dff.setSizeThreshold( 1024000 ); ServletFileUpload sfu = new ServletFileUpload(dff); FileItemIterator fii = sfu.getItemIterator(request); String title = "" ; |
24 | {state = "文件类型不允许!" ; break ;}fileName = new Date().getTime()+fileName.substring(fileName.lastIndexOf( "." ),fileName.length()); url = realPath+ "\\" +fileName; BufferedInputStream in = new BufferedInputStream(fis.openStream()); |
25 | output = new BufferedOutputStream( new SmbFileOutputStream(smbFile)); Streams.copy(in, output, true ); |
26 | byte c [] = new byte [ 10 ]; int n = 0 ; while ((n=in.read(c))!=- 1 ){ title = new String(c, 0 ,n); break ; } } } } catch (Exception e){ e.printStackTrace(); } }title = title.replace( "&" , "&" ).replace( "'" , "&qpos;" ).replace( "\"" , "" ").replace(" < ", " < ").replace(" > ", " >"); |
27 | response.getWriter().print( "{'url':'" + urlPrefix + filePath+ "/" +fileName+ "','title':'" +title+ "','state':'" +state+ "'}" );}%> |
30 | <p><span style= "color:rgb(62,62,62); font-family:Simsun; line-height:18px" ></span></p> |