我有一个应用程序,允许用户通过一个zip文件夹中的EC2实例从S3存储桶下载多个文件。
该过程运行良好,但是,我希望系统为每个要下载文件的用户创建一个文件夹,然后将文件下载到此文件夹,然后放入该用户文件夹内的zip文件夹中,然后下载该zip文件夹。
文件可以很好地下载到此文件夹,并且也可以正确压缩,但是我的问题是它没有从用户文件夹下载zip文件,并且下载显示为空zip文件。
下面是我的“全部下载”代码:
mkdir($userId);
$allName = $vshort . "v" . $number . "_All.zip";
$allName = str_replace(" ", "_", $allName);
if (isset($_POST['downloadAll']))
{
$zip = new ZipArchive();
$zip->open("{$userId}/{$allName}", ZipArchive::CREATE);
$s3->registerStreamWrapper();
foreach ($items as $item)
{
$fid = $item->item_file_id;
$file = ItemFile::locateId($fid);
$a = $file[0]->item_file_type;
$b = $file[0]->item_file_app;
$c = $file[0]->item_file_name;
$fileName = $a . "/" . $b . "/" . $c;
$download = $s3->getCommand('GetObject', [
'Bucket' => AWS_BUCKET,
'Key' => $fileName
]);
$streamFile = $c;
$user = User::locate($_SESSION['email']);
$uid = $user->user_id;
$cid = $user->user_company_id;
$history = new History();
$history->insert($fid, $uid, $cid);
$req = $s3->createPresignedRequest($download, '+1 minutes');
$link = (string)$req->getUri();
$stream = file_get_contents($link);
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Cache-Control: public"); // needed for internet explorer
header("Content-Type: application/'$a'");
header("Content-Disposition: attachment; filename='$c'");
file_put_contents($streamFile, $stream);
$zip->addFile($streamFile);
$downArray[] = $streamFile;
}
$zip->close();
$dLink = "https://mywebsite/" . $userId . "/" . $allName;
$size = filesize($allName);
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$allName");
header("Content-length: " . $size);
header("Expires: 0");
ob_end_clean();
stream_context_set_default([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
]
]);
readfile($dLink);
unlink($allName);
foreach ($downArray as $down)
{
unlink($down);
}
}
我觉得这与标题有关,但我不确定,任何帮助将不胜感激。
注意:用户退出页面后,我将删除该文件夹。
文件夹“ 6”是相关用户的用户ID
答案 0 :(得分:0)
您似乎正在下载链接($ dLink)上调用readfile(),它将通过HTTP服务该文件。您可能打算在$ allName(同一文件的文件系统路径)上调用readfile。我的猜测是您对$ dLink的http请求由于某种原因失败。另外,您使用mkdir($ userId),但不要使用该目录。
除此之外,看来您的$ allName变量包含zipfile的基本名称(即“ myzip-v-20_ALL.zip”)。我建议将zipfile打开到数据目录的完整路径,以便将文件系统和http路径分开。
$allNameFilesystem = "{$userId}/{$allName}";
$allNameHttp = "https://mywebsite/{$userId}{$allName}";
// ...
$zip->open($allNameFilesystem, ZipArchive::CREATE);
// ...
// The download link is $allNameHttp
也就是说,如果您实际上需要http路径。在这种情况下,如果将readfile更改为使用文件系统路径,则实际上不再在代码中使用http路径。