Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从App Engine将图像上传到Google云存储_Python_Django_Google App Engine_Google Cloud Storage - Fatal编程技术网

Python 如何从App Engine将图像上传到Google云存储

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

我正在尝试获取一个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 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你能将你的评论转化为答案吗?以帮助其他人吗