场景:存储在GCP存储桶中的图像文件需要通过POST发送到第三方REST端点]
问题:
这真的是最好的模式吗?有没有更有效,更详细的方法?我们有图像通过移动应用上传到GCP存储桶。当图片上传的finalize事件触发时,我们有一个GCP Cloud Function(Python 3),它通过获取对上传图片的引用对此作出反应,将其下载到临时文件,然后将该临时文件用作POST的图片源。这是我们当前的代码,并且可以运行,但是在我看来,似乎却被多个open
命令所困扰。更具体地说:是否有更好的方法简单地从GCP存储中获取图像blob,并将其简单地附加到POST调用中,而无需先将其保存为本地文件然后打开它以便可以将其附加到POST?
def third_party_upload(data, context): # get image from bucket storage_client = storage.Client() bucket = storage_client.bucket(data['bucket']) image_blob = bucket.get_blob(data['name']) download_path = '/tmp/{}.jpg'.format(str(uuid.uuid4())) #temp image file download location # save GCP Storage blob as a temp file with open(download_path, 'wb') as file_obj: image_blob.download_to_file(file_obj) # open temp file and send to 3rd-party via rest post call with open(download_path, 'rb') as img: files = {'image': (data['name'], img, 'multipart/form-data', {'Expires': '0'}) } headers = { 'X-Auth-Token': api_key, 'Content-Type': 'image/jpg', 'Accept': 'application/json' } # make POST call response = requests.post(third_party_endpoint, headers=headers, files=files) print('POST response:', response)
更新:几位评论者提到签名URL是一种可能,我同意它们是一个很好的选择。但是,我们一直坚持要求将图像二进制文件包含在POST正文中。在这种情况下,签名URL将不起作用。
场景:存储在GCP存储桶中的图像文件需要通过POST发送到第三方REST端点。问题:这真的是最好的模式吗?有没有更有效,更详细的方法?我们...
[如果您能够将URL发送给第三方端点,而不是实际的图像内容,则可以使用签名URL给图像提供时间限制,而无需提供对存储桶的第三者访问权限或公用桶。