在php里我的头文件之后我怎么做?

pwuypxnk  于 2023-01-29  发布在  PHP
关注(0)|答案(1)|浏览(120)

我希望我的脚本将在下载文件后执行,因此在此代码的第一部分中,它将获取.txt文件并将word许可证更改为数据库结果,然后我希望下载开始,之后我想清除.txt文件以供下次使用。如果我如下所述编写,我不会在文本文件中获得数据库结果,因为它在下载之前首先执行整个代码。如果我删除最后一部分,它都工作,但它不会重置文本。

<?php

$userID= $_SESSION['user_id'];
$license=$dbConnection->getOne("SELECT license FROM valid_license where discordid = '$userID' ");
$license2 = $license['license'];

$zip = new ZipArchive;
$fileToModify = 'license.txt';
if ($zip->open('test.zip') === TRUE) {
    $oldContents = $zip->getFromName($fileToModify);
    $newContents = str_replace('license', $license2, $oldContents);
    $zip->deleteName($fileToModify);
    $zip->addFromString($fileToModify, $newContents);
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

header("Location: test.zip");

$userID= $_SESSION['user_id'];
$license=$dbConnection->getOne("SELECT license FROM valid_license where discordid = '$userID' ");
$license2 = $license['license'];

$zip = new ZipArchive;
$fileToModify = 'license.txt';
if ($zip->open('test.zip') === TRUE) {
    $oldContents = $zip->getFromName($fileToModify);
    $newContents = str_replace($license2, 'license', $oldContents);
    $zip->deleteName($fileToModify);
    $zip->addFromString($fileToModify, $newContents);
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

?>
vfh0ocws

vfh0ocws1#

发生这种情况有两个潜在原因:
1.您的Web服务器在向用户提供 any 响应之前等待PHP完成执行,因此后半部分将在发送头之前覆盖zip文件。
1.您的Web服务器正在无延迟地发送Location:标头,但在响应和后续请求进行时,PHP代码仍在执行,从而在文件请求返回之前覆盖数据。
这两种情况都将破坏您的预期流。
不要使用Location:头文件,而是为zip文件设置适当的Content-Type:头文件,将数据转储给用户,然后 * 清理文件。

header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Length: " . filesize($yourfile));
readfile($yourfile);

另外,不要像这样修改原始的zip文件。如果你收到两个重叠的请求,你会得到错误的许可证,或者只是破坏了一个或两个或所有后续的文件。
制作副本、修改副本、送达副本、删除副本。

相关问题