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!