【问题标题】:How to display S3 files for each user using PHP foreach如何使用 PHP foreach 为每个用户显示 S3 文件
【发布时间】:2012-11-19 04:35:36
【问题描述】:

我正在使用 Amazon S3 存储用户上传的照片,使用以下代码:

        if(isset($_POST['Submit'])){

        $fileName = $_FILES['theFile']['name'];
        $fileTempName = $_FILES['theFile']['tmp_name'];
        $folderName = "{id}/{address}/$fileName";

        //create a new bucket
        $s3->putBucket("bucket_name", S3::ACL_PUBLIC_READ);

        //move the file
        if ($s3->putObjectFile($fileTempName, "bucket_name", $folderName, S3::ACL_PUBLIC_READ)) {
            echo ""; //etc, etc

{id}{address} 是动态变量,用于在文件上传时根据每个用户存储在 mysql 数据库中的唯一数据创建文件夹的外观。

我遇到的问题是在每个用户的密码保护站点中显示这些文件。我在下面使用的代码拍摄了所有用户的照片并将它们显示给所有用户。如果{id}/{address}/$fileName 转换为123/figuero/photo.jpg,那么用户123 应该只能看到123/figuero/photo.jpg(或任何其他带有前言123/123/xxx/ 的文件

使用下面我使用的代码,所有用户都可以看到bucket_name 中的所有文件,而不仅仅是与其照片相关联的动态数据相关联的文件:

    <ul>
        <?php
            $i = 0;
            $contents = $s3->getBucket("bucket_name");

             foreach($contents as $file)
             {

             $fname = $file['name'];
             $furl = 'http://bucket_name.s3.amazonaws.com/'.$fname;

                 echo "<li><img src='$furl'></li>";
                 {
                     $i = 0; 
                 }
             }
        ?>
    <ul>

换句话说,所有http://bucket_name.S3.amazonaws.com/ 中的文件被代码拉出来显示,而不仅仅是123/xxx/ 开头的文件中与用户123 相关的照片

我错过了什么?非常感谢。

【问题讨论】:

    标签: php mysql amazon-s3


    【解决方案1】:

    我认为最好的方法是在存储桶名称上使用某种前缀来满足您的“目录”类型需求。除此之外,您需要在回显之前评估文件名中的目录名。

    List all Files in a S3 Directory with Zend Framework

    即使用桶名区分:

    if(isset($_POST['Submit'])){
    
    $fileName = $_FILES['theFile']['name'];
    $fileTempName = $_FILES['theFile']['tmp_name'];
    $folderName = "{id}/{address}/$fileName";
    $bucketName = "bucket_name" . $folderName;
    
    //create a new bucket
    $s3->putBucket($bucketName, S3::ACL_PUBLIC_READ);
    
    //move the file
    if ($s3->putObjectFile($fileTempName, $bucketName, $folderName, S3::ACL_PUBLIC_READ)) {
        echo ""; //etc, etc
    

    <ul>
        <?php
            $i = 0;
            $contents = $s3->getBucket($bucketName);
    
             foreach($contents as $file)
             {
    
             $fname = $file['name'];
             $furl = 'http://bucket_name.s3.amazonaws.com/'.$fname;
    
                 echo "<li><img src='$furl'></li>";
                 {
                     $i = 0; 
                 }
             }
        ?>
    <ul>
    

    【讨论】:

    • 嗯,这会创建一个名为 bucket_name{id}.s3.amazonaws.com/{id}/{address} 而不是 bucket_name.s3.amazonaws.com/{id}/{address} 的存储桶
    • 当然...您可以将存储桶命名为您真正想要的任何名称。这个想法是,您可以使用 S3 api 调用来获取特定的存储桶,而不是遍历存储桶中的所有文件并在循环中进行评估。
    • 这不是我遇到问题的存储桶名称。动态变量{id} 被放置在bucket_name 之后并创建一个名为bucket_name{id} 的存储桶名称而不是bucket_name
    • 是的,就是这样。您可以将其设为 bucket_name_id 或 bucket_name_id_address 或 bucket_name_。您需要这样做,以便在需要检索存储桶时使用此名称。
    • 这将创建数百甚至数千个存储桶(因为有数百个成员),因为 {id} 标识了一个特定的成员文件夹来放置他们的照片。我想为所有成员创建一个存储桶文件夹,由其成员 ID {id} 标识
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多