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
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 :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
(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# 🎜🎜#
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.
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
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
#🎜🎜 ##🎜 🎜#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 solutions1 : Erreur de code
Impossible 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
@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!