2017-01-30 3 views
4

Я планирую использовать S3 Cloudstorage в IBM Bluemix, но затем одна странная вещь, которую я обнаружил, заключается в том, что нет способа добавить пользовательские META-DATA к объектам, которые хранятся в ведре S3.Использование S3 Cloud Storage на IBM Bluemix

Есть ли способ добавить пользовательские метаданные к объектам, и если да, тогда вы можете посоветовать нам, как мы можем добавить его и получить к нему доступ?

+0

Просто проверяют - ты это работает должным образом? –

ответ

1

Спасибо за указание на отверстие в документации!

Пользовательские метаданные определяются путем пропускания заголовка x-amz-meta-{key} с использованием значения {value}. В качестве примера запроса:

PUT /{bucket-name}/{object-name} HTTP/1.1 
Authorization: {authorization-string} 
x-amz-meta-foo: bar 
x-amz-date: 20160825T183001Z 
x-amz-content-sha256:{hashed-body} 
Content-Type: text/plain; charset=utf-8 
Host: s3-api.us-geo.objectstorage.softlayer.net 
Content-Length: 18 

{ 
    "foo": "bar" 
} 

Заведовал просьбой проверить метаданные будут выглядеть следующим образом:

HEAD /{bucket-name}/{object-name} HTTP/1.1 
Authorization: {authorization-string} 
x-amz-date: 20160825T183244Z 
Host: s3-api.us-geo.objectstorage.softlayer.net 

И отвечают:

HTTP/1.1 200 OK 
Date: Thu, 25 Aug 2016 18:32:44 GMT 
X-Clv-Request-Id: da214d69-1999-4461-a130-81ba33c484a6 
Accept-Ranges: bytes 
Server: Cleversafe/3.9.1.102 
X-Clv-S3-Version: 2.5 
ETag: {MD5-hash} 
Content-Type: text/plain; charset=UTF-8 
x-amz-meta-foo: bar 
Last-Modified: Thu, 25 Aug 2016 17:49:06 GMT 
Content-Length: 18 

Использование CLI, синтаксис будет выглядеть так:

$ aws --endpoint-url=https://{endpoint} s3 cp ~/new-file s3://bucket-1/ --metadata foo=bar 

Надеюсь, что это поможет!

0

Это возможно. Я использую это каждый день. Добавление метаданных, а затем отправку метаданных в базу данных путем выполнения вызовов cron. Вот небольшой пример питона скрипта для создания/добавления/метаданных изменения для объекта списка:

import sys 
import os 
import boto3 
import pprint 
from boto3 import client 
from botocore.utils import fix_s3_host 

param_1= YOUR_ACCESS_KEY 
param_2= YOUR_SECRETE_KEY 
param_3= YOUR_END_POINT 
param_4= YOUR_BUCKET 

#Create the S3 client 
s3ressource = client(
    service_name='s3', 
    endpoint_url= param_3, 
    aws_access_key_id= param_1, 
    aws_secret_access_key=param_2, 
    use_ssl=True, 
    ) 
# Building a list of object per bucket 
def BuildObjectListPerBucket (variablebucket): 
    global listofObjectstobeanalyzed 
    listofObjectstobeanalyzed = [] 
    extensions = ['.jpg','.png'] 
    for key in s3ressource.list_objects(Bucket=variablebucket)["Contents"]: 
     #print (key ['Key']) 
     onemoreObject=key['Key'] 
     if onemoreObject.endswith(tuple(extensions)): 
      listofObjectstobeanalyzed.append(onemoreObject) 

     else : 
      s3ressource.delete_object(Bucket=variablebucket,Key=onemoreObject)   
    return listofObjectstobeanalyzed 

# for a given existing object, create metadata 
def createmetdata(bucketname,objectname): 
    s3ressource.upload_file(objectname, bucketname, objectname, ExtraArgs={"Metadata": {"metadata1":"ImageName","metadata2":"ImagePROPERTIES" ,"metadata3":"ImageCREATIONDATE"}}) 

# for a given existing object, add new metadata 
def ADDmetadata(bucketname,objectname): 
    s3_object = s3ressource.get_object(Bucket=bucketname, Key=objectname) 
    k = s3ressource.head_object(Bucket = bucketname, Key = objectname) 
    m = k["Metadata"] 
    m["new_metadata"] = "ImageNEWMETADATA" 
    s3ressource.copy_object(Bucket = bucketname, Key = objectname, CopySource = bucketname + '/' + objectname, Metadata = m, MetadataDirective='REPLACE') 

# for a given existing object, update a metadata with new value 
def CHANGEmetadata(bucketname,objectname): 
    s3_object = s3ressource.get_object(Bucket=bucketname, Key=objectname) 
    k = s3ressource.head_object(Bucket = bucketname, Key = objectname) 
    m = k["Metadata"] 
    m.update({'watson_visual_rec_dic':'ImageCREATIONDATEEEEEEEEEEEEEEEEEEEEEEEEEE'}) 
    s3ressource.copy_object(Bucket = bucketname, Key = objectname, CopySource = bucketname + '/' + objectname, Metadata = m, MetadataDirective='REPLACE') 

def readmetadata (bucketname,objectname): 
    ALLDATAOFOBJECT = s3ressource.get_object(Bucket=bucketname, Key=objectname) 
    ALLDATAOFOBJECTMETADATA=ALLDATAOFOBJECT['Metadata'] 
    print ALLDATAOFOBJECTMETADATA 



# create the list of object on a per bucket basis 

BuildObjectListPerBucket (variablebucket) 

# Call functions to see the results 

for objectitem in listofObjectstobeanalyzed: 
    readmetadata(param_4,objectitem) 
    createmetdata(param_4,objectitem) 
    readmetadata(param_4,objectitem) 
    ADDmetadata(param_4,objectitem) 
    readmetadata(param_4,objectitem) 
    CHANGEmetadata(param_4,objectitem) 
    readmetadata(param_4,objectitem) 
Смежные вопросы