2016-03-31 9 views
4

Ich möchte eine Reihe von Fotos in den Bluemix Object Storage-Dienst hochladen und sie dann in einer Web-App anzeigen. Jetzt benötigt eine GET-Anfrage an das Foto im Objektspeicher-Container und Auth-Token. Gibt es eine Möglichkeit, eine öffentliche URL für das Objekt zu erstellen, das kein Authentifizierungs-Token für eine GET-Anforderung benötigt?Öffentliche URLs für Objekte im Bluemix-Objektspeicherdienst

Ich sehe, es gibt eine Option zum Erstellen temporärer URLs für Objekte, aber ich möchte nicht die URL vorübergehend Ich will es für immer leben. Ist die einzige Option zum Erstellen einer langlebigen temporären URL?

Antwort

5

Der richtige Weg, dies zu tun, ist die Container-ACL zu ändern. Sie können dies derzeit nicht über die Bluemix-Benutzeroberfläche ausführen, aber Sie können Swift REST API verwenden. Um beispielsweise die Container-ACL so zu ändern, dass jeder Objekte im Container lesen kann, können Sie die folgende Anforderung PUT eingeben.

curl -X PUT "https://dal.objectstorage.open.softlayer.com/v1/AUTH_123/mycontainer" \ 
    -H "X-Auth-Token: token123" \ 
    -H "X-Container-Read: .r:*" 
+0

Wie erhalte ich X-Auth-Token für einen kostenlosen Plan – briantaurostack7

+0

'Sie können geben Sie den folgenden PUT request' ...' curl -X GET': in der globalen App verwendet ... also ist es "GET" oder "PUT"? – Pang

+0

Um das Authentifizierungs-Token zu erhalten, gibt es einen zusätzlichen Schritt, bei dem der Benutzername und das Passwort für ein Token ausgetauscht werden. Die Anweisungen hier funktionieren gut, aber ich musste curl -v verwenden, um das Token von den Antwortheadern zu erhalten: https://console.bluemix.net/docs/services/ObjectStorage/os_authenticate.html –

3

Ich weiß, dass dies eine alte Post, sondern mit Hilfe von Ryan Baxter und Objektspeichern Dokumentation in IBM konnte ich das Problem beheben schließlich diese auch Befehle gespeichert, den Tag

Ersten Einsatz schnell und Zugriff ändern Kontrolle des Behälters

swift post container-name --read-acl ".r:*,.rlistings" 

Weiter Verwenden von Locken Configure Container auf eine bestimmte URL für den Zugriff auf Dateien

curl -X GET " https://<access point>/<version>/AUTH_projectID/container-name" -H "X-Auth-Token:<auth token>"  -H "X-Container-Read: .r:*,.rlistings" 

Und auch sehr dankbar für die Hilfe von Alex da Silva

0

Jetzt BlueMix hat eine S3-Endpunkt-Fähigkeit. Sie können zum Beispiel curl oder eine andere Sprache verwenden, hier ist ein boto3, der ein Objekt hochlädt, es veröffentlicht und einige Metadaten: (Die Funktion verwendet eine json-Datei, in der Sie die Anmeldeinformationen speichern und sie verwendet 3 Variablen currentdirpath, ImagesToS3, Imagename)

def UploadImageDansBucket (currentdirpath,ImagesToS3,ImageName) : 
    currentdirpath = 'path/to/your/dir/current' 
    ImagesToS3 = ' /path/of/your/object/' 
    ImageName = 'Objectname' 
    with open("credentials.json", 'r') as f: 
     data = json.loads(f.read()) 
     bucket_target = data["aws"]["targetBucket"] 
     print ('Open Connection to the bucket in the cloud..........') 

     s3ressource = boto3.resource(
      service_name='s3', 
      endpoint_url= data["aws"]["hostEndPoint"], 
      aws_access_key_id= data["aws"]["idKey"], 
      aws_secret_access_key=data["aws"]["secretKey"], 
      use_ssl=True, 
      ) 
     s3ressource.meta.client.meta.events.unregister('before-sign.s3', fix_s3_host) 
     s3ressource.Object(bucket_target, 'hello.txt').put(Body=b"I'm a test file") 
     s3ressource.Object(bucket_target, 'bin.txt').put(Body=b"abcdef"*10000) 
     fn = "%s%s" % (ImagesToS3,ImageName) 
     data = open(fn, 'rb') 
     #s3ressource.Bucket(bucket_target).put_object(Key=fn, Body=data) 
     now = datetime.datetime.now() # on recupere la date actuelle 
     timestamp = time.mktime(now.timetuple()) # on effectue la convertion 
     timestampstr = str (timestamp) 
     s3ressource.Bucket(bucket_target).upload_file(fn,ImageName, ExtraArgs={ "ACL": "public-read", "Metadata": {"METADATA1": "a" ,"METADATA2": "b","METADATA3": "c", "timestamp": timestampstr },},)