gpt4 book ai didi

java - Google Cloud 端点存储桶下载器

转载 作者:行者123 更新时间:2023-12-02 13:00:46 25 4
gpt4 key购买 nike

我对 GC 平台非常很陌生,正在尝试使用两种方法在 Java 中创建 API:一种方法返回特定存储桶中所有文件的列表,另一种方法检索特定存储桶中的所有文件的列表。该存储桶中的指定文件。目标是能够迭代文件列表,以便从存储桶下载每个文件。本质上,我想在 Android 设备上镜像存储桶的内容,因此将从 Android 应用程序中生成的客户端库调用 API。我的 getFileList() 方法返回一个 ListResult 对象。如何从中提取文件列表?

@ApiMethod(name = "getFileList", path = "getFileList", httpMethod = ApiMethod.HttpMethod.GET)
public ListResult getFileList(@Named("bucketName") String bucketName) {
GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
ListResult result = null;
try {
result = gcsService.list(bucketName, ListOptions.DEFAULT);
return result;
} catch (IOException e) {
return null; // Handle this properly.
}
}

此外,我正在努力确定我的 getFile() API 方法的返回类型应该是什么。我不能使用字节数组,因为返回类型不能是我理解的简单类型。这就是我的情况:

@ApiMethod(name = "getFile", path = "getFile", httpMethod = ApiMethod.HttpMethod.GET)
public byte[] getFile(@Named("bucketName") String bucketName, ListItem file) {
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename gcsFilename = new GcsFilename(bucketName, file.getName());
ByteBuffer byteBuffer;
try {
int fileSize = (int) gcsService.getMetadata(gcsFilename).getLength();
byteBuffer = ByteBuffer.allocate(fileSize);
GcsInputChannel gcsInputChannel = gcsService.openReadChannel(gcsFilename, 0);
gcsInputChannel.read(byteBuffer);
return byteBuffer.array();
} catch (IOException e) {
return null; // Handle this properly.
}
}

我迷失在有关这些内容的 Google 文档中,并且担心我的方向完全错误,因为我想做的就是安全地下载一堆文件!

最佳答案

我无法为您提供完整的解决方案,因为这是我为我的公司编写的代码,但我可以向您展示一些基础知识。我用google-cloud-java API。

首先,您需要创建一个 API key 并以 JSON 格式下载。更多详情can be found here .

除其他外,我的类(class)中有这两个字段:

protected final Object storageInitLock = new Object();
protected Storage storage;

首先,您需要一个方法来初始化 com.google.cloud.storage.Storage 对象,例如(设置您的项目 ID 和 json api key 的路径):

protected final Storage getStorage() {
synchronized (storageInitLock) {
if (null == storage) {
try {
storage = StorageOptions.newBuilder()
.setProjectId(PROJECTID)
.setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(pathToJsonKey)))
.build()
.getService();
} catch (IOException e) {
throw new MyCustomException("Error reading auth file " + pathToJsonKey, e);
} catch (StorageException e) {
throw new MyCustomException("Error initializing storage", e);
}
}

return storage;
}
}

要获取所有条目,您可以使用以下内容:

protected final Iterator<Blob> getAllEntries() {
try {
return getStorage().list(bucketName).iterateAll();
} catch (StorageException e) {
throw new MyCustomException("error retrieving entries", e);
}
}

列出目录中的文件:

public final Optional<Page<Blob>> listFilesInDirectory(@NotNull String directory) {
try {
return Optional.ofNullable(getStorage().list(getBucketName(), Storage.BlobListOption.currentDirectory(),
Storage.BlobListOption.prefix(directory)));
} catch (Exception e) {
return Optional.empty();
}
}

获取有关文件的信息:

public final Optional<Blob> getFileInfo(@NotNull String bucketFilename) {
try {
return Optional.ofNullable(getStorage().get(BlobId.of(getBucketName(), bucketFilename)));
} catch (Exception e) {
return Optional.empty();
}
}

添加文件:

public final void addFile(@NotNull String localFilename, @NotNull String bucketFilename,
@Nullable ContentType contentType) {
final BlobInfo.Builder builder = BlobInfo.newBuilder(BlobId.of(bucketName, bucketFilename));
if (null != contentType) {
builder.setContentType(contentType.getsValue());
}
final BlobInfo blobInfo = builder.build();

try (final RandomAccessFile raf = new RandomAccessFile(localFilename, "r");
final FileChannel channel = raf.getChannel();
final WriteChannel writer = getStorage().writer(blobInfo)) {

writer.write(channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()));
} catch (Exception e) {
throw new MyCustomException(MessageFormat.format("Error storing {0} to {1}", localFilename,
bucketFilename), e);
}
}

我希望这些代码片段和引用文档能够帮助您前进,实际上这并不太难。

关于java - Google Cloud 端点存储桶下载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44308147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com