2011-01-17 110 views
3

接頭辞だけでなく、拡張子でS3のオブジェクトを検索することはできますか?ここでs3 apiからオブジェクトを拡張子でリストする方法は?

は私が今持っているものです:だから

ListObjectsResponse r = s3Client.ListObjects(new Amazon.S3.Model.ListObjectsRequest() 
{ 
    BucketName = BucketName, 
    Marker = marker, 
    Prefix = folder, 
    MaxKeys = 1000 
}); 

、私は私のバケット内のすべての* .xlsファイルをリストする必要があります。

答えて

5

これはS3とは考えられません。

最適な解決策は、データベース(Sql Server、MySql、SimpleDBなど)を使用してS3をインデックス化し、そのクエリを実行することです。

+0

が、私はDBはバケットへの変更の更新情報を取得する方法を疑問に疑問を拡張したいだろう。最新のMSサーバスタックを考えてみましょう。PowerShellスクリプトは、AWSのものをSQLに渡すための接点を提供できますか?どこでもデモされていますか? – justSteve

+0

@Steve - DBがS3から変更を得るための自動化された方法はありません。あなたがS3でファイルを追加/削除することをコントロールしていたら、同時にDBを更新するだけです。それ以外の場合は、定期的にS3をスキャンしてインデックスを更新する必要があります。私たちは最初の方法を使用しています。だから、誰かがS3にアップロードするときには、必要なファイルやその他の情報を指し示すデータベースに対応するエントリを作成します。その後、S3から直接ファイル(例: 'xls'ファイル)を表示するのではなく、実際にファイルをダウンロードしたいときにS3にアクセスするだけです。 –

+0

は意味があります... thx – justSteve

3

これを行うには、実際には別のデータベースは必要ありません。

S3では、特定の接頭辞を持つバケット内にオブジェクトをリストすることができます。あなたのジレンマは、 ".xls"拡張子がファイル名の末尾にあるため、接頭辞の検索はあなたを助けません。ただし、ファイルをバケットに入れると、オブジェクト名を変更して、接頭辞にファイルの種類(例:XLS-myfile.xls)が含まれるようにすることができます。その後、S3 APIのlistObjectsを使用して接頭辞 "XLS"を渡すことができます。

3

私はベスト答えはあなたのためにあなたのファイルを追跡するためにデータベースを使用することだと思うが、私はまた、お尻の信じられないほどの痛みだと思う。私はboto3でpython内で作業していましたが、これは私が思いついた解決策です。

エレガントではありませんが、機能します。すべてのファイルを一覧表示し、コードで必要な "接尾辞"/"拡張子"を持つファイルの一覧にフィルターを適用します。

s3_client = boto3.client('s3') 
bucket = 'my-bucket' 
prefix = 'my-prefix/foo/bar' 
paginator = s3_client.get_paginator('list_objects_v2') 
response_iterator = paginator.paginate(Bucket=bucket, Prefix=prefix) 

file_names = [] 

for response in response_iterator: 
    for object_data in response['Contents']: 
     key = object_data['Key'] 
     if key.endswith('.json'): 
      file_names.append(key) 

print file_names 
1

私はファイル情報を取得した後に反復しています。最終結果は、これが最善の答えはまだであれば辞書に

import boto3 

s3 = boto3.resource('s3') 

bucket = s3.Bucket('bucket_name') 

#get all files information from buket 
files = bucket.objects.all() 

# create empty list for final information 
files_information = [] 

# your known extensions list. we will compare file names with this list 
extensions = ['png', 'jpg', 'txt', 'docx'] 

# Iterate throgh 'files', convert to dict. and add extension key. 
for file in files: 
    if file.key[-3:] in extensions: 
     files_information.append({'file_name' : file.key, 'extension' : file.key[-3:]}) 
    else: 
     files_information.append({'file_name' : file.key, 'extension' : 'unknown'}) 


print files_information 
+0

これは一部のSO読者には有効かもしれない正当な答えですので、私はアップアップします。 しかし、私の目的は、何百万ものファイルがあるので、すべてのファイルのリストを読み込まないことでした。 – st78

+0

@ st78ありがとう!そのとおり。多くのデータについては、私はむしろページ制限を使用します。 :) –

関連する問題