Zip-файл можно открыть на сервере, но не после его загрузки с помощью Angular 1 - PullRequest
0 голосов
/ 04 декабря 2018

У нас есть устаревший код, который позволяет пользователю сайта загружать файл с сервера.

До сих пор загруженных файлов было CSV, и у нас не было проблем.

ТеперьНа сервере также есть zip-файл, который содержит CSV.

Сервер генерирует zip-файл правильно ( использовал это руководство ) и на сервере, который мы можем открыть zip-файл,и правильно извлеките внутренний CSV-файл .

Проблема заключается в том, что браузер загружает ZIP-файл: внутренний CSV-файл не имеет суффикса CSV и не может быть открыт.

Ошибка, которую мы получаем (используя 7Zip):

Неожиданный конец данных

Предупреждения:

Ошибка заголовков

Есть некоторые данные послеконец данных полезной нагрузки

Код бэкэнда для обслуживания файла (работает в Spark-Java микросервисе):

    public Object handle(Request request, Response response) throws Exception {
    fileName = ...

    response.raw().setContentType("application/zip");
    response.raw().setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    try (
        FileInputStream fis = new FileInputStream(fileName);
        BufferedOutputStream bufferedOutputStream = new BufferedOutptStream(response.raw().getOutputStream());
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fis)) {
        ByteStreams.copy(bufferedInputStream, bufferedOutputStream);
    } catch (Exception e) {
         ....
    }
    return response.raw();
}

Front end код (Angular 1) для извлечения файла:

        $scope.downloadFile = function (fileName) {
        $http.get(fileName).
        success(function (data, status, headers, config) {
            var anchor = angular.element('<a/>');
            var headers = headers();
            var filename = headers['x-filename'];
            var contentType = headers['content-type']

            data = new Blob([data], {type: contentType});
            var fileUrl = URL.createObjectURL(data);

            anchor.attr({
                'href': fileUrl,
                'target': '_blank',
                'download': fileName
            })[0].click();

        }).error(function (data, status, headers, config) {
                $log.info("download  " + fileName + "  error " + status);
            }
        );
    };
...