如何设置 pageToken 以通过 Java SDK 从 Google Cloud Storage 获取项目列表?

How can I set pageToken to get item lists from Google Cloud Storage via Java SDK?

我想设置 pageToken 以获取存储在 Google 云存储中的项目。我正在为 Java v1.19.x.

使用 Google API 客户端库

我不知道从文件路径(或文件名)生成 pageToken。

存储桶中存储了 2 个文件。

当我尝试使用以下参数 Google APIs Explorer 时,我可以获得 nextPageToken Cgh0ZXN0LmNzdg==.

而且我发现我可以通过使用 base64 解码 nextPageToken 得到 test.csv 字符串。

{"kind": "storage#objects", "nextPageToken": "Cgh0ZXN0LmNzdg==", ...}

但是我怎样才能从 test.csv 得到 Cgh0ZXN0LmNzdg==

虽然我尝试了 Base64 编码,但结果不匹配。

import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;

String lastFile = "test.csv"
String token = Base64.encodeBase64String(lastFile.getBytes());

String bucket = "my-bucket"
String prefix = "test"

Storage.Objects.List listObjects = client.objects().list(bucket);
listObjects.setPrefix(prefix);
listObjects.setPageToken(token);
long maxResults = 1;
listObjects.setMaxResults(maxResults);
do {
    Objects objects = listObjects.execute();
    List<StorageObject> items = objects.getItems();

    token = objects.getNextPageToken();
    listObjects.setPageToken(token);
} while (token != null);

我可以自己使用以下代码从文件路径字符串中获取下一个标记。

如何从路径字符串中获取 nextToken

String nextToken = base64encode(0x0a + asciiCode + pathString)

asciiCode可以取在0x01(SOH)和0x7f(DEL)之间。这似乎取决于路径长度。

  • 我的桶/
    • a/a(3字节)0x03
    • a/ab(4字节) 0x04
    • test.txt(8 字节)0x08

通知

如果路径长度超过 1024 字节,则似乎适用另一条规则。但是我找不到规则。

另见 Object Name Requirements

import com.google.common.io.BaseEncoding;

String lastFile = "test.csv"
String token = base64Encode(lastFile);

String bucket = "my-bucket"
String prefix = "test"

Storage.Objects.List listObjects = client.objects().list(bucket);
listObjects.setPrefix(prefix);
listObjects.setPageToken(token);
long maxResults = 1;
listObjects.setMaxResults(maxResults);
do {
    Objects objects = listObjects.execute();
    List<StorageObject> items = objects.getItems();

    token = objects.getNextPageToken();
    listObjects.setPageToken(token);
} while (token != null);

private String base64Encode(String path) {
    byte[] encoding;
    byte[] utf8 = path.getBytes(Charsets.UTF_8);
    encoding = new byte[utf8.length + 2];
    encoding[0] = 0x0a;
    encoding[1] = new Byte(String.valueOf(path.length()));
    String s = BaseEncoding.base64().encode(encoding);
    return s;
}

我知道这个问题已经回答并适用于 Java,我想提一下这个问题也适用于 PHP。

在上面 sakama 批准的 post 的帮助下,我找到了他的解决方案的 PHP 版本。

生成令牌的PHP等价物如下:
base64_encode(pack('c', 0x0a) . pack('c', $path_string_length) . pack('a*', $path_string));

字节模式似乎确实(正如 sakama 已经提到的那样)是:
<line feed><line data length><line data>