ホームページ  >  記事  >  Java  >  SpringBootファイルアップロードの一時対象が削除された場合の例外処理方法

SpringBootファイルアップロードの一時対象が削除された場合の例外処理方法

王林
王林転載
2023-05-15 19:16:141697ブラウズ

1. ビジネスの背景

私たちはプロジェクト開発に Spring Cloud を使用し、主要なサービス (画像のアップロードを含む) の 1 つである SpringBoot マイクロサービスがテスト環境にありました。このプロジェクトはすでに開始されているため、このプロジェクトに対して関連する変更やパッケージ化は長い間行われていません。

当事者 A が最近このプロジェクトにいくつかの新しい機能を追加する必要があるため。ただし、テスト中にコースをアップロードする場合、コースの表紙をアップロードする必要があり、コースの表紙をアップロードするための画像アップロード インターフェイスで 500 のエラーが報告されることがわかりました。

バックエンド ログ ディレクトリにエラー メッセージが見つかりません。フロントエンドとバックエンドが分かれているフロントエンドのみが、インターフェイスを呼び出すときに次のエラー メッセージを返します。

マルチパート サーブレット リクエストを解析できませんでした。
ネストされた例外は java.io.IOException です。 :
一時アップロード場所 [/tmp/tomcat/ocalhost/ROOT] が無効です

最終的に、エラー プロンプトに従って検索したところ、tomcat の一時ディレクトリが削除されていることがわかりました。最後に、次の点をより明確に説明している記事を見つけました:

(1) SpringBoot プロジェクトが開始されると、システムはデフォルトで /tmp ディレクトリに次の 3 つのディレクトリを自動的に作成します。

  • hsperfdata_root,

  • tomcat.************.8080, (末尾はプロジェクトの終わり)

  • tomcat-docbase.************.8080

(2)、マルチパート (フォーム データ)、デフォルトでは 2 番目のディレクトリに一時ファイルが作成されます

(3)。CentOS7 は定期的に一時ファイル ディレクトリ # をクリーンアップします。

# #/tmp ディレクトリのクリーニング ルールは、主に /usr/lib/tmpfiles.d/tmp.conf ファイルの設定に依存します。デフォルトの構成内容は次のとおりです:

# 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天前的目录和文件

Based on上記の条件では、CentOS7 ではファイルをアップロードする一時ディレクトリが 10 日ごとに定期的にクリーンアップされることがわかります。

記事の冒頭でアップロードされたファイルが存在する一時ディレクトリが存在しないという問題があったため、アップロードの問題でエラー 500 が報告されました。私の同僚は、特定のマイクロサービスの開始について何かを言い、具体的にはゲートウェイ サービスを開始するだけで十分だと言いました。

そうは言っても、SpringBoot マイクロサービスを開始すると、アップロードを実行できます (ローカル マイクロサービスを開始すると、対応する一時ディレクトリが生成されるため)。最後に、マイクロサービスが開始され、実際に結果をアップロードすることができました。

問題が解決したらすぐに問題を解決しようとするつもりはありません。最後に、検索された記事と分析に基づいて、個人的には次の 3 つの解決策があると考えています。

2. 3 つの解決策

2.1. CentOS クリーンアップ一時ディレクトリ ルールを直接変更する

すべての一時ディレクトリを強制的に直接指定し、アップロードされたファイルの管理を改善するディレクトリはクリアされません。

/tmp ディレクトリのクリーニング ルールは、主に /usr/lib/tmpfiles.d/tmp.conf ファイルの設定に依存します。

このファイルは、次のように構成できます。 /tmp の下の tomcat で始まるディレクトリをクリーンアップするには、次の内容を設定ファイルに追加します:

x /tmp/tomcat.*

2.2. SpringBoot 起動設定アノテーションを使用して独自のアップロード ファイル ディレクトリを指定します。 (@Configuration)

システムが一時ディレクトリを定期的にクリアしないように、一時ファイルのストレージ パスを変更し、CentOS7 以外のカスタムのデフォルト一時ディレクトリを指定します。実装コードは次のとおりです

@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. 原理は 2 番目のソリューションと似ていますが、プロファイル情報は SpringBoot 構成

Configure in theproperties/yaml file: spring に設定されます。 http.multipart. location= キャッシュ ファイル パス

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

3. 結果の表示

SpringBootファイルアップロードの一時対象が削除された場合の例外処理方法

SpringBootファイルアップロードの一時対象が削除された場合の例外処理方法##4. 概要

問題に遭遇したとき、私たちは問題が表面的に解決したようにしか見えないかもしれません。しかし、テクノロジーとして、その原因を掘り下げる必要があります。また、多くの優れた専門家が発見した問題や解決策を共有できるインターネットにも非常に感謝しています。同時に原理も解説しており、問題を根本原因から解決するのに役立ちます。


SpringBoot ファイルのアップロードで発生した問題と解決策

1: コード エラー

マルチパート サーブレット リクエストを解析できませんでした。ネストされた例外は java.io です。 IOException: 一時的なアップロードの場所 [D:xyqbtestworkTomcatlocalhostxyqb fsmarvels-core-v2] が無効です

解決策:

スプリングブートにはファイルをアップロードするための一時ディレクトリがないため、上記のレポートが報告されます エラー、アプリケーション構成ファイルで一時ファイル ディレクトリを指定する必要があります

server.tomcat.basedir=file path

If spring.http.multipart.location=file pathが構成されている場合は、このパスを追加する必要があります。

次のメソッドを含むクラスを作成します:

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

これは再起動後に有効になります。

2: コード エラー

タイプ「org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile」の値を必要なタイプ「org.springframework.web.multipart.commons」に変換できませんでした.CommonsMultipartFile"; ネストされた例外は java.lang.IllegalStateException です: タイプ「org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile」の値を必要なタイプ「org.springframework.web.multipart.commons.CommonsMultipartFile」に変換できません:一致するエディターまたは変換戦略が見つかりません

解決策:

CommonsMultipartFile は springmvc でファイルを受信するために使用され、MultipartFile は springboot で使用されます。

これを置き換えると成功します。

以上がSpringBootファイルアップロードの一時対象が削除された場合の例外処理方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。