3

Ich möchte ein Bild aus einem Python-Skript in Google Cloud Storage hochladen. Dies ist mein Code:So laden Sie ein Byte-Bild in Google Cloud Storage von einem Python-Skript aus

from oauth2client.service_account import ServiceAccountCredentials 
from googleapiclient import discovery 

scopes = ['https://www.googleapis.com/auth/devstorage.full_control'] 
credentials = ServiceAccountCredentials.from_json_keyfile_name('serviceAccount.json', scop 
es) 
service = discovery.build('storage','v1',credentials = credentials) 

body = {'name':'my_image.jpg'} 

req = service.objects().insert(
    bucket='my_bucket', body=body, 
    media_body=googleapiclient.http.MediaIoBaseUpload(
     gcs_image, 'application/octet-stream')) 

resp = req.execute() 

wenn gcs_image = open('img.jpg', 'r') der Code funktioniert und mein Bild richtig auf Cloud Storage speichern. Wie kann ich ein Byte-Bild direkt hochladen? (Beispielsweise aus einem OpenCV/Numpy Array: gcs_image = cv2.imread('img.jpg'))

Antwort

0

MediaIoBaseUpload erwartet und io.Base -ähnlichen Objekt und hebt folgende Fehler:

'numpy.ndarray' object has no attribute 'seek' 

auf ein ndarray Objekt empfängt. Um es zu lösen Ich verwende TemporaryFile und numpy.ndarray().tofile()

from oauth2client.service_account import ServiceAccountCredentials 
from googleapiclient import discovery 
import googleapiclient 
import numpy as np 
import cv2 
from tempfile import TemporaryFile 


scopes = ['https://www.googleapis.com/auth/devstorage.full_control'] 
credentials = ServiceAccountCredentials.from_json_keyfile_name('serviceAccount.json', scopes) 
service = discovery.build('storage','v1',credentials = credentials) 

body = {'name':'my_image.jpg'} 
with TemporaryFile() as gcs_image: 
    cv2.imread('img.jpg').tofile(gcs_image) 
    req = service.objects().insert(
     bucket='my_bucket’, body=body, 
     media_body=googleapiclient.http.MediaIoBaseUpload(
      gcs_image, 'application/octet-stream')) 

    resp = req.execute() 

Beachten Sie, dass googleapiclient ist nicht-idiomatischen und Wartung nur (es nicht mehr entwickelt wird). Ich würde empfehlen, idiomatic one zu verwenden.

Verwandte Themen