如何解决PHP表单提交下载失败时如何向客户端发送消息
我的应用程序能够从数据库中请求和下载大量不同的文件和类型。
我当前的操作方式是使用隐藏的表单输入,它将请求提交给服务器,然后服务器进行处理并下载文件。该代码如下所示:
var action = '/download/downloader.php?actionname&filename=' + downloadfilename;
var A = document.createElement("div");
A.style.display = "none";
document.body.appendChild(A);
var formKey = 'someid';
A.innerHTML = '<form id="' + formKey + '" method="post" action="' + action + '" accept-charset="utf-8" enctype="application/x-www-form-urlencoded"' + target + '><input type="hidden" name="segmentno" id="segmentno"/> </form>';
document.getElementById(formKey).submit();
A.parentNode.removeChild(A);
用于下载XML文件的PHP端看起来像这样(所有情况都相应地设置了输出数据和标头)
// $a is the data from the database
$xmlEncode = new XMLEncode();
$xmlstring = $xmlEncode->XML_SerializeData($a);
$xmlstring = str_replace(''','''',$xmlstring);
header("Content-type: application/xml; charset=UTF-8");
header("Content-Disposition: attachment;filename=". $this->sFileName .".xml");
header("Cache-Control: max-age=0");
exit($xmlstring);
当不需要预处理(权限检查,有效的密钥检查等)时,此方法非常有用
但是,如果在此部分之前需要进行一些服务器端预处理,但失败了,我需要一种将消息发送回前端的方法。
我知道我拥有的东西将无法使用。我唯一的想法是,我将需要在单独的AJAX调用中进行预处理,然后,如果成功,请运行实际下载,但这并不理想。我研究过的其他一些解决方案包括使用fetch取回数据,然后潜在地使用库下载blob数据,但同样,我不确定是否可以确定它是否实际上是成功的服务器请求或不是。
谢谢。
解决方法
我最终要做的是为下载创建一个iFrame,该表单将以此为目标。
现在,我的下载类将把输出数组返回到下载端点,在这里我可以检查它是否通过了预处理,过程和后处理。如果未成功,则将标头设置回text / html,然后向iFrame窗口中注入一行JS,然后在其中定位目标父窗口并使用从输出数据传递来的消息调用错误函数。>
我的PHP下载端点:
if (!$aOutput['success']){
header("Content-type: text/html; charset=UTF-8");
header("Content-Disposition: inline");
exit('<script type="text/javascript">if (window.parent.Footer) {window.parent.Footer._download.error(\''. $aOutput['data'] .'\') } else { window.parent.w360.error(\'' . $aOutput['data'] . '\',\'Download Failed\')}</script>');
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。