11

Ich habe den Prozess zum Verschieben von Daten von Google Big Query auf Google Storage erfolgreich automatisiert. Jetzt muss ich die Daten von Google Storage auch automatisiert in meine Umgebung herunterladen.Herunterladen von Dateien aus Google Storage mit Java

Ich versuche, eine normale HTTP-Anfrage zu tun, aber vorher autorisieren. Also meine HTTP-Anforderung ist

HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory(authorize()); 
    GenericUrl url = new GenericUrl(uri); 
    HttpRequest request = requestFactory.buildGetRequest(url); 
    HttpResponse response = request.execute(); 
    String content = response.parseAsString(); 

Und mein Autorisierungscode ist

/** Authorizes the installed application to access user's protected data. */ 
    private static Credential authorize() throws Exception 
    { 
     HttpTransport httpTransport = new NetHttpTransport(); 
     JsonFactory jsonFactory = new JacksonFactory(); 

     // load client secrets 
     GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, 
       new InputStreamReader(BigQueryConsumer.class.getResourceAsStream("/secret.json"))); 

     // This creates the credentials datastore at ~/.oauth-credentials/${credentialDatastore} 
     FileDataStoreFactory fileDataStoreFactory = new FileDataStoreFactory(new File(System.getProperty("user.home") + "/" + CREDENTIALS_DIRECTORY)); 

     // set up authorization code flow 
     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
       httpTransport, JSON_FACTORY, clientSecrets, 
       SCOPES).setDataStoreFactory(fileDataStoreFactory) 
       .build(); 
     // authorize 
     return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); 
    } 

Wo die folgenden Konstanten

  1. CREDENTIALS_DIRECTORY sind: ".oauth-credentials"
  2. JSON_FACTORY: JacksonFactory. getDefaultInstance()
  3. SCOPES: Eine Liste der Zeichenfolge mit nur "https://www.googleapis.com/auth/devstorage.full_control"
  4. HTTP_TRANSPORT: neue NetHttpTransport()

Was soll ich während der Authentifizierung/Autorisierung Prozess fehlt? Ich bekomme

Exception in thread "main" com.google.api.client.http.HttpResponseException: 401 Unauthorized 
<HTML> 
<HEAD> 
<TITLE>Unauthorized</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Unauthorized</H1> 
<H2>Error 401</H2> 
</BODY> 
</HTML> 
+1

Sie möchten vielleicht auch ausprobieren [ 'gcloud-java'] (http://googlecloudplatform.github.io/gcloud-java/), hier einige [Beispielcode] (https: //github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-examples/src/main/java/com/google/gcloud/examples/StorageExample.java). –

Antwort

5

Für andere auf der Suche nach einer Antwort. Es gibt mehrere Schritte, die Sie befolgen müssen, um die Standardanmeldeinformationen der Anwendung zu verwenden ... Sie können die folgenden Schritte ausführen oder sich diese link ansehen.

  1. Das Wichtigste zuerst: Google Cloud Storage SDK
  2. Stellen Sie sicher, installieren Sie Befehle aus dem SDK ausführen können. Wenn Sie Python nicht installiert haben, müssen Sie python 2.7 oder höher und pyopenssl ...
  3. installieren. Sie müssen sich mit dem SDK authentifizieren, indem Sie das gcloud auth activate-service-account [Dienstkonto E-Mail] ausführen. --key-fil e [.p12 file] (Bearbeiten Sie die Werte in den eckigen Klammern). Wenn Sie das ausführen, sollten Sie eine Nachricht erhalten, die besagt, dass Sie Ihr Dienstkonto aktiviert haben.
  4. Sie müssen Umgebungsvariablen aus dem SDK festlegen, indem Sie GOOGLE_APPLICATION_CREDENTIALS auf den JSON-Pfad des geheimen Schlüssels (der aus dem erstellten Dienstkonto heruntergeladene) setzen von der Entwickler-Konsole) CLOUDSDK_PYTHON_SITEPACKAGES auf 1 und Einstellung auch das Projekt

Befehle Systemvariablen zu konfigurieren ...

 
set GOOGLE_APPLICATION_CREDENTIALS "secret.json path" 
set CLOUDSDK_PYTHON_SITEPACKAGES 1 
gcloud config set project "your project name" 

Nachdem Sie authentifizieren und autorisieren Sie sich, Sie kann dann die Standardanmeldeinformationen der Anwendung verwenden, vorausgesetzt, Sie haben Ihre Umgebung ordnungsgemäß eingerichtet.

Wenn Sie Ihre Umgebung erfolgreich eingerichtet haben, können Sie die Authentifizierung und Standardanmeldeinformationen von

nur
 
     GoogleCredential credential = GoogleCredential.getApplicationDefault(); 

     if (credential.createScopedRequired()) { 
      credential = credential.createScoped(StorageScopes.all()); 
     } 

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     storageService = new Storage.Builder(httpTransport, jsonFactory, credential) 
       .setApplicationName(applicationName).build(); 

Und mit HTTP GET erhalten Objekte aus Ihrem Google-Speicher Eimer, das heißt erhaltenso etwas wie die folgenden

 
// Set up and execute a Google Cloud Storage request. 
       String uri = "https://storage.googleapis.com/" + URLEncoder.encode("[your bucket name here]", "UTF-8") + "/" + googleStorageFileName + "/" + fileName; 

       httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
       HttpRequestFactory requestFactory = httpTransport.createRequestFactory(
         credential); 
       GenericUrl url = new GenericUrl(uri); 

       HttpRequest request = requestFactory.buildGetRequest(url); 
       HttpResponse response = request.execute(); 
       String content = response.parseAsString(); 
       BufferedWriter writer = new BufferedWriter(new FileWriter(pathToSave + googleStorageFileName)); 
       writer.write(content); 
Verwandte Themen