如何将图片上传到亚马逊s3存储桶和子文件夹并使用php foreach显示

时间:2012-11-20 00:12:27

标签: php amazon-s3

我在这里使用代码:http://net.tutsplus.com/tutorials/php/how-to-use-amazon-s3-php-to-dynamically-store-and-manage-files-with-ease/

...为登录时上传照片以供个人使用的用户创建存储桶和子目录。

将pics成功上传到s3服务器后,它们会在html文件中显示在列表中:

 <ul id="sortable-list">

    <?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 class=\"default\"><img src=\"$furl\" width=\"100\"></li>";

        {
            $i = 0;
        }

    }
    ?>
 </ul>

由于某种原因,子文件夹被识别为存储桶中的文件,并将$contents的第一个元素填充为http://bucket_name.s3.amazonaws.com/subfolder/,但当然是空的而不引用文件名。

我正在使用的php是上面引用的tutsplus.com教程中的page.php的修改形式。有关创建存储桶和子目录的代码如下:

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

        $fileName = $_FILES['theFile']['name'];
        $fileTempName = $_FILES['theFile']['tmp_name'];
        $folderName = "subfolder/$fileName";

        $s3->putBucket("unique_id", S3::ACL_PUBLIC_READ);

        if ($s3->putObjectFile($fileTempName, "unique_id", $folderName, S3::ACL_PUBLIC_READ)) {
            echo "<strong>We successfully uploaded your file.</strong>";
        }else{
            echo "<strong>Something went wrong while uploading your file... sorry.</strong>";
        }
    }

需要帮助找出如何防止子文件夹被识别为文件并在显示中创建元素。非常感谢

2 个答案:

答案 0 :(得分:2)

使用putbucket()函数后使用$folder这样的名称:

$s3->putBucket("file_bucket", S3::ACL_PUBLIC_READ);
            $foldername = "anirudh/$fileName";

之后使用这些功能

if ($s3->putObjectFile($fileTempName, "file_bucket",
           $foldername, S3::ACL_PUBLIC_READ))

答案 1 :(得分:0)

几种解决方案:

  1. (最简单)如果以斜线结尾,则为文件夹。即检查substr($ fname,-1)=='/'并且你有一个文件夹

  2. (Neater)您可以使用PCRE的get_object_list调用来获取文件夹名称后面的文件。如果您知道文件夹名称,这很有效。

  3. (可能,未经测试)检查$ file ['size'] - 如果为零,则它是文件夹或空文件。因为你不想要空文件,这可能是一个选项。