使用Java从Google Storage下载文件

问题描述:

我已经成功实现了将数据从Google Big Query移至Google Storage的过程自动化。现在我需要以自动的方式将数据从Google Storage下载到我的环境中。使用Java从Google Storage下载文件

我想做一个正常的HTTP请求,但之前授权。所以,我的HTTP请求是

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

我的授权码是

/** 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"); 
    } 

凡以下常量是

  1. CREDENTIALS_DIRECTORY: “.oauth的凭据”
  2. JSON_FACTORY:JacksonFactory。 getDefaultInstance()
  3. SCOPES:刚刚有字符串的列表“https://www.googleapis.com/auth/devstorage.full_control
  4. HTTP_TRANSPORT:新NetHttpTransport()

什么我在身份验证/授权过程丢失?我越来越

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

你可能也想尝试一下。['gcloud-java'(http://googlecloudplatform.github.io/gcloud-java/),这里的一些[示例代码(HTTPS: //github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-examples/src/main/java/com/google/gcloud/examples/StorageExample.java)。 –

对于其他寻找答案。要使用应用程序的默认凭据,您需要执行以下几个步骤...您可以按照以下步骤操作,或查看此link

  1. 首先第一件事情:安装谷歌云存储SDK
  2. 确保您可以从SDK运行命令。如果您没有安装python,则需要安装python 2.7或更高版本以及pyopenssl ...
  3. 您需要通过运行 gcloud auth activate-service-account [Service account email] --key-fil e [.p12文件](编辑方括号中的值)。当您运行此应用程序时,您应该会收到一条消息,告知您已激活服务帐户
  4. 您需要通过将 GOOGLE_APPLICATION_CREDENTIALS设置为秘密的JSON路径(从创建的服务帐户下载的密码)来设置SDK中的环境变量从开发者控制台) CLOUDSDK_PYTHON_SITEPACKAGES为1,并设置项目

命令来配置系统变量...

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

后您进行验证,并授权自己,你然后可以开始使用应用程序的默认凭据,因为您已经正确设置了您的环境。

当您成功设置你的环境,你就可以进行身份​​验证,并通过刚刚

 
     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(); 

得到默认的凭据,并使用HTTP GET来从你的谷歌存储桶,即对象像下面

 
// 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);