利用spring的MultipartFile实现文件上传【原】

利用spring的MultipartFile实现文件上传

主要依赖jar包

spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multipart.MultipartFile)
commons-fileupload-1.3.1.jar
commons-logging-1.0.4.jar

前台

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>上传</title>

<style type="text/css">
</style>

</head>
<body>

    <form enctype="multipart/form-data" action="/kingtool/file/upload.do" method="POST">
        file:
        <input id="file" type="file" name="file" />
        <input type="submit" value="提交" />
    </form>

</body>
</html>

后台

package com.bobo.code.web.controller;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping({ "file/*" })
public class LoginController {

    /**
     * 承保文件上传
     * 
     * @param session
     */
    @RequestMapping(value = "upload.do", method = { RequestMethod.POST, RequestMethod.GET })
    public void fileUpload(HttpSession session, ModelMap modelMap, HttpServletResponse response, HttpServletRequest request, @RequestParam("file") MultipartFile file) throws Exception, IOException {
        String ret = "";
        request.setCharacterEncoding("UTF-8");// 编码格式处理
        // 获取文件名
        String fileName = file.getOriginalFilename();
        System.out.println("fileName:------------------------------------------------------" + fileName);
        // 获取文件大小kb
        BigDecimal fileSize = new BigDecimal(file.getSize()).divide(new BigDecimal(1024), 2, BigDecimal.ROUND_HALF_UP);
        String startFileName = fileName.substring(0, fileName.indexOf("."));
        String endFileName = fileName.substring(fileName.lastIndexOf("."));
        // 新文件名称
        String newFileName = startFileName + "_" + Math.random() + endFileName;
        // 文件保存路径
        String parentPath = request.getSession().getServletContext().getRealPath("/") + "upload/";
        String filePath = parentPath + newFileName;
        System.out.println("filePath:-----------------------------------------------------------" + filePath);
        System.out.println("System.setProperty('sun.jnu.encoding') --------" + System.getProperty("sun.jnu.encoding"));
        System.setProperty("sun.jnu.encoding", "utf-8");
        System.out.println("System.setProperty('sun.jnu.encoding') --------" + System.getProperty("sun.jnu.encoding"));
        File newFile = new File(parentPath);
        if (!newFile.exists()) {// 判断文件夹是否创建,没有创建则创建新文件夹
            newFile.mkdirs();
        }
        boolean uploadFile = true;
        // 比较上传文件大小是否超过10M
        if (fileSize.compareTo(new BigDecimal(1024 * 10)) > 0) {
            uploadFile = false;
            ret = "上传文件的大小不能超过10Mb,请重新选择!";
        }
        if (uploadFile) {
            try {
                file.transferTo(new File(filePath));// 转存文件
                ret = "上传成功!";
            } catch (Exception e) {
                ret = "上传失败!";
            }
        }
        try {
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write(ret);
            response.getWriter().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

spring bean配置

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       <!-- maxUploadSize:文件上传的最大值以byte为单位 -->
       <property name="maxUploadSize" value="1024000"></property>
       <property name="defaultEncoding" value="GBK"></property>  
    </bean>

如果不配置,可能报如下错org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file' is not present

 遇见异常

异常 Required request part 'file' is not present

我遇到的问题和网上的完全不一样, 在springboot中为了能对所有获取到的request提前打印请求报文,在filter又做了一层request wraper包装处理 , 导致file 参数丢失了.

@Component
@WebFilter(filterName = "httpServletRequestFilter", urlPatterns = {
        "/controller/**",
        "/j_spring_security_check**"})
@Order(-12345)
public class HttpServletRequestFilter implements Filter {
    private static final Logger logger = LoggerFactory.getLogger(HttpServletRequestFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        BufferedServletRequestWrapper requestWrapper = null;
        if (servletRequest instanceof HttpServletRequest) {
            requestWrapper = new BufferedServletRequestWrapper((HttpServletRequest) servletRequest);
            HttpSession session = requestWrapper.getSession();
            try {
                logger.info("----------------------------------------------------------------------");
                logger.info("HttpServletRequestFilter");
                logger.info("url: " + requestWrapper.getRequestURL() + "?" + requestWrapper.getQueryString());
                logger.info("sessionId: " + session.getId());
                logger.info("servletPath: " + requestWrapper.getServletPath());
                logger.info("requestMethod: " + requestWrapper.getMethod());
                logger.info("requestHeader: " + HttpServletRequestFilter.getStringFromHead((HttpServletRequest) servletRequest));
                logger.info("body: " + HttpServletRequestFilter.getStringFromStream(requestWrapper));
                logger.info("----------------------------------------------------------------------

");
            } catch (Exception e) {
                e.printStackTrace();
            }
            filterChain.doFilter(requestWrapper, servletResponse);
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

ajax文件上传

如果用ajax文件上传时注意contentType:false 一定要为false, 不要自传多情传什么 contentType: "multipart/form-data;charset=utf-8;boundary=" + Math.random(), 

不然springboot的后台controller死活不成功, 永远报错为: MissingServletRequestPartException: Required request part 'file' is not present 

<script type="text/javascript">
    function upload() {
        $("#result").html("upload");
        var formData = new FormData();
        formData.append("file", $("#file")[0].files[0]);
        $.ajax({
            url: 'http://localhost/controller/finance/asset/manager/upload',
            type: 'post',
            data: formData,
            contentType: false,
            processData: false,
            success: function (res) {
                $("#result").html(res);
            }
        });
    }
</script>

 本小节参考: 解决springboot MultipartFile文件上传遇到的问题==>http://www.manongjc.com/article/4682.html

参考

MultipartFile+ajax图片上传==>https://blog.csdn.net/q394503873/article/details/80737323

原文地址:https://www.cnblogs.com/whatlonelytear/p/7367413.html