Struts2自定义过滤器 + 百度富文本控件UEditor + Smb上传图片到独立服务器

Struts2   2012-09-01 23:12:55 发布
您的评价:
     
4.0
收藏     1收藏
文件夹
标签
(多个标签用逗号分隔)

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进行过滤;代码示例如下:

    package com.taiji.yagl.security;  
      
    import javax.servlet.FilterChain;  
    import javax.servlet.ServletRequest;  
    import javax.servlet.ServletResponse;  
    import javax.servlet.http.HttpServletRequest;  
      
    import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;  
      
    public class MyStrutsFilter extends StrutsPrepareAndExecuteFilter{  
      
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {  
            HttpServletRequest request = (HttpServletRequest) req;  
            String url = request.getRequestURI();  
            try{  
                if ("imageUp.jsp".equals(url.substring(url.length()-11))) {  
                    chain.doFilter(req, res);  
                } else {  
                    super.doFilter(req, res, chain);  
                }  
            }catch(Exception e){  
                System.out.println("Exception in MyStrutsFilter");  
                e.printStackTrace();  
            }  
        }  
      
    }  
然后在web.xml中将struts2的过滤器换成这个类就行了:
    <filter>  
        <filter-name>struts2</filter-name>  
        <filter-class>com.taiji.yagl.security.MyStrutsFilter</filter-class>  
    </filter>  

不过,这个imageUp.jsp也不是拿来就能用的,文件上传成功之后,它返回一个JSON格式的字符串,其中的url字段代表上传成功之后,通过url访问该文件的真实路径。ueditor根目录下的editor_config.js文件中的imagePath属性说是用来修正后台返回的“url”的,其实就是在“url”字符串的前面加上这个字符串而已。笔者直接将其置为空字符串""。 最后说一下文件上传位置的问题。默认是将文件上传到服务器部署的临时目录下的一个文件夹下;这样一旦服务器执行“clean”等清除操作,之前上传的文件都没了。而且图片或者附件这东西一般都比较大,直接传到服务器上,也不是长久之计,于是笔者建议将图片或附件上传到一个单独的服务器上。由于时间有限没有研究FTP服务器神马的高级玩意儿,笔者的方案是在服务器上用一个专用的账号(比如用户名guest,密码guest),共享一个专用的文件夹并对guest用户开放所有权限,然后把这个文件夹发布到web上。文件的上传使用了JCIFS的开源Smb组件;修改后的imageUp.jsp全文如下:
    <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <%@ page import="java.io.*"%>  
    <%@ page import="org.apache.commons.fileupload.*" %>  
    <%@ page import="org.apache.commons.fileupload.util.*" %>  
    <%@ page import="org.apache.commons.fileupload.servlet.*" %>  
    <%@ page import="org.apache.commons.fileupload.FileItemIterator" %>  
    <%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>  
    <%@ page import="java.util.regex.Matcher" %>  
    <%@ page import="java.util.regex.Pattern" %>  
    <%@ page import="java.util.Date" %>  
    <%@ page import="jcifs.smb.SmbFile" %>  
    <%@ page import="jcifs.smb.SmbFileInputStream" %>  
    <%@ page import="jcifs.smb.SmbFileOutputStream" %>  
      
    <%  
      
    String filePath = "/fj_yagl/upload/image";  
    //文件保存的真实路径  
    String realPath = "smb://guest:guest@WIN-FILESERVER/NetShare" + filePath;  
    <pre name="code" class="java">//前端显示时,使用的文件路径前缀</pre>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+"'}");}%>  
    <pre></pre>  
    <br>  
    <p><span style="color:rgb(62,62,62); font-family:Simsun; line-height:18px"></span></p>  
转自:http://blog.csdn.net/neareast/article/details/7929986

扩展阅读

为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
Apache所有项目介绍
struts2的执行流程与配置详解
Struts2学习笔记
struts2文件上传的采用的三种方式解析和上传下载讲解

为您推荐

Struts2自定义过滤器 + 百度富文本控件UEditor + Smb上传图片到独立服务器
Jquery EasyUI操作表格,分页显示
Spring3+Hibernate4+SpringMVC整合Ext:开发Ext界面
通过Canvas及File API缩放并上传图片
spring+websocket整合(springMVC+spring+MyBatis即SSM框架和

更多

Struts2
相关文档  — 更多
相关经验  — 更多
相关讨论  — 更多