Kami menggunakan Spring Cloud untuk pembangunan projek, dan salah satu perkhidmatan utama (melibatkan muat naik imej) perkhidmatan mikro SpringBoot berada dalam persekitaran ujian. Oleh kerana projek ini telah pun dilancarkan, tiada perubahan atau pembungkusan yang berkaitan telah dibuat untuk projek ini sejak sekian lama.
Disebabkan keperluan baru-baru ini untuk Pihak A menambah beberapa fungsi baharu pada projek ini. Walau bagaimanapun, apabila memuat naik kursus semasa ujian, kulit kursus perlu dimuat naik, dan saya mendapati bahawa antara muka muat naik imej untuk memuat naik kulit kursus melaporkan ralat sebanyak 500.
Saya tidak dapat mencari mesej ralat dalam direktori log hujung belakang. Apabila hanya bahagian hadapan dengan bahagian hadapan dan bahagian belakang yang berasingan memanggil antara muka, mesej ralat berikut dikembalikan
Tidak dapat menghuraikan permintaan servlet berbilang bahagian;
pengecualian bersarang ialah java.io .IOException:
Lokasi muat naik sementara [/tmp/tomcat/ocalhost/ROOT] tidak sah
Akhir sekali, saya mencari mengikut mesej ralat dan mendapati bahawa direktori sementara tomcat adalah dipadamkan. Akhirnya, saya menjumpai artikel yang menerangkan perkara berikut dengan lebih jelas:
(1) Selepas projek SpringBoot dimulakan, sistem secara automatik akan mencipta tiga direktori berikut dalam direktori /tmp secara lalai
hsperfdata_root,
tomcat.************.8080, (penghujungnya ialah penghujung projek)
tomcat-docbase.********.8080
(2) , Multipart (data bentuk-), lalai adalah untuk mencipta fail sementara dalam direktori kedua
(3 CentOS7 kerap membersihkan direktori fail sementara
Peraturan pembersihan direktori /tmp bergantung terutamanya pada tetapan fail /usr/lib/tmpfiles.d/tmp.conf Kandungan konfigurasi lalai ialah:# 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
Masalah dan penyelesaian muat naik fail SpringBoot
Penyelesaian:
server.tomcat.basedir=file path
Jika spring.http.multipart.location=file path dikonfigurasikan , anda perlu menambah laluan ini.
Buat kelas yang mengandungi kaedah berikut:
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation("./tmp"); return factory.createMultipartConfig(); }
Mulakan semula untuk berkuat kuasa.
Gagal menukar nilai jenis "org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile" kepada jenis yang diperlukan "org.springframework.web.multipart.commons .CommonsMultipartFile"; pengecualian bersarang ialah java.lang.IllegalStateException: Tidak boleh menukar nilai jenis "org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile" kepada jenis yang diperlukan "org.springframework.web.multipart.commons tiada penyunting atau strategi penukaran yang sepadan ditemui
CommonsMultipartFile digunakan untuk menerima fail dalam springmvc, dan MultipartFile digunakan dalam springboot.
Ganti dan ia akan berjaya.
Atas ialah kandungan terperinci Cara mengendalikan pengecualian apabila sasaran sementara muat naik fail SpringBoot dipadamkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!