Heim  >  Artikel  >  Java  >  So behandeln Sie die Ausnahme, wenn das temporäre Ziel des SpringBoot-Datei-Uploads gelöscht wird

So behandeln Sie die Ausnahme, wenn das temporäre Ziel des SpringBoot-Datei-Uploads gelöscht wird

王林
王林nach vorne
2023-05-15 19:16:141781Durchsuche

1. Geschäftshintergrund

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,

    tomcat.******* ****** *.8080, (das Ende ist das Ende des Projekts)
  • tomcat-docbase.********.8080
  • #🎜🎜 #

  • (2) Bei der Verarbeitung einer Anfrage mit Multipart (Formulardaten) wird standardmäßig eine temporäre Datei im zweiten Verzeichnis #🎜🎜 erstellt #
  • # 🎜🎜#

    (3), CentOS7 bereinigt regelmäßig das temporäre Dateiverzeichnis

Die Reinigungsregeln des Verzeichnisses /tmp hängen hauptsächlich von /usr/ ab. lib/tmpfiles.d/tmp.conf Dateieinstellungen, der Standardkonfigurationsinhalt lautet:

# 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ösungen

2.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();
    }
}

2.3 Das Prinzip ähnelt der zweiten Lösung, aber die Profilinformationen werden in der SpringBoot-Konfiguration

Configure in den Eigenschaften/YAML festgelegt Datei: spring. http.multipart.location= Ihr Cache-Dateipfad

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

3. Ergebnisanzeige

#🎜🎜 ##🎜 🎜#

4. Zusammenfassung

Wenn wir auf ein Problem stoßen, sehen wir möglicherweise nur, dass das Problem oberflächlich gelöst wurde. Aber als Technologie sollten wir uns mit den Ursachen befassen. Ich bin auch dem Internet sehr dankbar, das es vielen großartigen Experten ermöglicht, die von ihnen entdeckten Probleme und Lösungen zu teilen. Gleichzeitig werden auch die Prinzipien erläutert, die dabei helfen, das Problem von der Grundursache her zu lösen.

Probleme und Lösungen beim Hochladen von SpringBoot-Dateien

1: Codefehler

So behandeln Sie die Ausnahme, wenn das temporäre Ziel des SpringBoot-Datei-Uploads gelöscht wird

Mehrteilige Servlet-Anfrage konnte nicht analysiert werden; verschachtelt Ausnahme ist java.io.IOException: Der temporäre Upload-Speicherort [D:xyqbtestworkTomcatlocalhostxyqb fsmarvels-core-v2] ist ungültig

So behandeln Sie die Ausnahme, wenn das temporäre Ziel des SpringBoot-Datei-Uploads gelöscht wird

Lösung:

#🎜🎜 #Es gibt keine temporäres Verzeichnis zum Hochladen von Dateien in Springboot, daher wird der obige Fehler gemeldet. Sie müssen das temporäre Dateiverzeichnis in der Anwendungskonfigurationsdatei angeben

server.tomcat.basedir=file path
# 🎜🎜#Wenn Spring.http.multipart.location=Dateipfad konfiguriert ist und hinzugefügt werden muss.

Erstellen Sie eine Klasse, die die folgenden Methoden enthält:

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("./tmp");
    return factory.createMultipartConfig();
}

Neu starten, damit sie wirksam werden.

二:Codefehler

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

Lösung:

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen