我正在尝试下载 ODS 文件(Open Office 的 Calc 文件)。 我使用 Java 作为后端,使用 AngularJS 作为前端。 这是我接收和下载文件的前端代码:
vm.downloadModel = () => {
DataFactory.GET(`${URL.CTM_ODS()}/rotas/modelo`, { headers: { 'Content-Type': 'application/octet-stream' } }).then(response => {
let file = new Blob([response], { type: 'application/vnd.oasis.opendocument.spreadsheet' });
let url = window.URL || window.webkitURL;
let downloadLink = angular.element('<a></a>');
downloadLink.attr('href', url.createObjectURL(file));
downloadLink.attr('target', '_self');
downloadLink.attr('download', 'Model_Routes_OD.ods');
downloadLink[0].click();
});
}
这是我后端的端点:
@GetMapping(value = "/modelo")
@ResponseBody
public ResponseEntity<ByteArrayResource> getModelo() throws IOException {
String path = "C:\\Model_Routes_OD.ods";
File file = new File(path);
Path pathObj = Paths.get(file.getAbsolutePath());
ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(pathObj));
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getName());
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(Files.readAllBytes(pathObj).length));
headers.add(HttpHeaders.TRANSFER_ENCODING, "binary");
return new ResponseEntity<>(resource, headers, HttpStatus.OK);
}
下载的文件已损坏!我的文件有 13Kb,下载时显示 21Kb,当我尝试打开时,他说该文件“已损坏”,他可以尝试修复它,但没有成功。
最佳答案
我尝试了你的代码,API 工作正常。 您不需要在前端显式处理文件,只需下载它即可。
上述场景的示例代码:
var app = angular.module('demo', []);
app.controller('Download', function($scope, $http) {
$scope.download = function(){
var url = "http://localhost:8080/modelo"
window.open(url, "_self");
}
});
我能够完美下载文件,这里是此 example 的完整代码
关于java - 从 Rest API Java 下载 ODS/XLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510799/