我使用google-api-java-client访问Google Cloud Storage API。它可以从我的本地机器和一些服务器上正常工作。但它在生产服务器上失败了400 Bad Request(error:invalid_grant)。 Google Adwords API解决了Google Adwords API的类似问题。我认为他们只是将我使用过的服务器的IP列入白名单。 我是否可能需要在Google云端存储API中添加权限?这很奇怪,因为它适用于我的本地电脑。
public class StorageObj {
private static final String KEY_FILE_NAME = "key.p12";
private static final String APPLICATION_NAME = "application_name";
private static final String BUCKET_NAME = "bucket_name";
private static final String STORAGE_OAUTH_SCOPE = "https://www.googleapis.com/auth/devstorage.read_write";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private final Storage storageObject;
public StorageObj() throws GeneralSecurityException, IOException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_ACCOUNT_EMAIL)
.setServiceAccountScopes(Collections.singleton(STORAGE_OAUTH_SCOPE))
.setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_NAME))
.build();
this.storageObject = new Storage.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
;
}
public void insert(String folder, String file) throws IOException {
try (FileInputStream inputStream = new FileInputStream(new File(folder + file))) {
InputStreamContent mediaContent = new InputStreamContent("application/octet-stream", inputStream);
mediaContent.setLength(inputStream.available());
Storage.Objects.Insert insertObject = storageObject.objects()
.insert(BUCKET_NAME, null /* obj-meta-data */, mediaContent)
.setName(file);
int _2MB = 2 * 1000 * 1000;
if (mediaContent.getLength() > 0 && mediaContent.getLength() <= _2MB) {
insertObject.getMediaHttpUploader().setDirectUploadEnabled(true);
}
insertObject.execute();
}
public static void main(String[] args) throws IOException, GeneralSecurityException {
new StorageObj().insert(args[0], args[1]);
}
}
}
答案 0 :(得分:1)
我的第一个猜测是您的服务帐户可能无法访问云存储桶的ACL。也许你可以访问一个桶而不是所有桶,所以我认为你可能有适当的ACL用于某些桶,但不适用于其他桶?
另外,当你说“本地”时,你的意思是devserver吗?谷歌云存储在devserver中的行为有所不同,所以这可以通过devserver的工作方式来解释。
在我的回答中,我也认为,通过“服务器”,你在谷歌云存储上意味着不同的存储桶