Wir haben Spring Cloud für die Projektentwicklung verwendet und einer der Hauptdienste (einschließlich des Hochladens von Bildern), der SpringBoot-Mikrodienst, befand sich in der Testumgebung. Da dieses Projekt bereits gestartet ist, wurden für dieses Projekt schon lange keine relevanten Release-Änderungen und Verpackungen vorgenommen.
Aufgrund des aktuellen Bedarfs für dieses Projekt muss Partei A einige neue Funktionen hinzufügen. Beim Hochladen des Kurses während des Tests muss jedoch das Kurscover hochgeladen werden, und ich habe festgestellt, dass die Bild-Upload-Schnittstelle zum Hochladen des Kurscovers einen Fehler von 500 gemeldet hat.
Ich kann die Fehlermeldung im Backend-Protokollverzeichnis nicht finden. Wenn nur das Front-End mit Front-End- und Back-End-Trennung die Schnittstelle aufruft, wird die folgende Fehlermeldung zurückgegeben: ist java.io.IOException:#🎜 🎜#Der temporäre Upload-Speicherort [/tmp/tomcat/ocalhost/ROOT] ist ungültig
Schließlich habe ich gemäß der Fehlermeldung gesucht und Ich habe festgestellt, dass das temporäre Verzeichnis von Tomcat gelöscht wurde. Schließlich habe ich einen Artikel gefunden, der die folgenden Punkte klarer erklärt:
(1) Nach dem Start des SpringBoot-Projekts erstellt das System automatisch die folgenden drei Verzeichnisse in /tmp Standardverzeichnis# 🎜🎜#
hsperfdata_root,
(3), CentOS7 bereinigt regelmäßig das temporäre Dateiverzeichnis
# 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天前的目录和文件Basierend auf den oben genannten Bedingungen können Sie sehen, dass das temporäre Verzeichnis, in das wir Dateien hochladen, regelmäßig alle 10 gereinigt wird Tage in CentOS7. Dann gab es das Problem, dass das temporäre Verzeichnis, in dem die hochgeladene Datei am Anfang des Artikels erschien, nicht existierte, sodass das Upload-Problem einen Fehler 500 meldete. Mein Kollege sagte etwas über den Start eines bestimmten Mikrodienstes und insbesondere über den Start des Gateway-Dienstes.
Allerdings kann das Hochladen durch Starten eines beliebigen SpringBoot-Mikrodienstes erreicht werden (da beim Starten eines beliebigen lokalen Mikrodienstes ein entsprechendes temporäres Verzeichnis generiert wird). Schließlich wurde ein Microservice gestartet und die Ergebnisse konnten tatsächlich hochgeladen werden.
Ich möchte das Problem nicht nur oberflächlich lösen und damit fertig sein. Basierend auf den gesuchten Artikeln und der Analyse denke ich persönlich, dass es die folgenden drei Lösungen gibt. 2. Drei Lösungen2.1. Ändern Sie die temporären Verzeichnisregeln von CentOS direkt und eindeutig durch eine verfeinerte Verwaltung Das Tomcat-Verzeichnis der hochgeladenen Dateien wird nicht gelöscht. Die Reinigungsregeln des /tmp-Verzeichnisses hängen hauptsächlich von den Einstellungen der Datei /usr/lib/tmpfiles.d/tmp.conf ab: Wir können diese Datei konfigurieren Wenn Sie beispielsweise nicht möchten, dass das System Verzeichnisse, die mit Tomcat beginnen, unter /tmp automatisch bereinigt, fügen Sie der Konfigurationsdatei den folgenden Inhalt hinzu:x /tmp/tomcat.*2.2 Geben Sie Ihren eigenen über SpringBoot an Anmerkung zur Startkonfiguration (@Configuration) Dateiverzeichnis hochladen Ändern Sie den Speicherpfad temporärer Dateien und geben Sie ein benutzerdefiniertes temporäres Nicht-CentOS7-System-Standardverzeichnis an, um zu vermeiden, dass das System das temporäre Verzeichnis regelmäßig löscht. Der Implementierungscode lautet wie folgt:
@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(); } }
spring.mvc.static-path-pattern=/upload/** spring.http.multipart.max-file-size=10MB #指定上传文件临时目录 spring.http.multipart.location=/opt/data/upload3. Ergebnisanzeige #🎜🎜 ##🎜 🎜#
4. Zusammenfassung
server.tomcat.basedir=file path
# 🎜🎜#Wenn Spring.http.multipart.location=Dateipfad konfiguriert ist und hinzugefügt werden muss.
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation("./tmp"); return factory.createMultipartConfig(); }
Wert des Typs „org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile“ konnte nicht in den erforderlichen Typ „org.springframework.web“ konvertiert werden .multipart.commons.CommonsMultipartFile“; verschachtelte Ausnahme ist java.lang.IllegalStateException: Wert vom Typ „org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile“ kann nicht in den erforderlichen Typ „org.springframework.web.multipart.commons“ konvertiert werden .CommonsMultipartFile": Keine passenden Editoren oder Konvertierungsstrategie gefunden
CommonsMultipartFile wird zum Empfangen von Dateien in springmvc verwendet, und MultipartFile wird in springboot verwendet.
Ersetzen Sie es und es wird erfolgreich sein.
Das obige ist der detaillierte Inhalt vonSo behandeln Sie die Ausnahme, wenn das temporäre Ziel des SpringBoot-Datei-Uploads gelöscht wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!