栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

16. 文件上传

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

文章目录
    • 16.1 应用实例
      • 16.1.1 需求说明
    • 16.1.2 代码实现
      • 16.1.3 完成注册用户/上传图片 -测试
        • 16.1.3.1 启动项目
        • 16.1.3.2 浏览器:http://localhost:8080/upload.html
        • 16.1.3.3 页面效果
      • 16.1.4 课后作业-扩展要求
      • 16.1.5 课后作业解答


16.1 应用实例 16.1.1 需求说明
  • 演示 Spring-Boot 通过表单注册用户,并支持上传图片
  • 回顾 SpringMVC 文件上传 ==> 文章链接
16.1.2 代码实现
  1. 创建 templates/upload.html,要求头像只能选择一个,而宠物可以上传多个图片



    
    upload



16. 文件上传

注册用户~

用户名:

电 邮:

年 龄:

职 位:

头 像:

宠 物:


  1. 创建 D:xjs_springbootspringboot-usersyssrcmainjavacomxjsspringbootcontrollerUploadController.java
package com.xjs.springboot.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;


@Controller
@Slf4j
public class UploadController {

    //处理转发到用户注册-完成文件上传页面
    @GetMapping("/upload.html")
    public String uploadPage() {
        return "upload"; //thymeleaf 视图解析,转发到 templates/upload.html
    }

    //处理用户的注册请求-包括处理文件上传
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("name") String name,
                         @RequestParam("email") String email,
                         @RequestParam("age") Integer age,
                         @RequestParam("job") String job,
                         @RequestParam("header") MultipartFile header,
                         @RequestParam("photos") MultipartFile[] photos) throws IOException {

        //输出获取到的信息
        log.info("上传的信息 name={} email={} age={} job={} header={} photos={}",
                name, email, age, job, header.getSize(), photos.length);

        //我们将文件保存到指定的目录,比如 D:\temp_upload
        //1. 先将文件保存到指定的目录 比如 D:\temp_upload
        if (!header.isEmpty()) { //处理头像
            //获取上传的文件的原文件名
            String originalFilename = header.getOriginalFilename();
            header.transferTo(new File("D:\temp_upload\" + originalFilename));
        }

        //处理宠物图片
        if (photos.length > 0) {
            for (MultipartFile photo : photos) { //遍历
                if (!photo.isEmpty()) {
                    String originalFilename = photo.getOriginalFilename();
                    photo.transferTo(new File("D:\temp_upload\" + originalFilename));
                }
            }
        }

        //==============================================

        //2. 后面再演示把文件保存到动态创建的目录中
        //   比如:类路径下的
        //(1) 先得到类路径(运行的时候)
        String path = ResourceUtils.getURL("classpath:").getPath();
        //log.info("path={}", path);

        //(2)动态创建指定的目录
        File file = new File(path + "static/images/upload/");
        if (!file.exists()) {//如果目录不存在 就创建
            file.mkdirs();
        }

        //处理头像
        if (!header.isEmpty()) {
            String originalFilename = header.getOriginalFilename();
            //这里需要指定保存文件的绝对路径,即:
            //log.info("保存文件的绝对路径={}", file.getAbsolutePath());
            // 输出即可看出路径拼接的时候是否需要加 "/"
            //保存到动态创建的目录
            header.transferTo(new File(file.getAbsoluteFile() + "/" + originalFilename));
        }

        //处理宠物图片
        if (photos.length > 0) {
            for (MultipartFile photo : photos) {
                String originalFilename = photo.getOriginalFilename();
                //保存到动态创建的目录
                photo.transferTo(new File(file.getAbsoluteFile() + "/" + originalFilename));
            }
        }

        return "注册用户成功/文件上传成功";
    }

}

  1. 修改 WebConfig 配置,放行/upload.html 和 /upload 请求
package com.xjs.springboot.config;

import com.xjs.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class WebConfig  {

    //@Override
    //public void addInterceptors(InterceptorRegistry registry) {
    //
    //    //注册自定义拦截器LoginInterceptor
    //    registry.addInterceptor(new LoginInterceptor())
    //            .addPathPatterns("
@Controller
@Slf4j
public class UploadController {

    //处理转发到用户注册-完成文件上传页面
    @GetMapping("/upload.html")
    public String uploadPage() {
        return "upload"; //thymeleaf 视图解析,转发到 templates/upload.html
    }

    //处理用户的注册请求-包括处理文件上传
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("name") String name,
                         @RequestParam("email") String email,
                         @RequestParam("age") Integer age,
                         @RequestParam("job") String job,
                         @RequestParam("header") MultipartFile header,
                         @RequestParam("photos") MultipartFile[] photos) throws IOException {

        //输出获取到的信息
        log.info("上传的信息 name={} email={} age={} job={} header={} photos={}",
                name, email, age, job, header.getSize(), photos.length);

        //我们将文件保存到指定的目录,比如 D:\temp_upload
        //1. 先将文件保存到指定的目录 比如 D:\temp_upload
        //if (!header.isEmpty()) { //处理头像
        //    //获取上传的文件的原文件名
        //    String originalFilename = header.getOriginalFilename();
        //    header.transferTo(new File("D:\temp_upload\" + originalFilename));
        //}

        //处理宠物图片
        //if (photos.length > 0) {
        //    for (MultipartFile photo : photos) { //遍历
        //        if (!photo.isEmpty()) {
        //            String originalFilename = photo.getOriginalFilename();
        //            photo.transferTo(new File("D:\temp_upload\" + originalFilename));
        //        }
        //    }
        //}

        //==============================================

        //2. 后面再演示把文件保存到动态创建的目录中
        //   比如:类路径下的
        //(1) 先得到类路径(运行的时候)
        String path = ResourceUtils.getURL("classpath:").getPath();
        //log.info("path={}", path);

        //(2)动态创建指定的目录
        File file = new File(path + "static/images/upload/");
        if (!file.exists()) {//如果目录不存在 就创建
            file.mkdirs();
        }

        //处理头像
        if (!header.isEmpty()) {
            String originalFilename = header.getOriginalFilename();
            String fileName = UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_" +originalFilename;
            //这里需要指定保存文件的绝对路径,即:
            //log.info("保存文件的绝对路径={}", file.getAbsolutePath());
            // 输出即可看出路径拼接的时候是否需要加 "/"
            //保存到动态创建的目录
            //header.transferTo(new File(file.getAbsoluteFile() + "/" + originalFilename));
            header.transferTo(new File(file.getAbsoluteFile() + "/" + fileName));
        }

        //处理宠物图片
        if (photos.length > 0) {
            for (MultipartFile photo : photos) {
                String originalFilename = photo.getOriginalFilename();
                String fileName = UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_" +originalFilename;
                //保存到动态创建的目录
                //photo.transferTo(new File(file.getAbsoluteFile() + "/" + originalFilename));
                photo.transferTo(new File(file.getAbsoluteFile() + "/" + fileName));
            }
        }

        return "注册用户成功/文件上传成功";
    }

}

  1. 编写一个工具类,根据当前日期生成对应目录即可
  • 编写工具类 WebUtils.java
package com.xjs.springboot.utils;


import java.text.SimpleDateFormat;
import java.util.Date;


public class WebUtils {

    //定义一个文件上传的路径
    public static String UPLOAD_FILE_DIRECTORY = "static/images/upload/";

    //编写方法, 根据当前日期生成目录 年/月/日
    public static String getUploadFileDirectory() {
        return UPLOAD_FILE_DIRECTORY + new SimpleDateFormat("yyyy/MM/dd").format(new Date());
    }

    //测试
    public static void main(String[] args) {

        System.out.println(WebUtils.getUploadFileDirectory());
    }

}

  • 修改 UploadController.java

package com.xjs.springboot.controller;

import com.xjs.springboot.utils.WebUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;


@Controller
@Slf4j
public class UploadController {

    //处理转发到用户注册-完成文件上传页面
    @GetMapping("/upload.html")
    public String uploadPage() {
        return "upload"; //thymeleaf 视图解析,转发到 templates/upload.html
    }

    //处理用户的注册请求-包括处理文件上传
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("name") String name,
                         @RequestParam("email") String email,
                         @RequestParam("age") Integer age,
                         @RequestParam("job") String job,
                         @RequestParam("header") MultipartFile header,
                         @RequestParam("photos") MultipartFile[] photos) throws IOException {

        //输出获取到的信息
        log.info("上传的信息 name={} email={} age={} job={} header={} photos={}",
                name, email, age, job, header.getSize(), photos.length);

        //我们将文件保存到指定的目录,比如 D:\temp_upload
        //1. 先将文件保存到指定的目录 比如 D:\temp_upload
        //if (!header.isEmpty()) { //处理头像
        //    //获取上传的文件的原文件名
        //    String originalFilename = header.getOriginalFilename();
        //    header.transferTo(new File("D:\temp_upload\" + originalFilename));
        //}

        //处理宠物图片
        //if (photos.length > 0) {
        //    for (MultipartFile photo : photos) { //遍历
        //        if (!photo.isEmpty()) {
        //            String originalFilename = photo.getOriginalFilename();
        //            photo.transferTo(new File("D:\temp_upload\" + originalFilename));
        //        }
        //    }
        //}

        //==============================================

        //2. 后面再演示把文件保存到动态创建的目录中
        //   比如:类路径下的
        //(1) 先得到类路径(运行的时候)
        String path = ResourceUtils.getURL("classpath:").getPath();
        //log.info("path={}", path);

        //(2)动态创建指定的目录
        File file = new File(path + WebUtils.getUploadFileDirectory());
        if (!file.exists()) {//如果目录不存在 就创建
            file.mkdirs();
        }

        //处理头像
        if (!header.isEmpty()) {
            String originalFilename = header.getOriginalFilename();
            String fileName = UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_" +originalFilename;
            //这里需要指定保存文件的绝对路径,即:
            //log.info("保存文件的绝对路径={}", file.getAbsolutePath());
            // 输出即可看出路径拼接的时候是否需要加 "/"
            //保存到动态创建的目录
            //header.transferTo(new File(file.getAbsoluteFile() + "/" + originalFilename));
            header.transferTo(new File(file.getAbsoluteFile() + "/" + fileName));
        }

        //处理宠物图片
        if (photos.length > 0) {
            for (MultipartFile photo : photos) {
                String originalFilename = photo.getOriginalFilename();
                String fileName = UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_" +originalFilename;
                //保存到动态创建的目录
                //photo.transferTo(new File(file.getAbsoluteFile() + "/" + originalFilename));
                photo.transferTo(new File(file.getAbsoluteFile() + "/" + fileName));
            }
        }

        return "注册用户成功/文件上传成功";
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1041066.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号