簡體   English   中英

通過json數據結構將xlsx數據從php傳輸到javascript

[英]transmit xlsx data from php to javascript through json data structure

從PHP Side ,我通過PHPExcel生成XLSX數據。 我需要通過JSON數據結構傳輸xlsx數據,以獲取狀態,消息信息並交換數據(如果有)。 我使用base64編碼將xsl數據編碼為JSON數據結構中的字符串。

這是環境:

服務器 :PHP 5.6.0 / Apache Web服務器2.4.9 / Microsoft Windows 7 SP1

//XLSX data generation
$objWriter  = PHPExcel_IOFactory::createWriter($xls,"Excel2007");
ob_start();
$objWriter->save("php://output");
$xlsData = ob_get_contents();
ob_end_clean();

//xlsData is encoded in "ISO-8859-1"
$xlsData = iconv("UTF-8", "ISO-8859-1", $xlsData);
$xlsData = base64_encode($xlsData);

//JSON data struture. To exchange data between Server side (PHP) and client side (javascript)
$opResult = {status:1, messageType: 2, message = 'XLSX successfully generated', data: null};
$opResult->data = $xlsData;

$opResult = json_encode($opResult);

header("Content-type: application/json; charset=utf-8");
echo $opResult;

從Javascript方面 ,我使用php.js函數解碼base64編碼,並使用FileSaver.js將xlsx數據保存到本地文件

客戶端 :Firefox 31.0 / Windows 7 SP1提供的Javascript

xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function(){
   if( (xmlHttp.readyState == 4) && (xmlHttp.status == 200)){
     var opResult = JSON.parse(xmlHttp.responseText);
     var xlsData = base64_decode(opResult.data);
     var blob = new Blob([xlsData], {type: "application/octet-stream;charset=utf-8"});
     saveAs(blob, "report.xlsx");
  }
}
xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send(params);

問題

在PHP端,可以打開XLSX文件。 在客戶端,Microsoft Excel無法打開xlsx數據文件。 我收到損壞文件的錯誤消息,...

PHP端發送的和javascript端接收的Base64數據相同。

有人已經遇到過這樣的問題嗎? 還是有人使用過這種機制在PHP和Javascript之間交換數據?

有人可以幫助我以下詢問嗎:

  1. 從PHP方面:

    1.1是否需要編碼為UTF-8?

    由於UTF是javascript端使用的編碼字符,因此我使用了iconv函數,但沒有成功。 我在JavaScript端獲得了無法讀取的xlsx文件

    1.2是否可以將base64編碼僅分配給JSON數據結構的一個數據成員:

     $opResult->status = 1; $opResult->messageType = 2; $opResult->message = 'XLSX successfully generated'; $opResult->data = base64_encode($xlsData); 

    1.3 json_encode函數是否需要選項參數?

     //I tried json_encode($opResult, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); 

    但是在客戶端總是有同樣的問題

  2. 從Javascript方面

    2.1我使用的是base64_decode函數的舊版本,而不是使用帶有解碼URIComponent(..)的最后一個版本。

    如果使用最新的base64_encode版本,則會收到錯誤消息:URI格式錯誤。

    2.2是否正確使用FileSaver.js?

     var blob = new Blob([xlsData], {type: "application/octet-stream;charset=utf-8"}); saveAs(blob, "report.xlsx"); 

謝謝你的幫助

使用解決方法關閉了該主題。

從PHP方面:

1.1無需使用UTF-8編碼

1.2二進制數據設置為URL數據

  url = "data:". $mimeType. ";base64,".base64_encode(xlsData);

1.3無需將選項參數傳遞給json_encode函數。

因此,代碼變為:

//XLSX data generation
$objWriter  = PHPExcel_IOFactory::createWriter($xls,"Excel2007");
ob_start();
$objWriter->save("php://output");
$xlsData = ob_get_contents();
ob_end_clean();

//JSON data struture. To exchange data between Server side (PHP) and client side (javascript)
$opResult = {status:1, messageType: 2, message = 'XLSX successfully generated', data: null};
$opResult->data = "data:". $mimeType. ";base64,".base64_encode($xlsData);
$opResult = json_encode($opResult);

header("Content-type: application/json; charset=utf-8");
echo $opResult;

從javascript方面:

無需使用Blob和Filesaver.js API

代碼變為:

xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function(){
if( (xmlHttp.readyState == 4) && (xmlHttp.status == 200)){
  var opResult = JSON.parse(xmlHttp.responseText);
  var a = document.createElement("a");
  document.body.appendChild(a);
  a.style = "display: none";
  a.href = opResult.data;
  a.click();
  window.URL.revokeObjectURL(opResult.data);
 }
}
xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send(params);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM