使用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");
}
凡以下常量是
- CREDENTIALS_DIRECTORY: “.oauth的凭据”
- JSON_FACTORY:JacksonFactory。 getDefaultInstance()
- SCOPES:刚刚有字符串的列表“https://www.googleapis.com/auth/devstorage.full_control”
- 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>
答
对于其他寻找答案。要使用应用程序的默认凭据,您需要执行以下几个步骤...您可以按照以下步骤操作,或查看此link。
- 首先第一件事情:安装谷歌云存储SDK
- 确保您可以从SDK运行命令。如果您没有安装python,则需要安装python 2.7或更高版本以及pyopenssl ...
- 您需要通过运行 gcloud auth activate-service-account [Service account email] --key-fil e [.p12文件](编辑方括号中的值)。当您运行此应用程序时,您应该会收到一条消息,告知您已激活服务帐户
- 您需要通过将 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);
你可能也想尝试一下。['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)。 –