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天前的目录和文件Berdasarkan syarat di atas, ia. dapat dilihat bahawa Direktori sementara tempat kami memuat naik fail akan dibersihkan secara berkala setiap 10 hari dalam CentOS7. Jadi terdapat masalah bahawa direktori sementara tempat fail yang dimuat naik muncul pada permulaan artikel tidak wujud, jadi masalah muat naik melaporkan ralat 500. Rakan sekerja saya mengatakan sesuatu tentang memulakan perkhidmatan mikro tertentu dan secara khusus mengatakan sesuatu tentang memulakan perkhidmatan get laluan. Setelah berkata demikian, muat naik boleh dicapai dengan memulakan sebarang perkhidmatan mikro SpringBoot (kerana memulakan sebarang perkhidmatan mikro tempatan akan menjana direktori sementara yang sepadan). Akhirnya, perkhidmatan mikro telah dimulakan, dan hasilnya memang boleh dimuat naik. Saya tidak mahu hanya cuba menyelesaikan masalah sebaik sahaja masalah itu selesai. Akhirnya, berdasarkan artikel dan analisis yang dicari, saya secara peribadi berpendapat terdapat tiga penyelesaian berikut. 2. Tiga penyelesaian 2.1 Ubah suai secara langsung peraturan direktori sementara pembersihan CentOS Tentukan semua direktori sementara secara paksa, dan perhalusi pengurusan untuk fail yang dimuat naik Direktori tomcat ialah tidak dibersihkan. Peraturan pembersihan direktori /tmp bergantung terutamanya pada tetapan fail /usr/lib/tmpfiles.d/tmp.conf: Kami boleh mengkonfigurasi fail ini, contohnya, anda tidak mahu sistem secara automatik Untuk membersihkan direktori bermula dengan tomcat di bawah /tmp, tambahkan kandungan berikut pada fail konfigurasi:
x /tmp/tomcat.*2.2.2.2. @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 Prinsipnya serupa dengan penyelesaian kedua, tetapi maklumat Profil ditetapkan dalam konfigurasi SpringBoot dan dikonfigurasikan dalam fail properties/yaml: spring. .http.multipart. location= laluan fail cache anda
spring.mvc.static-path-pattern=/upload/** spring.http.multipart.max-file-size=10MB #指定上传文件临时目录 spring.http.multipart.location=/opt/data/upload3. Paparan hasil 4 🎜>
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!