前端解决

  • 通过form表单来上传文件
  • 提交形式为post
  • enctype格局为"multipart/form-data"
  • input类型为file
  • name属性必须和Controller中办法的形参名称统一

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><h2>用户注册</h2><form action="/register" method="post" enctype="multipart/form-data">    用户名:<input type="text" name="username"><br><br>    明码  :<input type="password" name="password"><br><br>    头像  :<input type="file" name="uploadFile"><br><br>    <input type="submit" value="提交"></form></body></html>

    后端解决

创立一个数据库用来保留登录的用户名,明码,文件名

咱们能够写一个工具类

public class  UUIDUtils  {     public  static  String  createNewUUID(){         String uuid = UUID.randomUUID().toString();        //如果要把uuid的-去掉替换成空字符串 而后须要把32为字符串变成64字符串        uuid = uuid.replace("-", "");        return uuid+uuid;    }}

实体类User

@Datapublic class User {     private Integer id;    private String username;    private String password;    private String filename;}

Controller

@Controllerpublic class  UserController  {     @Autowired    private UserService userService;    /**     * 显示注册画面     * @return     */    @RequestMapping("/show")    public String show(){         return "/page/register.html";    }    @PostMapping("/register")    public String register(User user, @RequestParam("uploadFile") MultipartFile uploadFile){         System.out.println("用户:"+user);        System.out.println("文件:"+uploadFile);        //创立本地文件        //思考文件名,文件名要是惟一的 必须要保障每一个用户注册上传的图片,文件等,必须保留成惟一的文件名        //Java技术 Java UUID User Unique ID 自身用于给用户指定惟一的ID,能够用它来产生惟一的随机字符串        //uuid默认返回的是32位字母组成的随机字符串,反复的概率简直为0        //创立惟一文件名        String fileName= UUIDUtils.createNewUUID();        //咱们须要文件的后缀也应该不是写死的,前端上传的后缀是啥,咱们保留的就是什么        //获取原生文件的文件名        String originalFilename = uploadFile.getOriginalFilename();        System.out.println(originalFilename);        //创立文件的后缀名        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));        //创立新的文件门路        String filePath=fileName+suffix;        File srcFile = new File("D:/springboot/download/img/"+filePath);        try {             //把前端传送的文件保留在本地中            uploadFile.transferTo(srcFile);        } catch (IOException e) {             e.printStackTrace();        }        user.setFilename(filePath);        try {             userService.register(user);        } catch (Exception e) {             e.printStackTrace();        }        return "";    }}

Service

public interface  UserService  {     void  register(User user)  throws  Exception;}

Service实现类

@Servicepublic class  UserServiceImpl  implements  UserService  {     @Autowired    private UserMapper userMapper;    @Override    public  void  register(User user)  throws  Exception  {         userMapper.insert(user);    }}

Mapper

@Mapperpublic interface  UserMapper  {     @Insert("insert into user values(default,#{username},#{password},#{filename})")    void  insert(User user);}

物理门路和虚构门路映射

先筹备好页面jsp

<%@page language="java" isELIgnored="false" pageEncoding="UTF-8" contentType="text/html; UTF-8" %>  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    <!DOCTYPE html>    <html lang="en">      <head>        <meta charset="UTF-8">        <title>Title</title>      </head>      <body>        <h2>文件的上传</h2>        <form action="/file/upload" method="post" enctype="multipart/form-data">          文件上传:<input type="file" name="uploadFile"><br><br>          <input type="submit" value="提交">        </form>      </body></html>
<%@page language="java" isELIgnored="false" pageEncoding="UTF-8" contentType="text/html; UTF-8" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <img src="/img/${filePath}">图像</img>    门路:${filePath}</body></html>

编写Controller

@Controller@RequestMapping("/file")public class  FileUploadController  {     /**    * 显示画面    * @return    */    @RequestMapping("/show")    public String show(){         return "file.jsp";    }    @RequestMapping(value =  "/upload",method =  RequestMethod.POST)    public String fileUpload(MultipartFile uploadFile, HttpSession session){         //利用uuid创立惟一的字符串 让这个字符串作为文件名        String fileName = UUIDUtils.createNewUUID();        //获取上传文件的文件名        String originalFilename = uploadFile.getOriginalFilename();        //获取后缀名        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));        //创立文件保留门路        String filePath=fileName+suffix;        File srcFile=new File("D:/springboot/download/img/"+filePath);        //把前端文件保留在本地        try {             uploadFile.transferTo(srcFile);            //把文件寄存在本地的文件门路保留在session域中            session.setAttribute("filePath", filePath);        } catch (IOException e) {             e.printStackTrace();        }        //咱们心愿网页上能够把图片显示进去        System.out.println("文件寄存门路:"+filePath);        return "show.jsp";    }}

不过,咱们能够发现,当咱们点击提交的时候,图片还是无奈显示

@Configurationpublic class  WebConfig  implements  WebMvcConfigurer  {     //实现资源的虚构门路和物理门路的映射    @Override    public  void  addResourceHandlers(ResourceHandlerRegistry registry)  {          registry.addResourceHandler("/img/**")                 .addResourceLocations("file:"+"D:\\springboot\\download\\img\\");    }}

addResourceHandler(“xxx”) 用于指定对外裸露的拜访门路,addResourceLocations(“xxx”) 用于指定文件搁置门路