Struts2自定義過濾器 + 百度富文本控件UEditor + Smb上傳圖片到獨立服務器

openkk 12年前發布 | 68K 次閱讀 Struts2 Web框架

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();  
        }  
    }  

}  </pre>然后在web.xml中將struts2的過濾器換成這個類就行了:<pre class="brush:xml; toolbar: true; auto-links: false;">    <filter>  
    <filter-name>struts2</filter-name>  
    <filter-class>com.taiji.yagl.security.MyStrutsFilter</filter-class>  
</filter>  </pre> <p></p>

不過,這個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>  </pre>轉自:http://blog.csdn.net/neareast/article/details/7929986
 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!