【发布时间】:2018-12-26 02:06:51
【问题描述】:
我有一个应用程序,允许用户通过一个 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
【问题讨论】: