Rumah  >  Artikel  >  Java  >  Cara Muat Turun Fail daripada Perkhidmatan Spring Boot REST: Mengapa InputStreamReader Gagal dan Cara Membetulkannya dengan InputStreamResource atau ByteArrayResource?

Cara Muat Turun Fail daripada Perkhidmatan Spring Boot REST: Mengapa InputStreamReader Gagal dan Cara Membetulkannya dengan InputStreamResource atau ByteArrayResource?

Susan Sarandon
Susan Sarandonasal
2024-11-02 07:37:02259semak imbas

How to Download a File from a Spring Boot REST Service: Why InputStreamReader Fails and How to Fix It with InputStreamResource or ByteArrayResource?

Memuat turun Fail daripada Perkhidmatan Spring Boot REST

Artikel ini menangani isu memuat turun fail daripada perkhidmatan Spring Boot REST dengan berkesan. Kod yang disediakan di bawah cuba memudahkan fungsi ini:

<code class="java">@RequestMapping(path="/downloadFile",method=RequestMethod.GET)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<InputStreamReader> downloadDocument(
                String acquistionId,
                String fileType,
                Integer expressVfId) throws IOException {
        File file2Upload = new File("C:\Users\admin\Desktop\bkp\1.rtf");
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        InputStreamReader i = new InputStreamReader(new FileInputStream(file2Upload));
        System.out.println("The length of the file is : "+file2Upload.length());

        return ResponseEntity.ok().headers(headers).contentLength(file2Upload.length())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(i);
        }</code>

Walau bagaimanapun, apabila cuba memuat turun fail melalui penyemak imbas, proses itu dimulakan tetapi akhirnya gagal. Pilihan berikut boleh diterokai untuk menangani isu ini:

Pilihan 1: Menggunakan Sumber InputStreamResource

Sumber InputStreamResource boleh digunakan untuk mewakili InputStream. Ia harus dipertimbangkan apabila pelaksanaan Sumber khusus lain tidak berkenaan.

<code class="java">@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {

    // ...

    InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(resource);
}</code>

Pilihan 2: Menggunakan ByteArrayResource

Seperti yang disyorkan oleh dokumentasi untuk InputStreamResource, ByteArrayResource juga boleh bekerja.

<code class="java">@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {

    // ...

    Path path = Paths.get(file.getAbsolutePath());
    ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));

    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(resource);
}</code>

Atas ialah kandungan terperinci Cara Muat Turun Fail daripada Perkhidmatan Spring Boot REST: Mengapa InputStreamReader Gagal dan Cara Membetulkannya dengan InputStreamResource atau ByteArrayResource?. 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