我有一个脚本,允许用户根据请求下载zip文件。它在计算机浏览器上100%工作,但在Android /移动浏览器上不起作用,只有Opera(移动版)。
这是我的剧本。
$leads = new Packer($zip_name);
$index = 1;
$count = 0;
foreach($cLeads->lastUnitInfo['leads'] as $lead)
{
// build a request string
$export = 'export_lead_'.$index;
$req = $_POST[$export];
// add it to the zip file
if(isset($req) && $req == '1')
{
// debug only
//echo 'adding lead: '.$lead['file_name'].'<br />';
$leads->addLead('leads/'.$lead['file_name'],$lead['item_name']);
$count++;
//echo 'count: '.$count.'<br/>';
}
$index++;
}
// debug
//exit('count: '.$count); // displays same results on all browsers.
// we got anything packed ?
if($count <= 0) //// <-------- BLOCK OF BUG ON MOBILE PHONE
{
if(file_exists($zip_name))
unlink($zip_name); // delete the zip file created.
exit('<h1>Nothing to export</h1>');
} ///// <---------------------- END BLOCK
// download the leads here.
$leads->purge();
exit;
这是我的purge()
功能
public function purge($zip_name = 'leads.zip')
{
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$zip_name.'"');
ob_clean();
flush();
readfile($this->zip_name);
// errors will be disabled here
unlink($this->zip_name);
}
在我的Android手机上,zip文件被下载但包含<h1>Nothing to export</h1>
,这会将其呈现为无效的zip文件。
所以我的问题是,该块如何仅在移动浏览器上执行(Opera除外),然后如果exited
为零则应该{@ 1}}继续下载该邮件?
我使用Fiddler调试它并且请求都是相同的但是输出不同,为什么?
这是PHP中的错误吗?因为如果你查看我的代码,函数$count
应该输出错误,说已经发送了标题,但它只是继续下载zip文件。
浏览器:
测试的PHP版本:
这让我疯了。
@Alix这是我见过的最奇怪的错误。我不认真看到任何逻辑错误。要使脚本启动下载,实际上必须在zip中添加文件。现在在我的手机上,它说没有添加文件,但purge()
文件夹中有一个zip文件。此外,如果没有添加文件(temp
= 0),则脚本应该仅使用消息$count
终止(因此exit()
函数)。但它继续下载zip文件(此时不存在,但在temp文件夹中)。 zip文件最终因包含<h1>Nothing to export</h1>
Alix写道: *的&GT;如果您在提供文件之前注释掉退出电话会怎么样?
它说<h1>Nothing to export</h1>
错误然后清除乱码UNICODE字符中的zip文件。我可以告诉它是zip文件,因为它以readfile
开头并包含要导出的图像的名称。
Alix写道:
如果这不起作用,您可能希望将
PK
更改为退出(var_dump($ _ REQUEST));这样您可以通过检查Zip文件来检查表单提交中是否存在可能的错误。
有趣。它只打印cookie和$ _GET参数。如果我将代码放在脚本开头的建议中,并在将文件添加到zip的块中,则会打印所有exit('<h1>Nothing to export</h1>');
个变量。
这里显然存在PHP的错误。它应该在调用$_POST
时终止,但不会。请注意,这只发生在Opera以外的移动浏览器上。我现在要哭了。
答案 0 :(得分:0)
您确定其他浏览器将$_POST[$export]
设置为正确的值吗?
此外,您应首先ob_[end_]clean()
然后输出标题,而不是相反:
public function purge($zip_name = 'leads.zip')
{
ob_end_clean();
flush();
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.$zip_name.'"');
readfile($this->zip_name);
// errors will be disabled here
unlink($this->zip_name);
}
此外,您可能想要设置这些标题:
header('Content-Length: ' . intval(filesize($zip_name)));
header('Content-Transfer-Encoding: binary');
如果这不起作用,您可能希望将exit('<h1>Nothing to export</h1>');
更改为exit(var_dump($_REQUEST));
,这样您就可以通过检查Zip文件来检查表单提交中是否存在错误。