Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan perkhidmatan fail dan storan melalui Spring Boot

Bagaimana untuk melaksanakan perkhidmatan fail dan storan melalui Spring Boot

PHPz
PHPzasal
2023-06-22 12:26:30912semak imbas

Dengan perkembangan teknologi Internet, perkhidmatan fail dan storan telah menjadi komponen yang diperlukan untuk pelbagai aplikasi, sebagai rangka kerja untuk membina aplikasi Java peringkat perusahaan dengan cepat, juga mempunyai kelebihan unik dalam merealisasikan Fail dan Perkhidmatan storan . Artikel ini akan memperkenalkan cara melaksanakan perkhidmatan fail dan storan melalui Spring Boot.

1. Pemprosesan fail dalam Spring Boot

Spring Boot menyediakan satu set kaedah pemprosesan fail Melalui antara muka Sumber dan ResourceLoader Spring, kami boleh mendapatkan fail tempatan, fail di bawah laluan kelas, dan sumber rangkaian dll. .

1.1 Operasi fail setempat

Semasa proses pembangunan Spring Boot, kita boleh menggunakan kaedah getResource antara muka ResourceLoader untuk mendapatkan objek Sumber bagi fail yang dinyatakan Contoh kod adalah seperti berikut:

@ResourceLoader
ResourceLoader resourceLoader;

File file = new File("D:/image.jpg"); //指定文件路径(绝对路径)
Resource resource = resourceLoader.getResource("file:" + file.getAbsolutePath()); //获取文件Resource对象
InputStream inputStream = resource.getInputStream(); //获取文件输入流

Antaranya, ResourceLoader ialah antara muka pemuat sumber yang disediakan oleh Spring Ia boleh menyuntik contoh kelas pelaksanaannya secara automatik melalui Autowired dengan menandai anotasi @ResourceLoader. Kaedah getResource() digunakan untuk mendapatkan objek Sumber bagi laluan fail yang ditentukan Di sini kami menentukan laluan mutlak melalui protokol "fail:".

1.2 Operasi fail Classpath

Dalam aplikasi Spring Boot, kita boleh meletakkan fail sumber yang berkaitan dengan projek Web (seperti fail konfigurasi) di bawah classpath dan mendapatkan rujukan Sumber melalui ClassPathResource contoh kod adalah seperti berikut :

ClassPathResource classPathResource = new ClassPathResource("config.properties"); //获取配置文件Resource对象
InputStream inputStream = classPathResource.getInputStream(); //获取配置文件输入流

Kelas ClassPathResource menyokong awalan sistem fail seperti "classpath:" dan "file:" apabila memuatkan sumber daripada laluan kelas aplikasi Kod ini menunjukkan bahawa apabila ia tidak dinyatakan, lalai digunakan. Awalan laluan "fail:" berkaitan dengan awalan sistem fail.

1.3 Operasi fail rangkaian

Selain fail dalam laluan tempatan dan laluan kelas, Spring Boot juga boleh mengendalikan fail pada rangkaian melalui objek URLResource Contoh kod adalah seperti berikut:

String url = "http://img.iplaysoft.com/wp-content/uploads/2019/free-images/free_stock_photo.jpg";
Resource resource = new UrlResource(url); //获取网络资源Resource对象
InputStream inputStream = resource.getInputStream(); //获取网络资源输入流

Antaranya, kelas UrlResource boleh mendapatkan fail sumber daripada rangkaian, dan URL alamat rangkaian perlu dihantar sebagai parameter pembina.

2. Muat naik fail dalam Spring Boot

Dalam pembangunan aplikasi Spring Boot sebenar, muat naik fail adalah keperluan biasa Dalam Spring Boot kita boleh menggunakan kelas MultipartFile dan MultipartResolver parser untuk melengkapkan muat naik fail operasi.

2.1 Kelas MultipartFile

Kelas MultipartFile Spring menyediakan cara yang mudah dan konsisten untuk memuat naik satu atau lebih fail. Ia ialah jenis parameter kaedah pemprosesan MVC yang digunakan di bawah anotasi @RequestParam, seperti:

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    //具体文件上传操作
    return "success";
}

