我正在从API下载一个PDF文件,但得到的是一个空白的PDF。我已经测试了API端点,并能够在控制台上获得字节流,当我将其保存到文件时,它被保存,文件看起来很好。使用React将相同的响应返回到前端,我可以在响应中看到PDF字节流。但是,我看不到内容。当我从我的本地打开下载的PDF时,它说文件是damaged or corrupted
。我已经看了很多例子,并遵循相同的模式,但我认为我在这里遗漏了一些东西。
我的API Java端点定义如下所示
@GetMapping(value = "/fetchFile")
public ResponseEntity<byte[]> fetchFile(@RequestParam final String key) {
FileResponse response = myService.readFile(key);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + key.substring(key.lastIndexOf('/') + 1) + "\"");
return Mono.just(ResponseEntity.ok().headers(httpHeaders).contentLength(response.getContentLength())
.contentType(MediaType.parseMediaType(response.getContentType()))
.body(response.getResponseBytes()));
}
前端:
rounterFetchFile.js
router.get('/', (request, resp) => {
axios({
method: 'get',
baseURL: 'http://mybackend.apibase.url',
responseType: 'blob',
url: '/fetchFile',
params: {
fileKey: 'myfile.pdf'
}
})
.then(response => {
return resp.send(response.data)
})
.catch(error => {
console.error(error)
return resp.status(error.response.status).end()
})
})
以myFileComoponent.js
为单位
//一个从rounterFetchFile.js读取响应的函数
const getDocumentOnClick = async () => {
try {
var {data} = await pullMyPDF()
var blob = new Blob([data], { type: "application/pdf" });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "myFileName.pdf";
link.click();
} catch (e) {
console.log(e)
}
}
给你
var {data} = await pullMyPDF()
正在返回以下内容,我对比了一下 Postman 返回的结果,结果是一样的,react也显示生成的文件大小不为空,我找不到哪里错了x1c 0d1x
以下是API端点对fetchFile
的响应
2条答案
按热度按时间bis0qfac1#
我有一个类似的问题,我修复了它:
当响应类型是blob并且在头中接受“application / pdf”时,使用该配置完成工作;)......
hsgswve42#
对我有用的是从控制器发送base64字节。
美国石油学会:
前端:
我希望这能解决你的问题。