SpringMvc上传图片及表单提交(单文件+实体类参数提交)

    前两天做项目用到了Springmvc的文件上传来上传图片,由于和这个普通的Java文件上传处理流程不太一样,所以做的时候碰了壁,一顿百度,博客,要不就是一部分代码,要不就是看不懂,用不会的代码,

    下面来放上我理解到的,代码量还可以。欢迎批评改正

    1.需要的炸包儿

      commons-io-1.3.2.jar  
      commons-lang-2.6.jar  
      commons-fileupload-1.2.1.jar  

    2.定义springmvc配置文件的上传文件的bean:

 

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"></property>
        <!--上传文件最大值,单位byte-->
        <property name="maxUploadSize" value="104857600"></property>
    </bean>

 

    3.前台必须的form表单,post提交,enctype="multipart/form-data",表单框框name还是实体类字段

    注意:file文件域的name值不能和实体类相同,因为controller要使用@RequestParam(value = "up_file", required = false) MultipartFile multipartFile单独接收 明显能看出前台file文件域的name属性要是和实体类属性名不可能封装到一起,所以单拎出来使用MultipartFile 接收。

    4.Controller里定义一个变量接收file的文件名赋值给实体类然后传给数据库

    //准备变量放入实体类 放入数据库

    String filename = null;

    5.使用isEmpty判断刚才接收的file文件是否为空  if (!multipartFile.isEmpty()) 

    6.准备上传工作,

      //1.定义上传的目标路径"static" + File.separator + "upload"         静态资源文件夹 分隔符      存放img的文件夹   
            String path = request.getSession().getServletContext().getRealPath("static" + File.separator + "ProductImg");
            //2.获取源文件名
            String oldFileName = multipartFile.getOriginalFilename();
            //3.获取源文件的后缀    FilenameUtils工具类的getExtension方法
            String suffix = FilenameUtils.getExtension(oldFileName);
            //4.获取源文件的大小
            long size = multipartFile.getSize();

    7.判断上传的文件是否大于配置文件里定义的大小和定义及判断文件后缀名

      if (size > 454000) {
                request.setAttribute("uploadFileError", "上传文件大小不能超过500kb");
                return "ProductAdd";
            }else if (suffix.equalsIgnoreCase("jpg") ||
             suffix.equalsIgnoreCase("png") || //判断 这些是符合要求的图片格式
        suffix.equalsIgnoreCase("jpeg") ||
           suffix.equalsIgnoreCase("pneg"))

      8.防止用户上传的图片文件名一样,处理文件名:

      String NewFileName = System.currentTimeMillis() + RandomUtils.nextInt(100000) + "." + suffix;

      9.开始上传:        

          File targetFile = new File(path, NewFileName);
                if (!targetFile.exists()) {
                    targetFile.mkdirs();     //判断这个文件是否存在
                }
                //写入 上传
                try {
                    multipartFile.transferTo(targetFile);
                } catch (IOException e) {
                    e.printStackTrace();
                    request.setAttribute("uploadFileError", "上传失败了! 哦,谢特~");
                    return "ProductAdd";
                }
                filename = NewFileName;   //将处理好的上传的文件的名字传入变量存进数据库
            } else {
                //大小可以 格式不符合
                request.setAttribute("uploadFileError", "上传文件的格式不正确");
                return "ProductAdd";
            }
        }

      10.将一开始定义的存放文件名的变量的值赋值给实体类:

        xx.setFileName(filename);

      11.处理你form表单的其他字段的信息调用业务方法增删改,然后返回view

    最注意的一点:前台file文件域的name属性值 不能和实体类名一致

   整体代码:

    

  @RequestMapping(value = "FileAdd", produces = {"text/html;charset=UTF-8;"})
    public String AddPRo(ProDuct product, @RequestParam(value = "up_file", required = false) MultipartFile multipartFile,
                         HttpServletRequest request) {
        //准备变量放入实体类 放入数据库
        String filename = null;
        /*上传文件*/
        if (!multipartFile.isEmpty()) {
            //四步准备
            //1.定义上传的目标路径"static" + File.separator + "upload"
            String path = request.getSession().getServletContext().getRealPath("static" + File.separator + "ProductImg");
            //2.获取源文件名
            String oldFileName = multipartFile.getOriginalFilename();
            //3.获取源文件的后缀    FilenameUtils工具类的getExtension方法
            String suffix = FilenameUtils.getExtension(oldFileName);
            //4.获取源文件的大小
            long size = multipartFile.getSize();
            if (size > 454000) {
                request.setAttribute("uploadFileError", "上传文件大小不能超过500kb");
                return "ProductAdd";
            } else if (suffix.equalsIgnoreCase("jpg") ||
                    suffix.equalsIgnoreCase("png") ||       //判断 这些是符合要求的图片格式
                    suffix.equalsIgnoreCase("jpeg") ||
                    suffix.equalsIgnoreCase("pneg")) {
                //定义上传的文件名
                String NewFileName = System.currentTimeMillis() + RandomUtils.nextInt(100000) + "." + suffix;
                //将即将上传的文件定义
                File targetFile = new File(path, NewFileName);
                if (!targetFile.exists()) {
                    targetFile.mkdirs();     //判断这个文件是否存在
                }
                //写入 上传
                try {
                    multipartFile.transferTo(targetFile);
                } catch (IOException e) {
                    e.printStackTrace();
                    request.setAttribute("uploadFileError", "上传失败了! 哦,谢特~");
                    return "ProductAdd";
                }
                filename = NewFileName;   //将处理好的上传的文件的名字传入变量存进数据库
            } else {
                //大小可以 格式不符合
                request.setAttribute("uploadFileError", "上传文件的格式不正确");
                return "ProductAdd";
            }
        }
        product.setFilename(filename);
        if (productService.addProduct(product)) {
            request.setAttribute("ProList", "Ok");
            return "redirect:product/ProAdd";
            //* return map.put("OkShowProduct", ProDuct);*//*
        } else {
            request.setAttribute("ProList", "No");
            return "redirect:product/ProAdd";
        }
    }

 

上一篇:unity Assetbundle Scene打包与加载


下一篇:Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version)(Manacher算法+输出回文字符串)