• 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=" 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":"出现异常"}";
        }
    }

     演示:

  • 相关阅读:
    一步步用新浪SAE免费教大家搭建个人博客(wordpress 3.0.4 for SAE )
    欢迎大家来访西北狼网络乌托邦
    教大家如何让新浪SAE上安装wordpress实现伪静态
    CSDN 600万用户数据信息泄露并道歉
    推荐5款好用的屏幕录像软件
    IPv6无法解决全部安全问题
    详解STP以及工作过程
    如何在WordPress中实现彩色标签云
    EIGRP和RIP的一个综合性很强的实验(变态实验之一)
    查看系统等待的sql
  • 原文地址:https://www.cnblogs.com/oukele/p/9895912.html
Copyright © 2020-2023  润新知