我有一个小的web应用程序,它从表单收集数据,通过ajax发送到spring引导服务器。服务器生成pdf文件并将其作为字节数组发送回。然后我想一个pdf被打开在新的标签,但我看到空pdf那里,这是我的问题。这是ajax方法:
function sendJson(json) {
$.ajax({
url: "/pdf/create",
type: "POST",
data: json,
contentType: "application/json",
success: function (data) {
alert('Success');
openFile(data)
},
error: function (e) {
console.log('Was trying to send data, but error occurred. ' + json);
alert('Error sending data to server');
}
});
}
然后我根据接收到的数据创建一个blob并打开它。
function openFile(byte) {
var file = new Blob([byte], {type: "application/pdf"});
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
}
这是我的spring boot控制器:
@PostMapping(value = "/pdf/create")
public ResponseEntity<?> preparePdf(@RequestBody String data) throws IOException {
System.out.println("Data input: " + data);
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> dataObject = mapper.readValue(data, Map.class);
try {
return pdfService.createPdfFromTemplate(dataObject);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.badRequest().body(HttpStatus.BAD_REQUEST);
}
}
处理过程如下:
public ResponseEntity<Resource> createPdfFromTemplate(Map<String, Object> dataObject) throws IOException {
// data saved to DB. PDF is generated and saved locally
String filename = "generated_file.pdf";
File pdf = new File(filename);
byte[] fileBytes = FileUtils.readFileToByteArray(pdf);
ResponseEntity.BodyBuilder res = ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM);
return res.body(new ByteArrayResource(fileBytes));
}
生成的pdf中的文本是西里尔文,但我不认为问题出在这里,或一些编码。我想我错过了一些重要的事情。有时我看到一些观点认为,通过ajax或post方法是不好的,但发送json数据并接收生成的文件似乎是合乎逻辑的。有什么好主意吗。
1条答案
按热度按时间0yg35tkg1#
希望它对某人有用。我在服务器端使用
Base64.getEncoder().encodeToString(fileBytes)
作为一个身体对我的React。在js中打开文件之前,我将其转换为arraybuffer,如下所示:文件在一个新的选项卡中打开。