PHP表单提交下载失败怎么给客户端发消息
How do you send a message to the client when PHP form submission download fails
我的应用程序能够从数据库请求和下载大量不同的文件和类型。
我目前这样做的方式是使用隐藏的表单输入,将请求提交给服务器,然后服务器进行处理并下载文件。其代码如下所示:
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 端看起来像这样(所有情况都相应地设置输出数据和 headers)
// $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);
当不需要 pre-processing(权限检查、有效密钥检查等...)时,这非常有用
但是,如果我在这部分之前有一些 server-side pre-processing 要做,但它失败了,我需要一种方法将消息发送回前端。
我知道我拥有的东西是行不通的。我唯一的想法是,我需要在单独的 AJAX 调用中执行 pre-processing,然后如果成功,运行 实际下载,但这并不理想。我研究过的其他一些解决方案包括使用 fetch 取回数据,然后可能使用库下载 blob 数据,但同样,我不确定我是否可以判断它是否实际上是一个成功的服务器请求或没有。
提前致谢。
我最后做的是为下载创建一个 iFrame,表单将以它为目标。
现在我的下载 class 将 return 一个输出数组到下载端点,我可以在其中检查它是否通过了预处理、处理和 post 处理。如果没有成功,我将 headers 设置回 text/html 并将一行 JS 注入到 iFrame window 中,然后我可以在其中定位 parent window 并使用从输出数据传递的消息调用我的错误函数。
我的 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>');
}
我的应用程序能够从数据库请求和下载大量不同的文件和类型。
我目前这样做的方式是使用隐藏的表单输入,将请求提交给服务器,然后服务器进行处理并下载文件。其代码如下所示:
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 端看起来像这样(所有情况都相应地设置输出数据和 headers)
// $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);
当不需要 pre-processing(权限检查、有效密钥检查等...)时,这非常有用
但是,如果我在这部分之前有一些 server-side pre-processing 要做,但它失败了,我需要一种方法将消息发送回前端。
我知道我拥有的东西是行不通的。我唯一的想法是,我需要在单独的 AJAX 调用中执行 pre-processing,然后如果成功,运行 实际下载,但这并不理想。我研究过的其他一些解决方案包括使用 fetch 取回数据,然后可能使用库下载 blob 数据,但同样,我不确定我是否可以判断它是否实际上是一个成功的服务器请求或没有。
提前致谢。
我最后做的是为下载创建一个 iFrame,表单将以它为目标。
现在我的下载 class 将 return 一个输出数组到下载端点,我可以在其中检查它是否通过了预处理、处理和 post 处理。如果没有成功,我将 headers 设置回 text/html 并将一行 JS 注入到 iFrame window 中,然后我可以在其中定位 parent window 并使用从输出数据传递的消息调用我的错误函数。
我的 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>');
}