从我的Web服务器上的文件夹下载一个zip文件

时间:2018-07-18 08:31:28

标签: php html

我有一个应用程序,允许用户通过一个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);
   }
}

我觉得这与标题有关,但我不确定,任何帮助将不胜感激。

注意:用户退出页面后,我将删除该文件夹。

以下是我在网络服务器上看到的内容 enter image description here

文件夹“ 6”是相关用户的用户ID

1 个答案:

答案 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路径。