【问题标题】:Get files from amazon s3 buckets sub folder从 amazon s3 buckets 子文件夹中获取文件
【发布时间】:2013-10-25 19:32:21
【问题描述】:

我正在尝试从 amazon S3 存储桶子文件夹中获取所有文件,并使其可在网页中下载。

我有一个名为 images 的存储桶。在那个桶里面我有一些其他的文件夹。现在我正在尝试获取该子文件夹中的所有文件并将其显示在页面中。 S3 存储桶: /图片 /图像/test1/ /图像/test2/ /images/test1/1 /images/test1/2 /images/test1/1/item

我试过这样,但无法得到预期的结果。

// Target files full path : images/test1/1/item 

$bucketName = 'images';
$source = '/test1/1/item' 

$image = $this->s3->getBucket($bucketName);
foreach ($image as $key=>$data){
   $k = $data['name'];
   print_r($k); // now this gives me full list of everything inside the images bucket. 
}

现在,如果我想从存储桶中获取对象,我可以使用 getObject,我尝试过这样:

$result = $this->s3->getObject($image); // I am confused about this one

任何建议将不胜感激。谢谢,

使用 Josue Ibarra 的以下回答后,我得到了类似的结果

(

 [tableuploads/1/emaillists/15.10.2013-18.03.23-emailList.csv] => Array
     (
         [file_name] => 15.10.2013-18.03.23-emailList.csv
         [file_folder] => emaillists
         [file_size] => 64
         [created_on] => 2013-10-15 19:03:26
         [s3_link] => http://s3.amazonaws.com/webtools_sharing/emaillists/15.10.2013-       18.03.23-emailList.csv
        [md5_hash] => 4809ae0b75d3517b69f69b53ba0b2959
    )

[tableuploads/1/emaillists/15.10.2013-18.04.32-emailList.csv] => Array
    (
        [file_name] => 15.10.2013-18.04.32-emailList.csv
        [file_folder] => emaillists
        [file_size] => 64
        [created_on] => 2013-10-15 19:04:45
        [s3_link] => http://s3.amazonaws.com/webtools_sharing/emaillists/15.10.2013-18.04.32-emailList.csv
        [md5_hash] => 14094e133779619ddfcfc008d16ce75b
    )

[tableuploads/2/emaillists/15.10.2013-18.03.23-emailList.csv] => Array
    (
        [file_name] => 15.10.2013-18.03.23-emailList.csv
        [file_folder] => emaillists
        [file_size] => 64
        [created_on] => 2013-10-15 19:03:26
        [s3_link] => http://s3.amazonaws.com/webtools_sharing/emaillists/15.10.2013-18.03.23-emailList.csv
        [md5_hash] => 4809ae0b75d3517b69f69b53ba0b2959
    )

[tableuploads/2/emaillists/15.10.2013-18.04.32-emailList.csv] => Array
    (
        [file_name] => 15.10.2013-18.04.32-emailList.csv
        [file_folder] => emaillists
        [file_size] => 64
        [created_on] => 2013-10-15 19:04:45
        [s3_link] => http://s3.amazonaws.com/webtools_sharing/emaillists/15.10.2013-18.04.32-emailList.csv
        [md5_hash] => 14094e133779619ddfcfc008d16ce75b
    )
)

我想要这样的东西: http://s3.amazonaws.com/webtools_sharing/tableuploads/1/emaillists/15.10.2013-18.03.23-emailList.csv

http://s3.amazonaws.com/webtools_sharing/tableuploads/2/emaillists/15.10.2013-18.03.23-emailList.csv

这需要是一个可下载的链接。

请给我一个链接或给我一些想法,我该怎么做。

【问题讨论】:

    标签: php codeigniter amazon-web-services amazon-s3


    【解决方案1】:

    我不久前做了这个功能

    public function list_s3_bucket($bucket_name)
    {
        // initialize the data array
        $data;
        $bucket_content = $this->s3->getBucket($bucket_name);
    
        foreach ($bucket_content as $key => $value) {
            // ignore s3 "folders"
            if (preg_match("/\/$/", $key)) continue;
    
            // explode the path into an array
            $file_path = explode('/', $key);
            $file_name = end($file_path);
                $file_folder = substr($key, 0, (strlen($file_name) * -1)+1);
            $file_folder = prev($file_path);
    
            $s3_url = "https://s3.amazonaws.com/{$bucket_name}/{$key}";
    
            $data[$key] = array(
                'file_name' => $file_name,
                        's3_key' => $key,
                'file_folder' => $file_folder,
                'file_size' => $value['size'],
                'created_on' => date('Y-m-d H:i:s', $value['time']),
                's3_link' => $s3_url,
                'md5_hash' => $value['hash']);
        }
        return $data;
    }
    

    它返回一个数组,键是完整的文件名,所以你可以这样做:

    $list = $this->your_model->list_s3_bucket($bucket_name);
    
    foreach ($list as $key => $row){
       force_download($this->s3->getObject($row['s3_key']), $row['file_name']);
       // you can use this url:
       print($row['s3_link']);
    }
    
    function force_download($data, $file_name)
    {
          header("Content-type: application/octet-stream");
          header("Content-Disposition: attachment; filename=\"{$file_name}\"");
          echo $data;
    }
    

    【讨论】:

    • 它还会忽略您获得的空 s3 文件夹,它会检测到它们,因为它们的名称末尾有一个“/”。 示例: 'folder1/'
    • 对我来说直到 $list = $this->your_model->list_s3_bucket($bucket_name);工作中。在 foreach 循环内部,它在 $result = $this->s3->getObject($key); 中不起作用我是否也这样尝试过: $result = $this->s3->getObject($bucketname,$key);
    • 在foreach里面为什么要再次调用getObject??
    • Get 对象只被调用一次,在 foreach 循环中它会下载实际文件(文件名存储在循环的 $key 中)
    • 我打算让代码清楚使用,而不是作为替代品。对不起,“webtools_sharing”是我的存储桶名称 xD 我忘了把它从我的代码中取出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多