Maison  >  Article  >  Java  >  Comment gérer l'exception lorsque la cible temporaire du téléchargement du fichier SpringBoot est supprimée

Comment gérer l'exception lorsque la cible temporaire du téléchargement du fichier SpringBoot est supprimée

王林
王林avant
2023-05-15 19:16:141785parcourir

1. Expérience professionnelle

Nous avons utilisé Spring Cloud pour le développement de projets, et l'un des principaux services (impliquant le téléchargement d'images) du microservice SpringBoot est dans l'environnement de test. Étant donné que ce projet a déjà été lancé, aucun changement ou emballage pertinent n'a été apporté à ce projet depuis longtemps.

En raison des besoins récents de la partie A pour ce projet, de nouvelles fonctions ont été ajoutées. Cependant, lors du téléchargement du cours pendant le test, la couverture du cours doit être téléchargée et j'ai constaté que l'interface de téléchargement d'images pour télécharger la couverture du cours signalait une erreur de 500.

Je ne trouve pas le message d'erreur dans le répertoire des journaux backend. Seul le front-end avec séparation front-end et back-end renvoie le message d'erreur suivant lors de l'appel de l'interface

Impossible d'analyser la demande de servlet multipart ;
l'exception imbriquée est Java .io.IOException :#🎜 🎜#L'emplacement de téléchargement temporaire [/tmp/tomcat/ocalhost/ROOT] n'est pas valide

Enfin, j'ai cherché en fonction du message d'erreur et j'ai trouvé que le répertoire temporaire de Tomcat a été supprimé. Enfin, j'ai trouvé un article qui expliquait plus clairement les points suivants :

(1) Une fois le projet SpringBoot démarré, le système créera automatiquement les trois répertoires suivants dans le /tmp. répertoire par défaut# 🎜🎜#

    hsperfdata_root,
  • tomcat.******* **** *.8080, (la fin est la fin du projet)
  • tomcat-docbase.********.8080#🎜 🎜##🎜🎜 #
  • (2) Lors du traitement d'une requête à l'aide de Multipart (form-data), la valeur par défaut est de créer un fichier temporaire dans le deuxième répertoire
  • # 🎜🎜## 🎜🎜#
(3), CentOS7 nettoie régulièrement le répertoire des fichiers temporaires

Les règles de nettoyage du répertoire /tmp dépendent principalement de /usr/lib/ tmpfiles.d/tmp.conf Paramètres des fichiers, le contenu de configuration par défaut est :

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d           #   清理/tmp下10天前的目录和文件
v /var/tmp 1777 root root 30d       #   清理/var/tmp下30天前的目录和文件

Sur la base des conditions ci-dessus, vous pouvez voir que le répertoire temporaire dans lequel nous téléchargeons les fichiers sera nettoyé régulièrement tous les 10 jours dans CentOS7. Ensuite, il y a eu le problème que le répertoire temporaire où les fichiers téléchargés apparaissaient au début de l'article n'existait pas, donc le problème de téléchargement a signalé une erreur 500. Mon collègue a parlé du démarrage d'un certain microservice et a spécifiquement dit qu'il suffisait de démarrer le service de passerelle.

Cela dit, le téléchargement peut être réalisé en démarrant n'importe quel microservice SpringBoot (car le démarrage de n'importe quel microservice local générera un répertoire temporaire correspondant). Finalement, un microservice a été lancé et les résultats ont effectivement pu être téléchargés.

Je ne veux pas simplement résoudre le problème de manière superficielle et en finir avec lui. Enfin, sur la base des articles et analyses recherchés, je pense personnellement qu’il existe les trois solutions suivantes.

2. Trois solutions

2.1. Modifier directement les règles du répertoire temporaire de nettoyage CentOS

Spécifier directement tous les répertoires temporaires de manière peu claire par violence. ne pas effacer le répertoire Tomcat des fichiers téléchargés.

Les règles de nettoyage du répertoire /tmp dépendent principalement des paramètres du fichier /usr/lib/tmpfiles.d/tmp.conf :

On peut configurer ce fichier , par exemple, vous Si vous ne souhaitez pas que le système nettoie automatiquement les répertoires commençant par Tomcat sous /tmp, ajoutez le contenu suivant au fichier de configuration :

x /tmp/tomcat.*

2.2. via l'annotation de configuration de démarrage SpringBoot (@Configuration) Téléchargez le répertoire de fichiers

Modifiez le chemin de stockage des fichiers temporaires et spécifiez un répertoire temporaire par défaut du système non CentOS7 personnalisé, afin d'éviter que le système n'efface régulièrement le répertoire temporaire . Le code d'implémentation est le suivant

@Configuration
public class MultipartConfig { 
    /**
     * 文件上传临时路径
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        String location = System.getProperty("user.dir") + "/data/upload/tmp";
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            tmpFile.mkdirs();
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }
}

2.3. Le principe est similaire à la deuxième solution, mais les informations de profil sont définies dans la configuration de SpringBoot

Configure dans les propriétés/yaml. file: spring http.multipart.location= Votre chemin de fichier cache

spring.mvc.static-path-pattern=/upload/**
spring.http.multipart.max-file-size=10MB
#指定上传文件临时目录
spring.http.multipart.location=/opt/data/upload

3 Affichage des résultats

#🎜🎜 ##🎜 🎜#

4. Résumé

Lorsque nous rencontrons un problème, nous pouvons seulement voir que le problème a été résolu en surface. Mais en tant que technologie, nous devrions nous pencher sur ses causes. Je suis également très reconnaissant envers Internet, qui permet à de nombreux grands experts de partager les problèmes et les solutions qu'ils ont découverts. Dans le même temps, les principes sont également expliqués, ce qui aidera à résoudre le problème à la racine.

Problèmes de téléchargement de fichiers SpringBoot et solutions

Comment gérer lexception lorsque la cible temporaire du téléchargement du fichier SpringBoot est supprimée1 : Erreur de code

Comment gérer lexception lorsque la cible temporaire du téléchargement du fichier SpringBoot est suppriméeImpossible d'analyser la demande de servlet en plusieurs parties imbriquée ; l'exception est java.io.IOException : l'emplacement de téléchargement temporaire [D:xyqbtestworkTomcatlocalhostxyqb fsmarvels-core-v2] n'est pas valide

Solution :

#🎜🎜 #Il n'y a pas répertoire temporaire pour télécharger des fichiers dans Springboot, donc l'erreur ci-dessus sera signalée. Vous devez spécifier le répertoire de fichiers temporaires dans le fichier de configuration de l'application

server.tomcat.basedir=file path

#. 🎜🎜#If Spring.http.multipart.location=le chemin du fichier est configuré et doit être ajouté.

Créez une classe qui contient les méthodes suivantes :

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("./tmp");
    return factory.createMultipartConfig();
}
Redémarrez pour prendre effet.

Deux : Erreur de code

Échec de la conversion de la valeur de type "org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile" en type requis "org.springframework.web.multipart.commons.CommonsMultipartFile" ; l'exception imbriquée est Java ; .lang.IllegalStateException : impossible de convertir la valeur de type "org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile" en type requis "org.springframework.web.multipart.commons.CommonsMultipartFile": aucun éditeur correspondant ou stratégie de conversion trouvé

Solution :

CommonsMultipartFile est utilisé pour recevoir des fichiers dans springmvc, et MultipartFile est utilisé dans springboot.

Remplacez-le et ce sera réussi.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer