Rumah  >  Artikel  >  Java  >  Cara mengendalikan pengecualian apabila sasaran sementara muat naik fail SpringBoot dipadamkan

Cara mengendalikan pengecualian apabila sasaran sementara muat naik fail SpringBoot dipadamkan

王林
王林ke hadapan
2023-05-15 19:16:141697semak imbas

1. Latar belakang perniagaan

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)

Tukar laluan storan fail sementara dan tentukan direktori sementara lalai sistem bukan CentOS7 tersuai, untuk mengelakkan sistem mengosongkan direktori sementara dengan kerap. Kod pelaksanaan adalah seperti berikut

@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/upload

3. Paparan hasil

Cara mengendalikan pengecualian apabila sasaran sementara muat naik fail SpringBoot dipadamkan

Cara mengendalikan pengecualian apabila sasaran sementara muat naik fail SpringBoot dipadamkan

4 🎜>

Apabila kita menghadapi masalah, kita mungkin hanya melihat bahawa masalah itu telah selesai di permukaan. Tetapi sebagai teknologi, kita harus menyelidiki apa yang menyebabkannya. Saya juga sangat berterima kasih kepada Internet, yang membolehkan ramai pakar yang hebat berkongsi masalah dan penyelesaian yang telah mereka temui. Pada masa yang sama, prinsip-prinsip juga dijelaskan, yang akan membantu menyelesaikan masalah dari punca.


Masalah dan penyelesaian muat naik fail SpringBoot

1: Ralat kod

Tidak dapat menghuraikan permintaan servlet berbilang bahagian ialah java.io .IOException: Lokasi muat naik sementara [D:xyqbtestworkTomcatlocalhostxyqb fsmarvels-core-v2] tidak sah

Penyelesaian:

Tiada direktori sementara untuk memuat naik fail dalam springboot, jadi laporan di atas akan dilaporkan Ralat, anda perlu menentukan direktori fail sementara dalam fail konfigurasi aplikasi

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.

Dua: Ralat kod

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

Penyelesaian:

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam