Я работаю над веб-приложением, которое загружает отчет 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();
}