Struts2自定义过滤器 + 百度富文本控件UEditor + Smb上传图片到独立服务器
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进行过滤;代码示例如下:
//前端显示时,使用的文件路径前缀String urlPrefix = "http://192.168.19.133:8080/picServer";//判断路径是否存在,不存在则创建File dir = new File(realPath);SmbFile remoteDir = new SmbFile(realPath);if(!remoteDir.exists()) remoteDir.mkdirs();if(ServletFileUpload.isMultipartContent(request)){ DiskFileItemFactory dff = new DiskFileItemFactory(); dff.setRepository(dir); dff.setSizeThreshold(1024000); ServletFileUpload sfu = new ServletFileUpload(dff); FileItemIterator fii = sfu.getItemIterator(request); String title = ""; //图片标题 String url = ""; //图片地址 String fileName = "";String state="SUCCESS"; while(fii.hasNext()){ FileItemStream fis = fii.next(); try{ if(!fis.isFormField() && fis.getName().length()>0){ fileName = fis.getName();Pattern reg=Pattern.compile("[.]jpg|png|jpeg|gif$");Matcher matcher=reg.matcher(fileName);if(!matcher.find()) {state = "文件类型不允许!";break;}fileName = new Date().getTime()+fileName.substring(fileName.lastIndexOf("."),fileName.length()); url = realPath+"\\"+fileName; BufferedInputStream in = new BufferedInputStream(fis.openStream());//获得文件输入流SmbFile smbFile = new SmbFile(url);BufferedOutputStream output = new BufferedOutputStream(new SmbFileOutputStream(smbFile)); Streams.copy(in, output, true);//开始把文件写到你指定的上传文件夹 }else{ String fname = fis.getFieldName(); if(fname.indexOf("pictitle")!=-1){ BufferedInputStream in = new BufferedInputStream(fis.openStream()); 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(">", ">"); response.getWriter().print("{'url':'" + urlPrefix + filePath+"/"+fileName+"','title':'"+title+"','state':'"+state+"'}");}%>