• 利用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

  • 相关阅读:
    如何使用lr监视服务器linux的方法
    wc的使用
    mrtg 的配置和使用(从网上搜集的资料,自己整理过的)
    单元测试(从网上搜集的资料,自己总结整理过的)
    StatsD学习
    NodeJs NTLM认证(烂尾)
    用issnode+IIS来托管NodeJs Server之一:安装篇
    jQuery设置光标停留位置在文本最后(或在具体的位置)的办法
    Redis 相关资源
    纯CSS美化HTML的Table
  • 原文地址:https://www.cnblogs.com/whatlonelytear/p/7367413.html
Copyright © 2020-2023  润新知