下面的PHP代码是从我之前编写的AngularJS/PHP应用程序中重新使用的,用于成功下载PHP生成的PowerPoint文件。
下面的JS代码是用ReactJS编写的,当调用它来读取JSON(包含在变量result中)并从api请求中检索到PHP文件生成器函数时。当我打开PowerPoint文件时,它已经损坏了。它只包含一个数字的。txt(扩展名我改变我的文件检查内容)版本的PowerPoint文件。它应该有原始的二进制内容。
我怀疑我的文件不包含正确解码的内容。我如何正确地执行解码和构造文件。
我创建了以下两段代码来输出文件内容和检索文件内容。不幸的是,JS代码中文件内容的检索会产生一个损坏的文件,该文件具有一系列个位数
0753420020807097134859119432551731005080019000916711111011610111011
…继续
中的.txt格式,而不是像
下面开头的文本那样的二进制格式。PK ‡i„U[Âÿ 2 [Content_Types].xmlµUKoÛ0¾çWº±Ò†¡ˆÓÃÚžö(Ðö h6í¨Õ
PHP
public function generateRiskSummaryPresentation()
{
//header("Content-Type: application/vnd.openxmlformats-officedocument.presentationml.presentation; charset=utf-8");
header("charset=utf8");
//header("Content-Disposition: attachment; filename=RiskSummary.pptx");
ob_start();
$oWriterPPTX = IOFactory::createWriter($this->riskPPT,'PowerPoint2007');
$oWriterPPTX->save("php://output");
$presentationContent = ob_get_contents();
ob_end_clean();
return base64_encode($presentationContent);
}
JS
getRiskReport = (riskid) => {
const requestOptions = {
method: 'GET',
mode: 'cors',
headers: {'Content-Type': 'application/json' }
};
return fetch("http://riskaim/api/riskreport/"+riskid, requestOptions)
.then(res => res.json())
.then(result => {
let content = Buffer.from(result.data, 'base64');
let file = new Blob([...content], {type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', charset: 'utf-8'});
let downloadLink = document.createElement("a");
downloadLink.setAttribute('style', 'display: none');
downloadLink.setAttribute('href', window.URL.createObjectURL(file));
downloadLink.setAttribute('target', '_blank');
downloadLink.setAttribute('downloadLink', 'RiskSummary.pptx');
downloadLink.click();
});
}
如何生成原始内容?
在Buffer.from(result.data, 'base64')
之后去掉.toString()
,用[new Uint8Array(content)]
代替[content]
,结果输出成功!
let content = Buffer.from(result.data, 'base64');
let file = new Blob([new Uint8Array(content)], {type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', charset: 'utf-8'});