【问题标题】:Public URLs For Objects In Bluemix Object Storage ServiceBluemix 对象存储服务中对象的公共 URL
【发布时间】:2016-03-31 16:00:41
【问题描述】:

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

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

【问题讨论】:

    标签: ibm-cloud openstack-swift object-storage


    【解决方案1】:

    这样做的正确方法是修改容器 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:*"
    

    【讨论】:

    • 如何获得免费计划的 X-Auth-Token
    • you can issue the following PUT request ... curl -X GET ... 那么是GET 还是PUT
    • 要获得身份验证令牌,还有一个额外的步骤,涉及将用户名和密码交换为令牌。此处的说明效果很好,但我必须使用 curl -v 从响应标头中获取令牌:console.bluemix.net/docs/services/ObjectStorage/…
    • 获取令牌时的另一个有用提示,并按照上一个链接中的说明进行操作,即返回的 json 中有很多端点。需要的是类型为“object-store”且名称为“swift”的那个,该组中的特定端点是所需区域的“公共”端点。
    【解决方案2】:

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

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

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

    下一步使用 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 提供的帮助

    【讨论】:

      【解决方案3】:

      现在 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 },},)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        相关资源
        最近更新 更多