Zip-файл в порядке на стороне сервера, но поврежден после обслуживания на стороне клиента - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь заархивировать кучу файлов изображений и csv в zip-файл на стороне сервера и отправить его клиенту в браузере для загрузки.Zip-файл отлично работает на клиентской стороне, но версия, передаваемая клиенту в ответе, выдает ошибку 21 - каталог при разархивировании.Что мне здесь не хватает?

Ошибка, которую я получил при попытке открыть утилитой архивирования, была «Ошибка 21 - каталог»

Ошибка, которую я получил с Unarchiver, заключается в том, что файл архива неполон.

Ошибка, которую я получил при распаковке, была

jcl$ unzip compliment.zip 
Archive:  compliment.zip
??
caution:  zipfile comment truncated
error [compliment.zip]:  missing 3231972691 bytes in zipfile
  (attempting to process anyway)
error [compliment.zip]:  attempt to seek before beginning of zipfile
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)

Похоже, что она может быть либо повреждена, либо не передана в двоичном формате, поэтому я попытался установить тип ответа MIME "application / zip" и«application / octet-stream» и получение его в том же формате в виде большого двоичного объекта на клиенте javascript.Но я все еще получаю те же ошибки.

Серверная сторона

public Response serve(String uri, Method _method, Map<String, String> headers, Map<String, String> params, Map<String, String> formFields) {
    Method method = (Method) _method;
    Response response = null;
    try {
        if (Method.PUT.equals(method)) {
            if ("/".equals(uri)) {
                response = index();
            } else {
                File zipFile = getZipByName(params);
                FileInputStream fis = null;
                try {
                    if (zipFile.exists()) {
                        fis = new FileInputStream(zipFile);
                    } else
                        Log.d("FOF :", "File does not exist:");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                response = newChunkedResponse(Response.Status.OK, "application/zip", fis);
            }
            response.addHeader("Access-Control-Allow-Origin", "*");
            return response;
        }
    } catch (Exception e) {
        Log.d(TAG, "serve exception", e);
    }
}

Клиентская сторона

<code>function zip(name) {
    $.ajax({
        type: 'put',
        url: '/zip/name?' + $.param({name: name}),
        success: function (data) {
            save(name + ".zip", data, 'application/zip');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            reveal('ERROR: <br/><pre>' + jqXHR.responseText + '
', 10000);}}). done (function (data) {открыть (имя + ".zip генерируется");});} функция save (имя файла, данные, dataType) {var blob = new Blob ([data], {type: dataType});if (window.navigator.msSaveOrOpenBlob) {// IE10 + window.navigator.msSaveBlob (blob, filename);} else {// Другие var elem = window.document.createElement ('a');elem.href = window.URL.createObjectURL (blob);elem.download = имя файла;document.body.appendChild (эль);elem.click ();document.body.removeChild (эль);}}

Ожидаемый результат состоит в том, что после загрузки zip-файла на стороне клиента его можно разархивировать без ошибок, а содержимое будет таким же, как на стороне сервера

...