Google 提供了 Google Cloud Storage 的代码示例和库。下面的 Java 示例用于读取 Ad Manager 云端存储桶中的某个文件。该示例显示了您在设置服务账号时配置的组件可能会对代码产生哪些影响:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.util.Collections;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.storage.Storage;
import com.google.api.services.storage.model.StorageObject;
public class GcsApiTest {
/**
* 名下创建了服务账号的项目的名称。
*
* 此信息显示在 Google Developers Console 下。
*/
private static final String PROJECT_NAME = "project name";
/**
* 服务账号的开发者电子邮件地址。
*
* 此电子邮件在您在 Google Developers Console 中
* 创建服务账号客户端 ID 后生成,您可以从“凭据”
* 页面检索此电子邮件。
*/
private static final String SERVICE_ACCOUNT_EMAIL = "service account email address";
/**
* 用于存储操作的存储桶。
*
* 您的客户经理向您提供了此存储桶的名称。
* 它的名称类似于“gdfp-12345678”或
*“gdfp_cookieupload_12345678”,这取决于您使用的 Ad Manager 插件。
*/
private static final String BUCKET_NAME = "bucket name";
/**
* Google Cloud Storage OAuth 2.0 读/写范围。这应该
* 对应于您的“查看数据传输存储桶”权限所蕴含的访问权限,
* 而且您无法请求获取
* 未通过此权限授予的访问权限。
*/
private static final String STORAGE_SCOPE =
"https://www.googleapis.com/auth/devstorage.read_write";
/**
* 提供该存储桶访问权限的 key.p12 文件的路径。
*
* 此文件在您创建服务客户端 ID 时生成。* 如果您没有此文件,则需要从Google Developers Console
* 生成新的客户端 p12 密钥。
*/
private static final String KEY_P12 = "path to .p12 key file";
/** HTTP 传输。*/
private HttpTransport httpTransport;
private Storage storage;
// constructor, sets up credentials and storage objects
public GcsApiTest() {
File p12File = new File(KEY_P12);
try {
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JacksonFactory.getDefaultInstance())
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(
Collections.singleton(STORAGE_SCOPE))
.setServiceAccountPrivateKeyFromP12File(p12File).build();
storage = new Storage.Builder(httpTransport,
JacksonFactory.getDefaultInstance(), credential)
.setApplicationName(PROJECT_NAME).build();
} catch (GeneralSecurityException | IOException e1) {
e1.printStackTrace();
System.exit(1);
}
}
/**
* 用于返回存储桶中第一个文件的名称的方法。
*
* @返回该文件的名称,如果存储桶为空,则返回 null
* @引发 IOException
*/
public String GetFirstFile() throws IOException {
Storage.Objects.List listObjects = storage.objects().list(BUCKET_NAME);
listObjects.setMaxResults(5L);
com.google.api.services.storage.model.Objects objects = listObjects
.execute();
// empty bucket?
if (null == objects.getItems() || objects.getItems().isEmpty()) {
System.out.println("Bucket \"" + BUCKET_NAME
+ "\" empty or invalid.");
return null;
}
StorageObject object = objects.getItems().get(0);
System.out.println("First object in bucket: \"" + object.getName()
+ "\".");
return object.getName();
}
/**
* 用于从存储桶下载指定文件的方法
*
* @参数文件名
* 应下载的文件的名称。
* @引发 IOException
*/
public void DownloadFile(String filename) throws IOException {
Storage.Objects.Get getObject = storage.objects().get(BUCKET_NAME,
filename);
OutputStream os = new FileOutputStream(filename, true);
getObject.getMediaHttpDownloader().setDirectDownloadEnabled(true);
getObject.executeMediaAndDownloadTo(os);
System.out.println("File \"" + filename + "\" downloaded.");
}
/**
* 用于执行不同测试的主方法。
*
* @形参 实参
*/
public static void main(String[] args) {
GcsApiTest gcsApiTest = new GcsApiTest();
try {
String filename = gcsApiTest.GetFirstFile();
gcsApiTest.DownloadFile(filename);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}