我想将一些照片上传到 Bluemix Object Storage 服务,然后在 Web 应用程序中显示它们。现在,对对象存储容器中的照片的 GET 请求需要和身份验证令牌。有什么方法可以创建一个不需要 GET 请求的身份验证令牌的对象的公共 URL?
我看到有一个为对象创建临时 URL 的选项,但我不希望 URL 是临时的,我希望它永远存在。是创建长期临时 URL 的唯一选择吗?
我想将一些照片上传到 Bluemix Object Storage 服务,然后在 Web 应用程序中显示它们。现在,对对象存储容器中的照片的 GET 请求需要和身份验证令牌。有什么方法可以创建一个不需要 GET 请求的身份验证令牌的对象的公共 URL?
我看到有一个为对象创建临时 URL 的选项,但我不希望 URL 是临时的,我希望它永远存在。是创建长期临时 URL 的唯一选择吗?
正确的做法是修改容器 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:*"
我知道这是一篇旧帖子,但在 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 提供的帮助
现在 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 },},)