首页 > 解决方案 > 使用 Java 中的 Cloud Storage JSON API 在 Google 云中恢复上传文本文件,面临 403 错误代码禁止访问的问题

问题描述

我正在使用 Cloud Storage JSON API 的可恢复上传 api,如下面的代码中所述。

我已经在 bash 文件 GOOGLE_APPLICATION_CREDENTIALS = {json path}

当我尝试访问 google API 时,我收到了带有 403 代码的访问禁止错误。

我需要在上传功能中传递签名的网址吗?

RetryHttpInitializerWrapper 类,我找不到所以我通过了 HttpRequestInitializer httpRequestInitializer = null;

由于我确定的请求 URL,我正面临一些问题。

InputStreamContent mediaContent = new InputStreamContent(contentType, stream);
    mediaContent.setLength(mediaContent.getLength());
    GoogleCredential credential = GoogleCredential.getApplicationDefault();
    if (credential.createScopedRequired()) {
        credential = credential.createScoped(StorageScopes.all());
    }

    Storage client = StorageOptions.getDefaultInstance().getService();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    // custom HttpRequestInitializer for automatic retry upon failures.
    HttpRequestInitializer httpRequestInitializer = null;
    //HttpRequestInitializer httpRequestInitializer = new RetryHttpInitializerWrapper(credential);  
    GenericUrl requestUrl = new GenericUrl("https://www.googleapis.com/upload/storage/v1/b/"+bucket+"/o?uploadType=resumable&name="+name);
    MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, httpTransport, httpRequestInitializer);
    uploader.setProgressListener(new CustomProgressListener());
    HttpResponse response = uploader.upload(requestUrl);
    if (!response.isSuccessStatusCode()) {
        throw  GoogleJsonResponseException.from(JSON_FACTORY, response);
    }

标签: javagoogle-cloud-platformgoogle-cloud-storage

解决方案


我已经使用身份验证标头解决了这个问题。如代码中所述,我们可以在调用上传方法时设置 auth 标头。

Credentials credentials = GoogleCredentials.fromStream(new FileInputStream(CLIENTSECRETS_LOCATION));
    InputStreamContent mediaContent = new InputStreamContent(contentType, stream);
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    HttpRequestInitializer httpRequestInitializer = null;
    GenericUrl genericUrl = new GenericUrl(
            "https://www.googleapis.com/upload/storage/v1/b/" + bucket + "/o?uploadType=resumable&name=" + name);
    MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, httpTransport, httpRequestInitializer);
    HttpHeaders requestHeaders = new HttpHeaders();
    credentials = ((GoogleCredentials) credentials).createScoped(StorageScopes.all());
    Map<String, List<String>> credentialHeaders = credentials.getRequestMetadata();
    if (credentialHeaders == null) {
        return;
    }
    for (Map.Entry<String, List<String>> entry : credentialHeaders.entrySet()) {
        String headerName = entry.getKey();
        List<String> requestValues = new ArrayList<>();
        requestValues.addAll(entry.getValue());
        requestHeaders.put(headerName, requestValues);
    }


HttpResponse response = uploader.setInitiationHeaders(requestHeaders).setDisableGZipContent(true)
                .upload(genericUrl);

推荐阅读