Почему скачанный файл Excel "поврежден" - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над веб-приложением, которое загружает отчет Excel, сгенерированный API-интерфейсом. Выполнение вызова в почтальоне возвращает файл, который открывается без проблем. При загрузке через веб-приложение файл поврежден, и Excel не смог это исправить. Если я открою непоправимо поврежденный файл в notepad ++ и сохраню его без внесения каких-либо изменений, он теперь будет поврежден, но исправим в Excel. Кроме того, все три файла идентичны в соответствии с шестнадцатеричным редактором.

РЕДАКТИРОВАТЬ: У меня нет доступа к API, генерирующему Excel, поэтому я не могу предоставить этот код. В целях отладки я использую файл на сервере, и возникает та же проблема, поэтому он кажется где-то на моей стороне. Промежуточная функция API -

function exportDebuggy($request, $fileSource)
{   
    $resData = array(
        "success" => false,
        "response" => array(),
        "message" => ""
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $fileSource);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_ENCODING , "");
    curl_setopt($ch, CURLOPT_HEADER, false);
    $data = curl_exec($ch);
    $err = curl_error($ch);

    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if ($err)
    {
        $resData['message'] = "cURL Error #:" . $err;
    }
    else if( $code === 401 )
    {
        $resData['message'] = "Client session has expired. Please re login.";
    }
    else
    {
        $resData = "";
    }

    return $resData;
}

, а js-код, который выполняет вызов и выполняет сохранение, -

function exportDebuggy()
{
        var xmlhttp = new XMLHttpRequest();
        var endpoint = "/wp-json/data-tracker/exportDebug";

        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == XMLHttpRequest.DONE) {
                if (xmlhttp.status == 200)
                {
                    var data = window.URL.createObjectURL(xmlhttp.response);
                    var link = document.createElement('a');
                    link.href = data;
                    link.download="transactionsDownloaded.xlsx";
                    link.click();
                }
                else if (xmlhttp.status == 400)
                {
                    alert('There was an error 400');
                }
                else
                {
                    alert('something else other than 200 was returned');
                }
            }
        };

        xmlhttp.open("GET", endpoint, true);
        xmlhttp.setRequestHeader( 'X-WP-Nonce', userID );
        xmlhttp.responseType = "blob";
        xmlhttp.send();
}
...