通过json数据结构将xlsx数据从php传输到javascript
transmit xlsx data from php to javascript through json data structure
从PHP端,我通过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端发送的Base64数据和javascript端接收的Base64相同。
有人已经遇到这样的问题了吗?或者有人使用这样的机制在PHP和Javascript之间交换数据吗?
有人能帮我处理以下审讯吗:
从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);
但在客户端总是有同样的问题
从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");
感谢您的帮助
使用变通方法关闭主题。
从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);
- AJAX和php脚本后添加的表单元素未传输到$_POST
- 如何使用jquery将数据从PHP传输到Javascript
- 通过 ajax 将数据传输到 php
- 如何通过jQuery Ajax在HTML和PHP之间来回传输json字符串
- 如何在 php 中传输值
- AJAX和PHP数据传输不起作用
- 使用 ajax 将 JavaScript 数据传输到 PHP
- Jquery到PHP数组的传输
- AJAX 传输页面 PHP.
- 如何将多行输出传输到另一个 php 文件以处理数据
- 将 PHP 表单数据传输到 JS 窗口
- 将多维数组从 mysql 传输到 php 再到 javascript
- 如何将会话 php 数据从 PHP 传输到 JS
- 从 PHP 到 JavaScript 的传输值不一致
- ajax(PHP和Javascript)的问题 - 如何正确传输
- 通过json数据结构将xlsx数据从php传输到javascript
- 将数据库信息从php传输到mysql_fetch_array时没有按预期工作
- 使用函数将DOMDocument从PHP传输到Javascript
- jQuery-通过ID将数据从PHP传输到JavaScript+jQuery
- 以json形式从php传输数据,然后将其存储在全局对象中