我无法从回复中下载。我不知道我做错了什么。 我尝试将内容类型更改为八位字节流、应用程序/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);
}
}
}
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);
我正在测试并运行我的代码。