SpringBoot 单文件上传和多文件上传

CSDN上的各位小伙伴们,大家晚上好!

首先先给大家来一发鸡汤,鼓励大家在学习的路上坚持到底,活到老学到老,学无止境,学海无涯,学以致用,哈哈哈。


考虑一千次,不如去做一次;犹豫一万次,不如实践一次;华丽的跌倒,胜过无谓的彷徨,将来的你,一定会感谢现在奋斗的你。


下面开始进入正题,简单 讲一下SpringBoot 上传文件的操作,大家可以借助第三方插件工具类,等都可以实现上传。本次是用的html原生file文件域进行上传,界面美不美观的咱就不看了。单文件上传和多文件上传代码几乎是一致的,这里主要讲单文件上传,多文件上传循环保存即可。

一、单文件上传

1.首先引用thymeleaf的依赖,在templates文件下新建一个upload页面,在页面中添加一个文件域提交表单。代码如下




    
    单个图片上传


    

要提一下的是 form表单上action 填后台上传提交的方法,enctype="multipart/form-data"  这句话要加

2.在自己的controller包下,新建一个UploadController 用于写保存文件的接口。并写一个返回页面的方法,代码如下

@Controller
public class UploadController {

    @RequestMapping("/upload")
    public String upload()
    {
//        ModelAndView mv=new ModelAndView();
//        mv.setViewName("upload");
//        return mv;
        return "upload";
    }
    SimpleDateFormat sdf=new SimpleDateFormat("/yyyy/MM/dd");


    @ResponseBody
    @PostMapping("/uploadform")
    public String upload(@RequestParam("fileupload") MultipartFile uploadfile, HttpServletRequest req)
    {
        String reappath=req.getSession().getServletContext().getRealPath("/upload");
        String format=sdf.format(new Date());
        File folder=new File(reappath+format);
        if(!folder.isDirectory())
            folder.mkdirs();
        String oldName=uploadfile.getOriginalFilename();
        String newName= UUID.randomUUID().toString()+oldName.substring(oldName.lastIndexOf("."),oldName.length());

        try
        {
            uploadfile.transferTo(new File(folder,newName));
            String filepath=req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+"/upload/"+format+"/"+newName;

            return  filepath;

        }
        catch(IOException expection)
        {
            System.out.println(expection.getMessage());
            return "上传出错";
        }
    }


    @ResponseBody
    @PostMapping("/uploadforms")
    public String upload(@RequestParam("fileuploads") MultipartFile [] uploadfiles, HttpServletRequest req)
    {
        String reappath=req.getSession().getServletContext().getRealPath("/upload");
        String format=sdf.format(new Date());
        File folder=new File(reappath+format);
        if(!folder.isDirectory())
            folder.mkdirs();


        try
        {
            String allpath="";
            for (int i=0;i

在这里特别要注意的是这个方法 前面的注解 是@Controller而不是 @RestController,如果写了RestController,默认为当前控制器下的所有方法皆为返回数据json类型,这样模板下的html页面就无法访问了。所以这里在控制器上写了@Controller,如果该控制器类要返回数据则在方法上加@ResponseBody即可。 这个控制器里写了两个上传 方法 一个多文件上传 一个单文件上传。

代码里面 都是获取路径,拼接日期目录,获取文件后缀名,根据uuid设置新的文件名,然后创建目录保存文件。然后拼接全路径返回到前台,这都是基本操作了,不详细介绍了。

再将一下比较重要的一个地方,才开始不知道,点击上传的时候进入方法 MultipartFile 对象一直为空,明明选择了文件,后台没有获取到,一直是null。其实这个的处理方法很简单 就是在这个参数上加一个 @RequestParam 里面填写的是与前台 对应的input  name名字,注意,这里的名字一定要对应,否则文件上传到action一直为null。

二、多文件上传

多文件上传,这里主要讲一下和单文件上传的区别

1.前台页面上面  file 文件域input标签 要加上一个允许上传多个 的 属性   multiple

2.后台接受文件的action 参数由单个文件转变为数组类型     MultipartFile [] uploadfiles

3.然后就是需要循环数组依次保存文件

 

总结,文件上传在web开发中依然很常用,使用原生的上传界面很丑,体验不好,避免不了使用一些第三方前端插件来上传,提升用户体验;但是上传文件的原理是一样的,换汤不换药。

你可能感兴趣的:(SpringBoot,java,SpringBoot,文件上传)