Spring Boot Rest サービスからファイルをダウンロードする: ダウンロード失敗のトラブルシューティング
この記事では、Spring Boot Rest サービスからファイルをダウンロードしようとしたときに発生した問題について説明します。 Spring Boot REST サービス。ブラウザでダウンロードを開始したにもかかわらず、プロセスは常に失敗します。問題の分析と考えられる解決策は次のとおりです:
サービス メソッド:
提供されたコードは、ファイルのダウンロードを担当するサービス メソッドを示しています:
<code class="java">@RequestMapping(path="/downloadFile",method=RequestMethod.GET) 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)); return ResponseEntity.ok().headers(headers).contentLength(file2Upload.length()) .contentType(MediaType.parseMediaType("application/octet-stream")) .body(i); }</code>
オプション 1:InputStreamResource の使用
提供されたコードは、ファイルから InputStreamReader を作成し、ResponseEntity とともにそれを返します。ただし、spring-core ライブラリの InputStreamResource を使用することをお勧めします。この実装はストリームのリソースを提供し、ダウンロード プロセス中にストリームが適切に処理されるようにします。
<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>
オプション 2: ByteArrayResource の使用
Spring のドキュメントでは次のように提案されています。 InputStreamResource の代わりに ByteArrayResource を利用します。このリソース タイプを使用するには、ファイル全体をバイト配列に読み取り、そこからリソースを作成する必要があります。このアプローチは、小さなファイルのパフォーマンスの向上など、特定のシナリオでは有利です。
<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>
これらのオプションのいずれかを実装すると、ダウンロードの失敗の問題が解決され、Spring Boot を介したシームレスなファイルのダウンロードが可能になります。 REST サービス。
以上がブラウザーがプロセスを開始したにもかかわらず、Spring Boot REST サービスのダウンロードが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。