spring+DelegatingFilterProxy拦截器实现文件上传

web.xml

 <filter>
  	<filter-name>uploadFilter</filter-name>
  	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>uploadFilter</filter-name>
  	<url-pattern>/service/CmmService/Add</url-pattern>
  </filter-mapping>
注意这个过滤器其实是一个DelegatingFilterProxy,这个过滤器里没有实现过滤器的任何逻辑。 DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean。 这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。 bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的
spring-ioc.xml

<bean id="uploadFilter" class="cn.tv189.comment.service.filter.UploadFilter">
	<property name="commentInfoLogic">
		<ref bean="commentInfoLogic"/>
	</property>
</bean>

注意:spring-ioc.xml中的id要与web.xml中filter的filter-name名字一样

UploadFilter.java

package cn.tv189.comment.service.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import cn.tv189.comment.domain.ECommentType;
import cn.tv189.comment.helper.StringHelper;
import cn.tv189.comment.service.helper.MsgCodeInfo;
import cn.tv189.comment.service.logic.CommentInfoLogic;


public class UploadFilter implements Filter{
	private static Logger logger = Logger.getLogger(UploadFilter.class);
	private CommentInfoLogic commentInfoLogic;
	
	private HttpServletRequest request;
	private HttpServletResponse response;
	/* (non-Javadoc)
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
	 */
	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		setRequest((HttpServletRequest) req);
		setResponse((HttpServletResponse) res);
		
		String version = request.getParameter(MsgCodeInfo.VERSION);
		String commentType = request.getParameter(MsgCodeInfo.COMMENT_TYPE);
		//当调用添加评论接口并且v=3,commentType=3的时候,进行语音文件操作
		if("3".equals(version) && ECommentType.Audio.getValue().toString().equals(commentType)){
			String jsonStr = commentInfoLogic.uploadAudioCommentInfo(request);
			if(!StringHelper.isNullOrEmpty(jsonStr)){
				outJSON(jsonStr);
			}else{
				chain.doFilter(req, res);
			}
		}else{
			chain.doFilter(req, res);
		}
	}

	public void outJSON(String str) {
		//上线的时候,以JSON的方式进行传输.
		try {
			getResponse().setHeader("Pragma", "no-cache");
			getResponse().setHeader("Cache-Control", "no-cache");
			getResponse().setDateHeader("Expires", 0);
			getResponse().setContentType("text/javascript;charset=utf-8");
		} finally {
			outSTR(str);
		}
	}
	private final void outSTR(String str) {
		PrintWriter out = null;
		try {
			out = getResponse().getWriter();
			{
				out.write(str);
			}
		} catch (IOException e) {
			logger.error("输出异常", e);
		} finally {
			if (out != null) {
				out.flush();
				out.close();
			}
		}
	}
	/* (non-Javadoc)
	 * @see javax.servlet.Filter#destroy()
	 */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
			
	public HttpServletRequest getRequest() {
		return request;
	}

	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}

	public HttpServletResponse getResponse() {
		return response;
	}

	public void setResponse(HttpServletResponse response) {
		this.response = response;
	}

	public CommentInfoLogic getCommentInfoLogic() {
		return commentInfoLogic;
	}

	public void setCommentInfoLogic(CommentInfoLogic commentInfoLogic) {
		this.commentInfoLogic = commentInfoLogic;
	}

}
CommentInfoLogic.java

引用的类:

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

上传方法:

private String commentPath;
	public String getCommentPath() {
		return commentPath;
	}
	public void setCommentPath(String commentPath) {
		this.commentPath = commentPath;
	}
	/**
	 * @param request
	 * @return
	 */
	public String uploadAudioCommentInfo(HttpServletRequest request) {
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		ResultProxy result = new ResultProxy();
		String jsonStr = "";
		String relativePath = "";
		try {
			boolean isMulitpart = ServletFileUpload.isMultipartContent(request);
			if(isMulitpart){
//				FileItemFactory fif = upload.getFileItemFactory();
				FileItemIterator iter = upload.getItemIterator(request);
				
				boolean audioIoEmpty = false;
				boolean makeDirFail = false;
				while(iter.hasNext()){
					FileItemStream item = iter.next();
					
					if(item.isFormField()){
						String name = item.getFieldName();
//						String value = item.getString();
					}else{
						String fieldName = item.getFieldName();
						String fileName = item.getName();
						int index = fileName.indexOf(".");
						String suffix = fileName.substring(index, fileName.length());
						String contentType = item.getContentType();
//						boolean isInMemory = item.isInMemory();
//						long sizeInBytes = item.getSize();
						if(MsgCodeInfo.COMMENT_AUDIO.equals(fieldName)){
//							InputStream is = item.getInputStream();
							InputStream is = item.openStream();
							if(is == null){
								audioIoEmpty = true;
							}
							String tmpPath = UploadHelper.saveAudioFile(is, suffix);
							if(tmpPath == null){
								makeDirFail = true;
							}
							relativePath += tmpPath + ","; 
						}
					}
				}
				if(audioIoEmpty){
					result.setCodeAndMsg(MsgCodeInfo.ERROR_AUDIO_IO_EMPTY);
					jsonStr = JsonHelper.toJson(result);
				}
				if(makeDirFail){
					result.setCodeAndMsg(MsgCodeInfo.ERROR_MAKE_DIR_FAIL);
					jsonStr = JsonHelper.toJson(result);
				}
			}else{
				result.setCodeAndMsg(MsgCodeInfo.ERROR_NOT_MULTIPART_REQUEST);
			}
		} catch (FileUploadException e) {
			logger.error(e.getMessage(), e);
			result.setCodeAndMsg(MsgCodeInfo.ERROR_FILE_UPLOAD_FAIL);
			jsonStr = JsonHelper.toJson(result);
		} catch (IOException e) {
			logger.error(e.getMessage(), e);
			result.setCodeAndMsg(MsgCodeInfo.ERROR_IO_STREAM_FAIL);
			jsonStr = JsonHelper.toJson(result);
		}
		if(!StringHelper.isNullOrEmpty(relativePath)){
			setCommentPath(","+relativePath);
		}else{
			setCommentPath("上传语音失败");
		}
		return jsonStr;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值