ホームページ  >  記事  >  Java  >  ブラウザーがプロセスを開始したにもかかわらず、Spring Boot REST サービスのダウンロードが失敗するのはなぜですか?

ブラウザーがプロセスを開始したにもかかわらず、Spring Boot REST サービスのダウンロードが失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 17:47:31162ブラウズ

 Why is my Spring Boot REST service download failing, despite the browser initiating the process?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。