SpringBoot上传临时文件被删除引起报错的解决

下面是“SpringBoot上传临时文件被删除引起报错的解决”的完整攻略,包含两条示例说明。

问题描述

在使用SpringBoot进行文件上传时,因为上传的是临时文件,所以会自动在一定时间后被删除,但是如果在这段时间内访问这个文件就会报错,如下所示:

java.io.FileNotFoundException: /var/folders/xd/m81ynvt15cv0_kyp1p13v9k00000gn/T/upload_4dbb2b6a_c82d_4758_9a3e_c275df593977148.png (No such file or directory)

解决方案

对于这个问题,可以通过在配置文件中修改上传文件的临时存储位置和存在时间来解决。

  1. 修改上传文件的临时存储位置

application.yml中增加以下配置项:

spring:
  servlet:
    multipart:
      location: /tmp     # 修改为自定义的文件夹路径

这样就将上传的临时文件放在了/tmp文件夹下,而不是默认的系统临时文件夹。这里我们将其路径修改为/tmp,如果需要修改为其他路径也可以。

  1. 修改临时文件存活时间

application.yml中增加以下配置项:

spring:
  servlet:
    multipart:
      file-size-threshold: 0
      max-file-size: 20MB
      max-request-size: 20MB
      resolve-lazily: true
      clean-up:
          cron: "0 0 0 * * *"  # 每天0点清理临时文件

其中clean-up: cron就是用来配置定时清理临时文件的时间的,表示每天的0点清理。可以根据实际情况进行配置。

示例说明

下面通过两个示例来说明这个问题的解决方案。

示例一:上传文件后立即访问

如果上传文件后立即访问,就会出现上述问题,如下所示:

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
    String originalFilename = file.getOriginalFilename();
    Path filePath = Paths.get("tmp", originalFilename);
    file.transferTo(filePath.toFile());
    byte[] bytes = Files.readAllBytes(filePath);

    return new String(bytes);
}

这个示例通过transferTo()方法将文件保存到了/tmp下,然后通过Files.readAllBytes()方法读取文件内容,并返回了一个字符串。如果在这个HTTP请求处理完成后立即访问,则会出现上述的文件不存在的错误。

通过修改配置文件中的spring.servlet.multipart.location配置项,可以将文件保存在指定位置。

spring:
  servlet:
    multipart:
      location: /uploads

这个时候再次进行本地测试,就不会出现上述报错,因为文件已经被正常保存了。

示例二:临时文件存活时间

下面我们来演示如何通过配置文件中的clean-up: cron配置项来实现临时文件存活时间的修改。

在配置文件中增加以下配置项:

spring:
  servlet:
    multipart:
      clean-up:
          cron: "0 0/5 * * * ?"  # 每5分钟清理一次

这个配置表示每5分钟清理一次临时文件。我们可以在本地启动应用,然后使用Postman来进行测试。

首先,我们上传一个大小为5MB的文件。

然后,访问上传文件的链接,可以正常访问。

等待5分钟后,重新访问这个链接,就会发现文件已经被清理了。

总之,通过修改配置文件中的spring.servlet.multipart.locationclean-up: cron配置项,就可以解决临时文件被删除引起的报错问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot上传临时文件被删除引起报错的解决 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言切割多层字符串(strtok_r strtok使用方法)

    下面就给大家讲解一下C语言中切割多层字符串的使用方法。常用的函数有strtok_r()和strtok()。 strtok_r()使用方法 该方法是线程安全的字符串分割函数。需要注意的是,strtok_r()除了是线程安全的之外,用法和一个另一个非线程安全的函数strtok()是类似的。 strtok_r()函数的基本用法 strtok_r()函数的语法如下:…

    C 2023年5月24日
    00
  • 深入C语言内存区域分配(进程的各个段)详解

    深入C语言内存区域分配(进程的各个段)详解 概述 在C语言程序运行时,会将分配的内存按照一定的方式划分到进程的各个不同的内存段中,这些内存段包括以下几种: 代码段:存放程序的可执行代码。 数据段:存放程序的全局变量和静态变量。 堆:程序在运行时动态分配内存的区域。 栈:程序在运行时用来存放局部变量、函数参数等的区域。 代码段 代码段是程序的可执行代码的内存区…

    C 2023年5月24日
    00
  • QT判断两个日期时间的大小

    判断两个日期时间的大小是一种常见的需求。在QT中,可以使用QDateTime类来实现这个功能。下面是详细的攻略: 方式一:使用QDateTime的比较运算符 QDateTime类提供了小于、小于等于、大于、大于等于、等于、不等于等比较运算符,可以通过它们来比较两个日期时间的大小。 示例1: QDateTime dt1 = QDateTime::fromStr…

    C 2023年5月22日
    00
  • C语言 位运算详解及示例代码

    C语言 位运算详解及示例代码 什么是位运算 在计算机中,数据存储采用二进制的形式,二进制位只有0和1两个取值。位运算是一种直接针对二进制位进行操作的运算,常见的位运算包括按位与、按位或、按位异或、位左移、位右移等。 位运算的分类 在C语言中,位运算可以分为3类:按位逻辑运算符、按位位移运算符和按位赋值运算符。 按位逻辑运算符 按位逻辑运算符用于操作二进制数中…

    C 2023年5月30日
    00
  • 神乐千鹤在拳皇97、98中的高级用法

    神乐千鹤在拳皇97、98中的高级用法攻略 什么是神乐千鹤? 神乐千鹤是拳皇系列游戏中的一位角色,拥有快速的移动速度和敏捷的攻击方式。她在拳皇97和98中的操作难度较高,但是如果掌握了她的高级用法,就可以轻松地击败对手。 神乐千鹤的高级用法 1. 投掷连击 神乐千鹤的投掷连击是一种非常强大的攻击方式。要进行投掷连击,首先需要进行一次投掷攻击(按下前+C),然后…

    C 2023年5月22日
    00
  • C语言编程中函数的基本学习教程

    C语言编程中函数的基本学习教程 1. 函数的定义及使用方法 C语言中函数是一块可重用的、能实现特定功能的代码块,它以函数名作为标识符,一旦定义就可以在程序的任何地方被调用。C语言中函数的定义通常包含返回值类型、函数名以及函数参数,具体格式如下: 返回值类型 函数名(参数列表) { // 函数体 } 其中,返回值类型是指函数返回值的数据类型,函数名是指函数的名…

    C 2023年5月23日
    00
  • .net core如何在网络高并发下提高JSON的处理效率详解

    首先,针对提高JSON的处理效率,我们可以从以下几方面入手: 选取高性能的JSON库 .NET Core自带了一个 Newtonsoft.Json 库,能够满足一般的需求,在处理一些复杂JSON数据时,可能会出现性能瓶颈。这时可以考虑使用其他的高性能JSON库,比如 Utf8Json、System.Text.Json等等。在具体应用时,可以对比测试不同库的性…

    C 2023年5月23日
    00
  • JSON 基本使用教程

    JSON 基本使用教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读并编写,便于机器解析和生成。它基于JavaScript语言的一个子集,因此它的使用十分广泛。本文将详细讲解JSON的使用。 1. 数据结构 JSON的数据结构只包含以下两种类型: 对象(Object):由花括号{}包含,键值对之间用逗…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部