Spring MVC 文件上传简单示例(form、ajax方式 )

1、Form Upload

  SpringMVC 中,文件的上传是通过 MultipartResolver 实现的,所以要实现上传,只要注册相应的 MultipartResolver 即可。

  MultipartResolver 的实现类有两个:

  1. CommonsMultipartResolver (需要 Apache 的 commons-fileupload 支持,它能在比较旧的 servlet 版本中使用,兼容性好)
  2. StandardServletMultipartResolver (不需要第三方 jar 包支持,它使用 servlet 内置的上传功能,但是只能在 Servlet 3 以上的版本使用

以 StandardServletMultipartResolver 为例,使用步骤如下。

首先,在 web.xml 中为 DispatcherServlet 配置 Multipart:

<servlet>
  <servlet-name>mvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <multipart-config>
      <max-file-size>5242880</max-file-size>        <!-- 上传文件的大小限制,比如下面表示 5 M -->
      <max-request-size>10485760</max-request-size> <!-- 一次表单提交中文件的大小限制,必须下面代表 10 M -->
      <file-size-threshold>0</file-size-threshold>  <!-- 多大的文件会被自动保存到硬盘上。0 代表所有 -->
    </multipart-config>
</servlet>

 其次,在spring中注册MultipartResolver:

  <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>

然后就可以使用了。

前端代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="filename">
    <input type="submit" value="提交">
</form>
</body>
</html>

后端代码:

package com.oukele.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

@Controller
@RequestMapping(path = "/upload")
public class FileUploadController {

    @RequestMapping(path = "",method = RequestMethod.GET)
    public String getPage(){
        return "fileupload";
    }

    @PostMapping
    public String fileUpload(@RequestPart("filename")MultipartFile multipartFile, HttpServletRequest request) {
        if( !multipartFile.isEmpty() ){
            //验证文件是否为图片格式 && 文件大小不能超过 5M  1KB = 1024B
            if( multipartFile.getContentType().contains("image/") && multipartFile.getSize() < 1024 * 1024 * 1024 * 5 ){
                //图片的存储文件夹
                String save = request.getServletContext().getRealPath("/images");
                File file = new File(save);
                if( !file.exists() ){
                    file.mkdirs();
                }
                //文件名
                String fileName =multipartFile.getOriginalFilename().substring(0,multipartFile.getOriginalFilename().indexOf("."));
               //上传文件的后缀
                String zhui = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().indexOf("."),multipartFile.getOriginalFilename().length());
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                //生成新的文件名
                String fileNewName ="upload_"+fileName+"_"+simpleDateFormat.format(new Date())+zhui;
                try {
                    //将此图片存储到images文件夹中
                    multipartFile.transferTo(new File(save+"\\"+fileNewName));
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }else{
                return "";
            }

        }

        return "redirect:/upload";
    }


}

 

运行:

结果:

 以ajax的方式,进行文件上传

前端代码:

 <form action="#"  method="post" enctype="multipart/form-data">
      宠物图片: <input type="file" name="filename" id="update_pet_img" style="width: 70px">
 </form>
 <img style="margin-top: 50px" class="update_img" src="" width="100px" height="100px" alt="未上传图片">

 

 js脚本

<script src="${pageContext.request.contextPath}/js/jquery-1.12.3.js"></script>
<script>
 //修改区域-->,点击选择文件的时候实现自动上传图片。
    $("#update_pet_img").change(function () {
        var form = $(this).closest("form");
        update_file_img(form);
    });

    //图片上传
    function update_file_img(file) {
        var formData = new FormData($(file)[0]);
        //ajax请求
        $.ajax({
            type: "post",
            url: "/imgUpload",
            data: formData,
            contentType: false,//告诉客户端不要设置Content-Type 请求头部
            processData: false,//告诉客户端不处理过程数据
            success: function (data) {//完成后的事件
                $(".update_img").attr("src", data.img_src);//data.img_src得到图片的地址
            },
            error: function (error) {//出现错误时的事件
                alert("出错啦。");
            }
        });

    }
</script>

 

 后端代码:(这里只是简单示例,练习可以适当减少)

package com.oukele.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
@RequestMapping(path = "/imgUpload")
public class FileUpload {

    /*
     * 宠物图片上传
     * */
    @PostMapping(produces = "application/json;charset=utf-8")
    @ResponseBody
    public String imgUpload(@RequestPart("filename") MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response){
        if (multipartFile.isEmpty()) {
            return "{\"error\":\"文件为空,错误格式\"}";
        }
        if (!multipartFile.getContentType().contains("image/")) {
            return "{\"error\":\"只允许上传图片的文件\"}";
        }
        if (multipartFile.getSize() > 1024 * 1024 * 1024 * 5) {
            return "{\"error\":\"图片大小不能超过5M\"}";
        }
        //图片的存储文件夹
        String save = request.getServletContext().getRealPath("/images");
        File file = new File(save);
        if (!file.exists()) {
            file.mkdirs();
        }
        String file1 = createFile(save, multipartFile);

        return file1;
    }
    //创建文件夹,格式为以日期文件名 比如 2018112 , 和 新的文件名,格式为 upload_文件名_日期.后缀名
    public String createFile(String path, MultipartFile multipartFile) {
        boolean flag = false;
        String imgpath ="";
        //创建文件夹
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        String dataFile = "/" + simpleDateFormat.format(new Date());
        path += dataFile;
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        //文件名
        String fileName = multipartFile.getOriginalFilename().substring(0, multipartFile.getOriginalFilename().indexOf("."));
        //上传文件的后缀
        String zhui = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().indexOf("."), multipartFile.getOriginalFilename().length());
        //生成新的文件名
        String fileNewName = "upload_" + fileName + "_" + simpleDateFormat.format(new Date()) + zhui;
        try {
            //将此图片存储到对应的文件夹中
            multipartFile.transferTo(new File(path + "/" + fileNewName));
             imgpath ="/images"+dataFile+"/"+ fileNewName;
            flag = true;
        } catch (Exception e) {
            flag = false;
            e.printStackTrace();
        }
        if( flag ){
            return "{\"img_src\":\""+imgpath+"\"}";
        }

        return "{\"error\":\"出现异常\"}";
    }
}

 演示:

 

posted @ 2018-11-02 14:04  追梦滴小蜗牛  阅读(1364)  评论(0编辑  收藏  举报