springboot文件上传

本文介绍了如何在SpringBoot项目中配置单文件上传,并解决了多文件上传时遇到的字符串越界问题。通过实例展示了HTML表单、配置类、Controller处理流程和自定义返回JSON数据的方法。

一、单文件上传

  1. static目录下定义HTML页面,index.html(8080默认打开页)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SpringBoot文件上传页面</title>
</head>
<body>
<form method="post" action="/upload" enctype="multipart/form-data">
   文件 : <input type="file" name="upload">  
    <input type="submit" value="上传">
</form>
</body>
  1. 在启动类里配置上传文件的配置(@Bean)
// 文件上传配置类
@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    //文件最大10M
    factory.setMaxFileSize(DataSize.parse("10240KB")); //KB,MB
    /// 设置总上传数据总大小10M
    factory.setMaxRequestSize(DataSize.parse("102400KB"));
    return factory.createMultipartConfig();
}
  1. Controller
@Controller
public class UploadController {
    
    @PostMapping("/upload")
    public @ResponseBody String upload(MultipartFile upload) {

        // 1. 获取要上传文件的文件名
        String fileName = upload.getOriginalFilename();
        System.out.println(fileName);
        // 2. 自定义上传路径
        String path = "C:\\Users\\16670\\Desktop";
        // 3. 判断路径是否存在,不存在则新建
        File file = new File(path);
        if (!file.exists()){
            file.mkdir();
        }

        // 3.改名,避免重名,定义新文件的名字
        String newName = path+File.separator+
        System.currentTimeMillis()+
        fileName.substring(fileName.lastIndexOf("."));

        try {
            upload.transferTo(new File(newName));
            return "上传成功";
        } catch (IOException e) {
           return "上传失败";
        }
    }
}

单文件上传结果:
在这里插入图片描述

二、多文件上传

  1. HTML页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SpringBoot文件上传页面</title>
</head>
<body>
<form method="post" action="/upload" enctype="multipart/form-data">
   文件1 : <input type="file" name="upload">
   文件2 : <input type="file" name="upload">
   文件3 : <input type="file" name="upload">
    <input type="submit" value="上传">
</form>
</body>
  1. 配置类与单文件的配置相同!
  2. Controller类, 遍历数组,
@Controller
public class UploadController {

    @PostMapping("/multiUpload")
    public @ResponseBody
    JsonData upload(MultipartFile[] upload) {
        // 1. 定义上传路径
        String path = "C:\\Users\\16670\\Desktop\\upload";

        // 2. 判断路径是否存在,不存在则新建
        File file = new File(path);
        if (!file.exists()){
            file.mkdir();
        }

        for (MultipartFile multipartFile : upload) {
            // 3. 循环获取要上传文件的文件名
            String fileName = multipartFile.getOriginalFilename();
            System.out.println(fileName);

            // 4.改名,避免重名,定义新文件的名字
            // 报字符串越界,查找中发现,应该是取某一个字符的位置时,出错了,原来使用lastIndexOf时要取得这个字符在被查找的字符串里没有。            
            // 解决方法,在取位置之前,先要验证一下,字符是否存在。
            assert fileName != null;
            if(fileName.lastIndexOf(".")!=-1){
                fileName = fileName.substring(0, fileName.lastIndexOf("."));
            }
            String newName = path + File.separator + System.currentTimeMillis() + fileName;

            try {
                multipartFile.transferTo(new File(newName));
            } catch (IOException e) {
                e.printStackTrace();
                return JsonData.buildFail();
            }
        }
        // return "上传成功";
        return JsonData.buildSuccess(null);
    }
}
  1. 结果:
    在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329151118537.png
在这里插入图片描述

注意1:多文件上传时,返回的类型为JsonData,这是我自定义的一个返回json字符串的类型,定义了成功和失败时的静态方法,因为前端需要的是json字符串格式,所以,定义一个JsonData类来返回json字符串。

JsonData.java

public class JsonData {
    private Integer code;
    private String msg;
    private Object data;

    public JsonData() {
    }

    public JsonData(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 成功200
    public static JsonData buildSuccess(Object data){
        return new JsonData(200,"操作成功",data);
    }
    // 失败400
    public static JsonData buildFail(){
        return new JsonData(400,"操作失败",null);
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

注意2:多文件上传有一个坑,那就是上传多个文件时,没问题,上传部分文件时,会报错,数组下标越界异常,
解决办法是: 对文件名进行lastIndexOf时要取得这个字符在被查找的字符串里是否存在。 在取位置之前,先要验证一下,字符是否存在。

if(fileName.lastIndexOf(".")!=-1){
    fileName = fileName.substring(0, fileName.lastIndexOf("."));
}
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值