私たちはプロジェクト開発に 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天前的目录和文件
x /tmp/tomcat.*
@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/upload
##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 サイトの他の関連記事を参照してください。