Enviar um ficheiro para o Google Cloud Storage (Java)

basicamente, a questão está no título: não consigo descobrir como enviar um ficheiro para o Google Storage

Eu verifiquei esta página web:
https://cloud.google.com/storage/docs/uploading-objects

estas duas linhas são sugeridas para o "uploading objects" na página linguagem Java:

InputStream content = new ByteArrayInputStream("Hello, World!".getBytes(UTF_8));
Blob blob = bucket.create(blobName, content, "text/plain");

o objecto bucket acima pode ser recebido de storage objecto, e essa é, na verdade, a raiz do problema

Em todos os tutoriais que vi até agora (particularmente neste: https://support.google.com/dfp_premium/answer/1733127?hl=en ), o storage pertence a com.google.api.services.storage.Storage em vez de com.google.cloud.storage.Storage, e é instanciado do seguinte modo:

        httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountScopes(
                Collections.singleton(STORAGE_SCOPE))
            .setServiceAccountPrivateKeyFromP12File(p12File).build();

        storage = new com.google.api.services.storage.Storage.Builder(httpTransport,
            JacksonFactory.getDefaultInstance(), credential)
            .setApplicationName(PROJECT_NAME).build();

Depois de criar um objecto de armazenamento desta forma, podemos obter um objecto de balde da seguinte forma:

    com.google.api.services.storage.Storage.Buckets.Get object = storage.buckets().get(BUCKET_NAME);        
    com.google.api.services.storage.model.Bucket bucket = object.execute();

mas não posso usar com.google.api.services.storage.model.Bucket para carregar ficheiros porque não tem o método create() mencionado acima. Preciso de usar com.google.cloud.storage.Bucket em vez disso.

Também verifiquei esta questão do stackoverflow.: enviar a imagem para o Google Cloud Storage (Java)
e os exemplos nos links fornecidos realmente usam com.google.cloud.storage.Storage e com.google.cloud.storage.Bucket mas eles nunca mostram como passar credenciais e instanciar storage objeto semelhante ao código acima.

alguém pode fornecer um excerto Java claro e abrangente que mostre como enviar um ficheiro para o armazenamento no Google Cloud, incluindo todas as instanciações credenciais necessárias do objecto storage?

editar. Por outras palavras, preciso de personalizar a instanciação. de com.google.cloud.storage.Storage como em cima, em vez de usar esta linha: Storage storage = StorageOptions.getDefaultInstance().getService();

EDIT2. Finalmente consegui carregar o ficheiro depois de recuperar o balde pelo seguinte código:

GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(KEY_JSN)).createScoped(Lists.newArrayList("https://www.googleapis.com/auth/devstorage.read_write"));

Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

Bucket bucket = storage.get(BUCKET_NAME);
Um único ponto subtil que me resta é a seguinte linha:
Page<Bucket> buckets = storage.list();

devolve uma lista vazia. Será Que Faz Sentido receber uma lista vazia enquanto é capaz de receber um determinado balde meta por get(bucket_name) ?

Author: mangusta, 2018-07-16

1 answers

Fui capaz de criar e enviar para um balde usando as bibliotecas com.google.cloud.storage no seguinte excerto derivado da documentação :

public void createBlobFromByteArray(String blobName, String jsonPath, String bucketName) throws IOException {
                GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
                    .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
                Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
                Bucket bucket = storage.create(BucketInfo.of(bucketName));
                Blob blob = bucket.create(blobName, "Hello, World!".getBytes(UTF_8), "text/plain");
          }

Tem de criar uma chave de conta do serviço JSON e descarregá-la da consola do Google Cloud. Em seguida, passe-o no método GoogleCredentials para autenticar 'storage'

 1
Author: Yasser Karout, 2018-07-16 21:02:51