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

yizhihongxing

下面是“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#实现的ACCESS数据库操作类完整实例

    下面我将详细讲解“C#实现的ACCESS数据库操作类完整实例”的完整攻略。 1. 准备工作 在使用C#操作ACCESS数据库之前,需要做以下准备工作: 安装ACCESS数据库驱动程序 在C#项目中添加对ACCESS数据库的引用 在代码中引入对System.Data.OleDb命名空间的引用 2. 创建ACCESS数据库连接对象 在开始对ACCESS数据库进行…

    C 2023年5月22日
    00
  • 佳能DR6030C扫描仪经常卡纸该怎么办?

    佳能DR6030C扫描仪经常卡纸的解决方法 如果佳能DR6030C扫描仪经常卡纸,可能会导致扫描效率低下,甚至使扫描仪无法使用。解决这个问题需要我们采用以下方法。 方法一:检查纸张 检查纸张是否符合佳能DR6030C扫描仪的规格要求。佳能DR6030C扫描仪支持最大的纸张尺寸是A3(11.7 x 16.5 inch)。 检查纸张的数量是否适当,过多或过少都会…

    C 2023年5月23日
    00
  • Canal监听MySQL的实现步骤

    Canal是一个基于MySQL数据库增量日志解析并监听的系统,可以实时获取MySQL数据库中的变更数据并进行处理。下面我们来详细介绍Canal监听MySQL的实现步骤: 步骤一:安装Canal服务端 Canal服务端可以使用官方发布的下载包进行安装,也可以使用Docker镜像进行部署。 以下是使用官方下载包进行安装配置的步骤: 下载Canal的发布版本,解压…

    C 2023年5月23日
    00
  • C程序 查找两个数字的最小公倍数

    首先,在你的网站上创建一个名为“C程序 查找两个数字的最小公倍数”的页面或文章,为其添加一个适当的标题。 在页面中,先简要介绍最小公倍数的概念和计算方法。可以引用一些相关的数学知识。 给出代码的具体说明。可以使用代码块标记,将代码复制到文本编辑器中然后添加到文章中。代码需要包含详细的注释,以便读者理解其逻辑。 给出一个简单示例,用于说明程序如何工作。比如,可…

    C 2023年5月9日
    00
  • Qt计时器使用方法详解

    以下是关于“Qt计时器使用方法详解”的攻略说明: 1. 概述 Qt是一款功能强大的跨平台C++应用程序开发框架,提供了很多实用的功能模块,其中就包括计时器模块,可以在Qt中轻松地实现各种计时器功能,比如实现周期性的定时任务、定时刷新界面等。本文将介绍如何使用Qt计时器,包括如何创建计时器、设置计时器参数、处理计时器事件等。 2. 创建计时器 首先,我们需要通…

    C 2023年5月22日
    00
  • C#使用Json.Net对JSON与对象的序列化与反序列化

    请听我详细讲解如何使用Json.Net库来进行C#中JSON与对象的序列化与反序列化。 一、Json.Net简介 Json.Net是一个高性能的.NET框架,它可以帮助我们在C#代码中轻松地进行JSON的读写操作。此外,Json.Net被广泛地应用于C#中处理JSON数据的需求,很多开源项目也是基于Json.Net实现的。 二、JSON与对象的序列化 1. …

    C 2023年5月23日
    00
  • C语言如何读取bmp图像

    读取BMP图像是C语言开发中的一项基础任务。下面是C语言读取bmp图像的攻略: 步骤一:打开BMP文件 C语言中读取BMP图像的第一步是打开该文件。我们可以使用标准C库文件操作函数fopen()打开文件,打开模式为“二进制读取模式”(”rb”)。以下是示例代码: FILE* bmpfile = fopen("example.bmp", &…

    C 2023年5月23日
    00
  • json转String与String转json及判断对象类型示例代码

    这里是关于”json转String与String转json及判断对象类型示例代码”的详细攻略。 json转String JSON是一种数据格式,在JavaScript中,JSON.stringify()方法可以将一个对象转换为JSON字符串。 const obj = {"name": "Tom", "age&…

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