问题的可能原因之一是缺少响应头“Content-Disposition”中的文件名参数。为此,在Spring后端中需要使用response对象来设置响应头。
下面是在Spring中设置响应头以支持文件下载的代码示例:
@GetMapping("/downloadFile")
public ResponseEntity downloadFile(@RequestParam("file") String fileName, HttpServletRequest request) {
// Load file from the file system
Resource resource = fileStorageService.loadFileAsResource(fileName);
// Try to determine file's content type
String contentType = null;
try {
contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
} catch (IOException ex) {
logger.info("Could not determine file type.");
}
// Fallback to the default content type if type could not be determined
if(contentType == null) {
contentType = "application/octet-stream";
}
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
.body(resource);
}
在上述示例中,我们使用“HttpHeaders.CONTENT_DISPOSITION”设置了响应头中的“Content-Disposition”参数,并将其值设置为“attachment”,这是告诉Fron-end将响应解释为下载文件的正确方法。我们还指定了“filename”值,以便Frontend可以为下载的文件指定名称。
当Angular前端调用此API时,它将从Spring后端接收具有正确文件名的响应,并且文件应该可以正常下载。
总之,确保正确设置响应头通常可以解决Angular前端Spring后端文件下载无法工作或损坏的问题。