ホームページ >Java >&#&チュートリアル >SpringBootファイルアップロードの一時対象が削除された場合の例外処理方法
私たちはプロジェクト開発に 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)
@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/upload3. 結果の表示
##4. 概要
SpringBoot ファイルのアップロードで発生した問題と解決策
解決策:
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(); }
これは再起動後に有効になります。
タイプ「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 サイトの他の関連記事を参照してください。