从amazon s3 buckets子文件夹获取文件 [英] Get files from amazon s3 buckets sub folder

查看:1043
本文介绍了从amazon s3 buckets子文件夹获取文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从亚马逊S3 buckets子文件夹中获取所有文件,并使其可以在网页中下载。

I am trying to get all the files from a amazon S3 buckets sub folder and make them downloadable in a web page.

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

I have a bucket called images. Inside that bucket I have some other folders. Now I am trying to get all the files inside that subfolder and show it in a page. S3 Buckets: /images /images/test1/ /images/test2/ /images/test1/1 /images/test1/2 /images/test1/1/item

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

I have tried like this, but couldn't get the expected result.

// 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,我尝试这样:

Now if I want to get objects from the bucket, I can use getObject, which I tried like this:

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

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

Any suggestions will be appreciated. Thanks,

使用以下来自Josue Ibarra的回答后,我得到了这样的结果:

After using the following answer from Josue Ibarra, I got something like this

(

 [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
    )
)


$ b b

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

I want something like this: 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

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

Which needs to be a downloadable link.

请给我建议一个链接或给我一些想法如何做。

Please suggest me to a link or give me some ideas how can I do it.

推荐答案

我一回就做了这个函数

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;
}

它返回一个数组,关键是完整的文件名,可以:

It returns you an array, the key is the full file name, so you can do:

$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;
}

这篇关于从amazon s3 buckets子文件夹获取文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