从 Spring Boot 上的响应中下载无法正常工作

问题描述 投票:0回答:1

我无法从回复中下载。我不知道我做错了什么。 我尝试将内容类型更改为八位字节流、应用程序/pdf,尝试不使用“产生”。如果我在本地编写而不是下载,它会完美生成 pdf。但如果我尝试从响应中下载,它就不起作用。

我还在多个浏览器中尝试过,只是为了确定,但事实并非如此。 chrome 上的网络选项卡显示内容类型和内容处置是正确的(至少像我要求的那样正确)

我的代码有问题吗?

这是我的控制器


@RestController
@RequestMapping("/api/pdf")
public class PdfController {

    private final PdfService pdfService;

    PdfController(PdfService pdfService) {
        this.pdfService = pdfService;
    }

    @PostMapping(value = "/generate", produces = MediaType.APPLICATION_PDF_VALUE)
    public ResponseEntity<InputStreamResource> createPdf(@RequestBody PendenciasModel pendenciasModel) throws IOException {
        try {
            ByteArrayInputStream bis = pdfService.createPdf(pendenciasModel);


        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF_VALUE);
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+ pendenciasModel.getClient().getCpf() +".pdf");
        return ResponseEntity.ok().headers(headers)
                .body(new InputStreamResource(bis));
        }catch(IOException e){
            e.printStackTrace();
            return ResponseEntity.badRequest().body(null);
        }
    }


}

java spring-boot itext
1个回答
0
投票
package com.example.demoDownloadPDF;

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.NoSuchFileException;
import java.util.Map;
import java.nio.file.Files;
import java.nio.file.Paths;



@RestController
@RequestMapping("/api/pdf")
public class PdfController {
/*
    private final PdfService pdfService;

    PdfController(PdfService pdfService) {
        this.pdfService = pdfService;
    }
  */

    @PostMapping(value = "/generate")
    //public ResponseEntity<InputStreamResource> createPdf(@RequestBody PendenciasModel pendenciasModel) throws IOException {
    public ResponseEntity<InputStreamResource> createPdf(@RequestBody Map<String, String> request)  throws IOException {
        try {
            String fileName = request.get("fileName");
            String filePath = "/home/demo/Downloads/Examples/demoDownloadPDF/pdfs/" + fileName;
            System.out.println("filePath =" + filePath);
            File file = new File(filePath);
            FileSystemResource resource = new FileSystemResource(file);
            byte[] pdfContent;
            pdfContent = Files.readAllBytes(Paths.get(filePath));
            ByteArrayInputStream bis = new ByteArrayInputStream(pdfContent);
            //ByteArrayInputStream bis = pdfService.createPdf(pendenciasModel);



            HttpHeaders headers = new HttpHeaders();
            //headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF);
            headers.setContentType(MediaType.APPLICATION_PDF);
            //headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + pendenciasModel.getClient().getCpf() + ".pdf");
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);

            return ResponseEntity.ok().headers(headers).body(new InputStreamResource(bis));
            //return new ResponseEntity<>(new InputStreamResource(bis), headers, HttpStatus.OK);
        } catch (NoSuchFileException e) {
            System.err.println("NoSuchFileException>>>" + e.getMessage());
            //e.printStackTrace();
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        } catch (IOException e) {
            System.err.println("IOException>>>"+e.getMessage());
            //e.printStackTrace();
            //return ResponseEntity.badRequest().body(null);
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }
}

测试文件

将pdf文件放在

/home/demo/Downloads/Examples/demoDownloadPDF/pdfs/

例如:demo1.pdf、demo2.pdf、demo3.pdf

测试

编译

mvn clean package 

奔跑

java -jar target your-spring-boot.jar

测试

curl -X POST -H "Content-Type: application/json" -d '{"fileName": "demo1.pdf"}' -o demo1.pdf http://localhost:8080/api/pdf/generate


curl -X POST -H "Content-Type: application/json" -d '{"fileName": "demo100.pdf"}' -o demo100.pdf http://localhost:8080/api/pdf/generate

总结

因为我不知道你用的一些类别,所以只能模拟一下。以上代码可以正常下载pdf文件。不同之处在于我正在读取固定文件。您应该能够轻松地将其更改为您的写作方法。因为我已经把你所有的写法和注释都保存下来了

您的代码:

@RequestBody PendenciasModel pendenciasModel
我的测试:
@RequestBody Map<String, String> request

您的代码:

ByteArrayInputStream bis = pdfService.createPdf(pendenciasModel);

我的测试:

byte[] pdfContent;
pdfContent = Files.readAllBytes(Paths.get(filePath));
ByteArrayInputStream bis = new ByteArrayInputStream(pdfContent);

您的代码:

headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF);

我的测试:

headers.setContentType(MediaType.APPLICATION_PDF);

您的代码:

headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + pendenciasModel.getClient().getCpf() + ".pdf");

我的测试:

headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);

您的代码:

return ResponseEntity.badRequest().body(null);

我的测试:

return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

我正在测试并运行我的代码。

© www.soinside.com 2019 - 2024. All rights reserved.