Apabila memuat naik fail, anda perlu menentukan operasi muat naik tertentu dan tetapkan laluan menyimpan fail dan parameter lain yang berkaitan . Contoh kod adalah seperti berikut:

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    // 获取文件名
    String fileName = file.getOriginalFilename();
    // 设置保存路径
    String filePath = "D:/upload/";
    File dest = new File(filePath + fileName);
    try {
        file.transferTo(dest);
        // 具体业务操作
        return "success";
    } catch (IOException e) {
        e.printStackTrace();
        return "failure";
    }
}

2.2 MultipartResolver Parser

MultipartResolver ialah antara muka dalam rangka kerja Spring MVC, digunakan untuk menghuraikan data muat naik fail dalam permintaan POST. Dalam Spring Boot, kami boleh menggunakan kelas CommonsMultipartResolver terbina dalam untuk melaksanakan operasi penghuraian muat naik fail. Dalam projek Spring Boot, anda hanya perlu mengkonfigurasi objek MultipartResolver dalam fail konfigurasi Spring Contoh kod khusus adalah seperti berikut:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }
}

Contoh ini mengkonfigurasi contoh kelas CommonsMultipartResolver dan mengehadkan saiz maksimum fail yang dimuat naik. kepada 1,000,000 bait. Ambil perhatian bahawa kita mesti mendayakan @EnableWebMvc untuk mendayakan tingkah laku penyesuaian Spring MVC, membenarkan contoh kelas CommonsMultipartResolver berfungsi dengan betul.

3. Muat turun fail dalam Spring Boot

Dalam pembangunan aplikasi Spring Boot, muat turun fail juga merupakan keperluan biasa. Spring Boot menyediakan ResponseEntity untuk mewakili keseluruhan respons HTTP, yang mengandungi kod status, pengepala dan kandungan yang sepadan. Kami boleh menentukan nama dan jenis fail muat turun dengan menetapkan Pelupusan Kandungan.

3.1 Laksanakan muat turun fail

Kami boleh menggunakan anotasi @ResponseBody untuk memproses kandungan fail yang diwakili oleh tatasusunan bait yang dikembalikan oleh kaedah, dan kemudian gunakan ResponseEntity untuk mengembalikan keseluruhan badan respons HTTP.

@GetMapping("/download")
public ResponseEntity<byte[]> download() throws IOException {
    String filePath = "D:/image.jpg";
    File file = new File(filePath);
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Disposition", "attachment;filename=" + file.getName());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    byte[] bytes = FileUtils.readFileToByteArray(file);
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, HttpStatus.OK);
    return responseEntity;
}

Dalam kod di atas, kami menggunakan FileUtils untuk membaca fail ke dalam tatasusunan bait, tetapkan tatasusunan kepada HttpEntity dan mengembalikannya. Dalam HttpEntity yang dikembalikan, kami juga menentukan nama dan jenis fail supaya pelayar klien boleh memaparkan maklumat ini dalam tetingkap muat turun.

3.2 Melaksanakan berbilang muat turun fail

Dalam sesetengah kes, kami perlu memuat turun berbilang fail Kami boleh membungkus berbilang fail ke dalam fail zip untuk mencapai berbilang muat turun fail. Spring Boot menggunakan kelas ZipOutputStream yang disediakan oleh pakej java.util.zip untuk melaksanakan operasi fail zip dengan mudah Contoh kod adalah seperti berikut:

@GetMapping("/download_multi")
public ResponseEntity<byte[]> downloadMulti() throws IOException {
    String base = "D:/test/";
    File directoryToZip = new File(base);
    List<File> fileList = new ArrayList<>();
    getAllFiles(directoryToZip, fileList);
    byte[] zipBytes = getZipBytes(fileList, base);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.add("Content-Disposition", "attachment; filename="files.zip"");
    headers.setContentLength(zipBytes.length);
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(zipBytes, headers, HttpStatus.OK);
    return responseEntity;
}

