4

我想将一些照片上传到 Bluemix Object Storage 服务,然后在 Web 应用程序中显示它们。现在,对对象存储容器中的照片的 GET 请求需要和身份验证令牌。有什么方法可以创建一个不需要 GET 请求的身份验证令牌的对象的公共 URL?

我看到有一个为对象创建临时 URL 的选项,但我不希望 URL 是临时的,我希望它永远存在。是创建长期临时 URL 的唯一选择吗?

4

3 回答 3

5

正确的做法是修改容器 ACL。您目前无法通过 Bluemix UI 执行此操作,但您可以使用Swift REST API。例如,要更改容器 ACL 以便任何人都可以读取容器中的对象,您可以发出以下PUT请求。

curl -X PUT "https://dal.objectstorage.open.softlayer.com/v1/AUTH_123/mycontainer" \
    -H "X-Auth-Token: token123" \
    -H "X-Container-Read: .r:*"
于 2016-03-31T19:41:42.317 回答
3

我知道这是一篇旧帖子,但在 Ryan Baxter 和 IBM 中的对象存储文档的帮助下,我可以解决问题最后这些命令也拯救了这一天

首先使用swift和更改容器的访问控制

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

Next 使用 Curl 将容器配置到特定的 Url 以访问文件

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

也非常感谢 Alex da Silva 提供的帮助

于 2016-09-26T18:55:49.837 回答
0

现在 BlueMix 具有 S3 端点功能。您可以使用 curl 或任何其他语言作为示例,这里是一个 boto3,它将上传一个对象,将其公开和一些元数据:(该函数使用一个 json 文件,您在该文件上存储凭据,它使用 3 个使用的变量在全局应用程序中: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"0123456789abcdef"*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 },},)
于 2016-12-21T08:42:53.273 回答