通过json数据结构将xlsx数据从php传输到javascript

时间:2014-09-09 13:03:03

标签: javascript php json encoding

从PHP Side ,我通过PHPExcel生成XLSX数据。我需要通过JSON数据结构传输xlsx数据,以获取状态,消息信息和交换数据(如果是这样)。 我使用base64编码将xsl数据编码为JSON数据结构中的字符串。

这是环境:

服务器:PHP 5.6.0 / Apache Web Server 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函数,而不是使用decodeURIComponent(..)的最后一个函数。

    如果我使用的是最后一个base64_encode版本,则会收到错误消息:URI格式错误。

    2.2 FileSaver.js是否正确使用?

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

1 个答案:

答案 0 :(得分:0)

使用解决方法关闭主题。

从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);