Spring Boot文件上传及回显(单多文件)

Spring Boot文件上传及回显(单多文件),第1张

Spring Boot文件上传及回显(单/多文件)  一、单文件上传  1.前端页面



    
    Spring Boot 文件上传测试




需要注意的是在文件上传时需要设置form表单的enctype属性为“multipart/form-data”。该页面中包含 “选择文件”和“文件上传”的按钮 

2.后端接收
@Controller
public class UploadController {
    // 文件保存路径为在D盘下的upload文件夹,可以按照自己的习惯来修改
    private final static String FILE_UPLOAD_PATH = "D:\upload\";
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ResponseBody
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上传失败";
        }
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //生成文件名称通用方法
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        Random r = new Random();
        StringBuilder tempName = new StringBuilder();
        tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);
        String newFileName = tempName.toString();
        try {
            // 保存文件
            byte[] bytes = file.getBytes();
            Path path = Paths.get(FILE_UPLOAD_PATH + newFileName);
            Files.write(path, bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传成功";
    }
}

@RequestParam中文件名称属性需要与前端页面中input文件输入框设置的name属性一致。

D:upload这种写法是在Windows系统下的路径写法,如果项目部署在Linux系统中的话,写法与此不同。比如想要把文件上传到/opt/newbee/upload目录下,就需要把路径设置的代码改为private final static String FILE_UPLOAD_PATH = "/opt/newbee/upload/"。 

二、多文件 (文件名相同)  1.前端页面



    
    Spring Boot 多文件上传测试(file name 相同)




多文件上传页面与单文件上传页面类似,不同点是新增了4个文件输入框,文件输入框的name属性统一命名为files,文件名完全一致。

2.后端接收
@RequestMapping(value = "/uploadFilesBySameName", method = RequestMethod.POST)
@ResponseBody
public String uploadFilesBySameName(@RequestPart MultipartFile[] files) {
  if (files == null || files.length == 0) {
    return "参数异常";
  }
  if (files.length > 5) {
    return "最多上传5个文件";
  }
  String uploadResult = "上传成功,地址为:
"; for (MultipartFile file : files) { String fileName = file.getOriginalFilename(); if (StringUtils.isEmpty(fileName)) { //表示无文件信息,跳出当前循环 continue; } String suffixName = fileName.substring(fileName.lastIndexOf(".")); //生成文件名称通用方法 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); Random r = new Random(); StringBuilder tempName = new StringBuilder(); tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName); String newFileName = tempName.toString(); try { // 保存文件 byte[] bytes = file.getBytes(); Path path = Paths.get(FILE_UPLOAD_PATH + newFileName); Files.write(path, bytes); uploadResult += "/upload/" + newFileName + "
"; } catch (IOException e) { e.printStackTrace(); } } return uploadResult; }

第一,文件参数在接收时的代码改动。在多文件上传并接收参数时使用的是@RequestPart注解,且接收的文件参数是一个数组MultipartFile。而单文件在上传时使用的是@RequestParam注解,接收的文件是单个对象。

第二,文件在保存时增加循环逻辑。多文件保存的处理方式与单文件在上传时比较类似,只是增加了循环逻辑,对接收的MultipartFile数组中每一个文件进行存储 *** 作,最后拼接文件的地址信息并返回。

另外一个需要注意的知识点,多文件上传在接收参数时,参数名称files需要完全对应input框中的name属性。比如本次演示,在upload-same-file-name.html文件中所有文件输入框的name属性都是files;在后端处理时,uploadFilesBySameName()方法的参数名称也定义为files,两个名称是对应的。如果所有文件输入框的name属性都改为uploadFiles,那么uploadFilesBySameName()方法的参数名称也需要改为uploadFiles,否则接收的文件对象数组为空。

三、多文件上传(文件名不同)  1.前端



    
    Spring Boot 多文件上传测试(file name 不同)




 各个input文件输入框的name属性不同。

2.后端接收
@RequestMapping(value = "/uploadFilesByDifferentName", method = RequestMethod.POST)
@ResponseBody
public String uploadFilesByDifferentName(HttpServletRequest httpServletRequest) {
  List multipartFiles = new ArrayList<>(8);
  // 如果不是文件上传请求则不处理
  if (!standardServletMultipartResolver.isMultipart(httpServletRequest)) {
    return "请选择文件";
  }
  // 将 HttpServletRequest 对象转换为 MultipartHttpServletRequest 对象,之后读取文件
  MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) httpServletRequest;
  Iterator iter = multiRequest.getFileNames();
  int total = 0;
  while (iter.hasNext()) {
    if (total > 5) {
      return "最多上传5个文件";
    }
    total += 1;
    MultipartFile file = multiRequest.getFile(iter.next());
    multipartFiles.add(file);
  }
  if (CollectionUtils.isEmpty(multipartFiles)) {
    return "请选择文件";
  }
  if (multipartFiles != null && multipartFiles.size() > 5) {
    return "最多上传5个文件";
  }
  String uploadResult = "上传成功,地址为:
"; for (int i = 0; i < multipartFiles.size(); i++) { String fileName = multipartFiles.get(i).getOriginalFilename(); if (StringUtils.isEmpty(fileName)) { //表示无文件信息,跳出当前循环 continue; } String suffixName = fileName.substring(fileName.lastIndexOf(".")); //生成文件名称通用方法 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); Random r = new Random(); StringBuilder tempName = new StringBuilder(); tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName); String newFileName = tempName.toString(); try { // 保存文件 byte[] bytes = multipartFiles.get(i).getBytes(); Path path = Paths.get(FILE_UPLOAD_PATH + newFileName); Files.write(path, bytes); uploadResult += "/upload/" + newFileName + "
"; } catch (IOException e) { e.printStackTrace(); } } return uploadResult; }

在读取文件信息时的逻辑是自行实现的代码逻辑,首先调用isMultipart()方法判断当前请求是否为文件上传请求,如果不是则不进行处理。需要注入StandardServletMultipartResolver 调用其方法。

@Autowired
private StandardServletMultipartResolver standardServletMultipartResolver;

回显 

Spring Boot 项目中通常使用自定义静态资源映射目录,以此来实现文件上传整个流程的闭环。比如在前文件上传实际案例,在文件上传到upload目录后,会增加一个自定义静态资源映射配置,使得在upload下的静态资源可以通过该映射地址被访问到。

1.新增配置类,实现代码如下所示: 

@Configuration
public class NeeBeeMallWebMvcConfigurer implements WebMvcConfigurer {

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/upload/**").addResourceLocations("file:D:\upload\");
    }
}

通过以上代码配置,所有以“/upload/”开头的静态资源在请求时都会映射到D盘的upload目录下。路径的设置与前文中上传文件的设置目录类似,不同系统的文件路径的写法不同(比如Linux和Windows)。同时需要注意在设置静态资源映射路径时,路径前需要添加“file:”前缀。 

配置

只要在pom.xml文件中引入了spring-boot-starter-web依赖即可直接调用文件上传功能。虽然不用配置也可以使用文件上传功能,但是开发人员在文件上传时也可能有一些特殊的需求。因此,这里需要对Spring Boot中MultipartFile的常用设置进行介绍,其配置项和默认值如下所示。

spring.servlet.multipart.enabled

是否支持 multipart 上传文件,默认支持

spring.servlet.multipart.file-size-threshold

文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,(默认值 0 ,一般情况下不用特意修改)

spring.servlet.multipart.location

上传文件的临时目录

spring.servlet.multipart.max-file-size

最大支持文件大小,默认 1 M ,该值可适当的调整

**spring.servlet.multipart.max-request-size=10Mb **

最大支持请求大小,默认 10 M

spring.servlet.multipart.resolve-lazily

判断是否要延迟解析文件(相当于懒加载,一般情况下不用特意修改

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5717967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存