1. 程式人生 > >自定義方法限制上傳圖片(檔案)的格式

自定義方法限制上傳圖片(檔案)的格式



import org.apache.catalina.core.ApplicationPart;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.util.Collection;
import java.util.List;

/**
 * @author zlw
 * @date 2018/11/13
 * @description
 */
public class UploadFileInterceptor implements HandlerInterceptor {

    /** 允許上傳的圖片格式 */
    private static final String[] PERMITTED_IMAGE_TYPE = {"jpg", "png"};

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //在請求處理之前進行呼叫(Controller方法呼叫之前)
        // 只有返回true才會繼續向下執行,返回false取消當前請求
        return isImageQuealified(httpServletRequest);
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        //請求處理之後進行呼叫,但是在檢視被渲染之前(Controller方法呼叫之後)
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        //在整個請求結束之後被呼叫,也就是在DispatcherServlet 渲染了對應的檢視之後執行(主要是用於進行資源清理工作)
    }

    /**
     * 注意:此方法不具有普適性,只適用於http的post請求,且第一個引數為MultipartFile型別的
     * 校驗所攔截的請求中上傳的圖片的格式是否合格
     */
    private boolean isImageQuealified (HttpServletRequest httpServletRequest) throws IOException, ServletException {

        Collection<Part> parts =  httpServletRequest.getParts();
        String fileType = "";

        if (null != parts && parts.size() > 0) {
            List list = (List) parts;
            ApplicationPart partZero = (ApplicationPart) list.get(0);
            String zeroName = partZero.getSubmittedFileName();
            String trimedName = zeroName.trim();
            int lastDotIndex = trimedName.lastIndexOf(".");
            fileType = trimedName.substring(lastDotIndex + 1, trimedName.length());
        }

        for (String s : PERMITTED_IMAGE_TYPE) {
            if (fileType.equalsIgnoreCase(s)) {
                return true;
            }
        }
        return false;

    }


}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;



/**
 * 攔截器註冊配置
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {



    /**
     * 上傳的圖片校驗攔截器,將攔截器作為bean寫入配置中,不能直接new,否則攔截器無法注入服務
     */
    @Bean
    public UploadFileInterceptor uploadFileInterceptor() {
        return new UploadFileInterceptor();
    }

    /**
     * 攔截器註冊
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多個攔截器組成一個攔截器鏈
        // addPathPatterns 用於新增攔截規則
        // excludePathPatterns 使用者排除攔截
        registry.addInterceptor(loginInterceptor());
        registry.addInterceptor(uploadFileInterceptor()).addPathPatterns("/pacs/uploadScreenShot");//對上傳圖片介面攔截,做圖片格式校驗
    }
}