Загрузить ODS / XLS из Rest API Java - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь загрузить файл ODS (файл Cal c Open Office). Я использую 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);
}

Загруженный файл поврежден ! Мой файл имеет 13 КБ, и при загрузке показывает 21 КБ, когда я пытаюсь открыть, он говорит, что файл «поврежден», и он может попытаться исправить это, но безуспешно.

1 Ответ

0 голосов
/ 30 апреля 2020

Я попробовал ваш код, и 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");
    }
});

Я могу загрузить файл отлично, и вот полный код для этого примера

...