Python 如何从App Engine将图像上传到Google云存储
我正在尝试获取一个base64编码的PNG,对其进行解码,然后将其上传到Google云存储并获取其公共URL 我可以通过将PNG保存到文件中,然后使用blob.upload\u from\u file('picture.PNG')将其上载到本地,但App Engine不允许对其文件结构进行写访问 此代码在本地工作,但在Google App Engine中不起作用,因为它在打开时(…Python 如何从App Engine将图像上传到Google云存储,python,django,google-app-engine,google-cloud-storage,Python,Django,Google App Engine,Google Cloud Storage,我正在尝试获取一个base64编码的PNG,对其进行解码,然后将其上传到Google云存储并获取其公共URL 我可以通过将PNG保存到文件中,然后使用blob.upload\u from\u file('picture.PNG')将其上载到本地,但App Engine不允许对其文件结构进行写访问 此代码在本地工作,但在Google App Engine中不起作用,因为它在打开时(… import base64 from google.cloud import storage def handl
import base64
from google.cloud import storage
def handler(request):
pic = request.POST.get('photograph') #Object like 'data:image/png;base64,iVBORw0KGgoAAAAN…'
data = pic[22:]
png = base64.b64decode(data)
filename = "pic.png"
with open(filename, "wb") as f:
f.write(png)
client = storage.Client.from_service_account_json(os.path.abspath('credentials.json'))
bucket = client.get_bucket('mybucket')
blob = bucket.blob(filename) #create destination uri in bucket
blob.upload_from_file(filename)
image_url = "https://storage.googleapis.com/mybucket/" + filename
GCS文档要求使用Blob.upload\u from\u file()、Blob.upload\u from\u filename()或Blob.upload\u from\u string()方法上载对象。
但是,这些方法都不适用于这种情况,因为没有文件,只有一个编码的PNG对象。如何将其上载到gcloud存储
我肯定错过了一些明显的东西。任何想法都将不胜感激。根据David的建议,这是有效的。我只是在文件名和应用程序引擎允许我保存它之前添加了
/tmp/
import base64
from google.cloud import storage
def handler(request):
pic = request.POST.get('photograph')
data = pic[22:]
png = base64.b64decode(data)
filename = "pic.png"
temp_location = '/tmp/' + filename #here
with open(temp_location, "wb") as f:
f.write(png)
client = storage.Client.from_service_account_json(os.path.abspath('credentials.json'))
bucket = client.get_bucket('mybucket')
blob = bucket.blob(filename)
blob.upload_from_file(temp_location)
image_url = "https://storage.googleapis.com/mybucket/" + filename
根据David的建议,这是有效的。我只是在文件名和应用程序引擎允许我保存它之前添加了
/tmp/
import base64
from google.cloud import storage
def handler(request):
pic = request.POST.get('photograph')
data = pic[22:]
png = base64.b64decode(data)
filename = "pic.png"
temp_location = '/tmp/' + filename #here
with open(temp_location, "wb") as f:
f.write(png)
client = storage.Client.from_service_account_json(os.path.abspath('credentials.json'))
bucket = client.get_bucket('mybucket')
blob = bucket.blob(filename)
blob.upload_from_file(temp_location)
image_url = "https://storage.googleapis.com/mybucket/" + filename
#post_image_base64是base64字符串
base64_img_bytes = post_image_base64.encode('utf-8')
with open('decoded_image.png', 'wb') as file_to_save:
decoded_image_data = base64.decodebytes(base64_img_bytes)
##Save file
#file_to_save.write(decoded_image_data)
gcs = storage.Client()
bucket = gcs.get_bucket("bucket_name")
blob = bucket.blob("image_name.png")
blob.upload_from_string(decoded_image_data)
print(blob.public_url);
#post_image_base64是base64字符串
base64_img_bytes = post_image_base64.encode('utf-8')
with open('decoded_image.png', 'wb') as file_to_save:
decoded_image_data = base64.decodebytes(base64_img_bytes)
##Save file
#file_to_save.write(decoded_image_data)
gcs = storage.Client()
bucket = gcs.get_bucket("bucket_name")
blob = bucket.blob("image_name.png")
blob.upload_from_string(decoded_image_data)
print(blob.public_url);
如果您使用的是AppEngine,则不需要使用特定的身份验证详细信息。您可以通过设置
GOOGLE\u APPLICATION\u CREDENTIALS
环境变量在本地复制此信息。请确保您已为AppEngine授予使用其他GOOGLE服务的正确权限,因为默认情况下这些服务被拒绝。您可以在c在sole.上,并签出NamedTemporaryFile
以正确支持多个并发请求。临时文件夹正是我所需要的。这回答了你的问题吗?David的建议很完美。我只需要临时存储。@David你能将你的评论转化为答案吗?为了帮助其他人如果你使用AppEngine,你不应该这样做d使用特定的身份验证详细信息。您可以通过设置GOOGLE\u APPLICATION\u CREDENTIALS
环境变量在本地复制此信息。确保您已为AppEngine授予使用其他GOOGLE服务的正确权限,因为默认情况下这些服务被拒绝。您可以在控制台中执行此操作。然后签出NamedTemporaryFile
以正确支持多个并发请求。临时文件夹正是我所需要的。这能回答你的问题吗?David的建议非常完美。临时存储是我所需要的一切。@David你能将你的评论转化为答案吗?以帮助其他人吗