private byte[] getZipBytes(List<File> fileList, String basePath) throws IOException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
    for (File file : fileList) {
        String filePath = file.getAbsolutePath().substring(basePath.length());
        ZipEntry zipEntry = new ZipEntry(filePath);
        zipOutputStream.putNextEntry(zipEntry);
        FileInputStream inputStream = new FileInputStream(file);
        IOUtils.copy(inputStream, zipOutputStream);
        inputStream.close();
        zipOutputStream.closeEntry();
    }
    zipOutputStream.close();
    byte[] bytes = outputStream.toByteArray();
    outputStream.close();
    return bytes;
}

private void getAllFiles(File dir, List<File> fileList) {
    File[] files = dir.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            getAllFiles(file, fileList);
        } else {
            fileList.add(file);
        }
    }
}

Dalam kod di atas, kami menggunakan kelas ZipOutputStream dan ByteArrayOutputStream untuk pakej. berbilang fail ke dalam satu fail zip dan mengembalikan keseluruhan badan respons HTTP melalui ResponseEntity, termasuk tatasusunan bait fail zip, nama fail dan jenis, supaya penyemak imbas klien boleh memaparkan maklumat ini dalam tetingkap muat turun.

4. Storan fail dalam Spring Boot

Dalam aplikasi praktikal, storan fail juga merupakan pautan penting. Kami boleh menyimpan fail di lokasi yang berbeza seperti storan tempatan, FTP dan objek Di sini kami akan menggunakan storan setempat sebagai contoh untuk memperkenalkan cara melaksanakan storan fail melalui Spring Boot.

4.1 Buat direktori storan

Pertama, kita perlu mencipta direktori untuk perkhidmatan storan Contoh kod adalah seperti berikut:

String fileRoot = "/data/files/";
Path rootPath = Paths.get(fileRoot).normalize().toAbsolutePath();
if (!Files.exists(rootPath)) {
    Files.createDirectories(rootPath);
}

Dalam kod di atas, kita. cipta direktori akar/ data/fail/ digunakan untuk menyimpan fail dan menyemak sama ada direktori itu wujud dan menciptanya jika ia tidak wujud.

4.2 实现文件存储服务

在Spring Boot中,实现文件存储服务也非常简单,我们可以创建一个类实现存储服务接口,具体代码示例如下:

@Service
public class FileStorageService {

    private Path fileStorageLocation;

    @Autowired
    public FileStorageService(@Value("${file.upload-dir}") String fileRoot) {
        this.fileStorageLocation = Paths.get(fileRoot).normalize().toAbsolutePath();
        try {
            Files.createDirectories(this.fileStorageLocation);
        } catch (Exception e) {
            throw new FileStorageException("Could not create the directory where the uploaded files will be stored.", e);
        }
    }

    public String storeFile(MultipartFile file) {
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        try {
            if (fileName.contains("..")) {
                throw new FileStorageException("Sorry! Filename contains invalid path sequence " + fileName);
            }
            Path targetLocation = this.fileStorageLocation.resolve(fileName);
            Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
            return fileName;
        } catch (IOException ex) {
            throw new FileStorageException("Could not store file " + fileName + ". Please try again!", ex);
        }
    }

    public Resource loadFileAsResource(String fileName) {
        try {
            Path filePath = this.fileStorageLocation.resolve(fileName).normalize();
            Resource resource = new UrlResource(filePath.toUri());
            if (resource.exists()) {
                return resource;
            } else {
                throw new MyFileNotFoundException("File not found " + fileName);
            }
        } catch (MalformedURLException ex) {
            throw new MyFileNotFoundException("File not found " + fileName, ex);
        }
    }
}

上述代码中,我们创建了一个FileStorageService类,用于实现文件存储服务,包含storeFile()和loadFileAsResource()两个方法,其中:

storeFile()方法用于存储上传的文件,可以获取文件的输入流,将文件存储到指定的存储目录中;

loadFileAsResource()方法用于加载指定文件的Resource对象,通过提供的文件名获取文件的Resource对象。

注意,我们使用@Autowired注解注入了config.properties中对应的配置文件路径,使其自动配置为文件存储的目录。

结语

通过Spring Boot的文件和存储服务,我们可以轻松实现文件操作、上传、下载和存储等操作,简单高效,可以应用于各类企业级Java应用。希望本文对大家对Spring Boot文件和存储服务的理解和实践有所帮助。

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan perkhidmatan fail dan storan melalui Spring Boot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn