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

lrl1mhuk  于 2024-01-05  发布在  Java
关注(0)|答案(3)|浏览(173)

我想设置pageToken以获取存储在Google Cloud Storage的项目。我正在使用Google API Client Library for Java v1.19.x。
我不知道从文件路径(或文件名)生成pageToken。
存储桶中存储了2个文件。

  • 我的水桶
  • /test.csv
  • /test2.csv

当我使用以下参数尝试Google APIs Explorer时,我可以得到nextPageToken Cgh0ZXN0LmNzdg==
我发现我可以通过使用base64解码nextPageToken来获得test.csv字符串。

  • bucket:my-bucket
  • pageToken:
  • 前缀:test
  • 最大结果:1

{"kind": "storage#objects", "nextPageToken": "Cgh0ZXN0LmNzdg==", ...}
但是如何从test.csv得到Cgh0ZXN0LmNzdg==
虽然我尝试了Base64编码,但结果不匹配。

  1. import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
  2. String lastFile = "test.csv"
  3. String token = Base64.encodeBase64String(lastFile.getBytes());
  4. String bucket = "my-bucket"
  5. String prefix = "test"
  6. Storage.Objects.List listObjects = client.objects().list(bucket);
  7. listObjects.setPrefix(prefix);
  8. listObjects.setPageToken(token);
  9. long maxResults = 1;
  10. listObjects.setMaxResults(maxResults);
  11. do {
  12. Objects objects = listObjects.execute();
  13. List<StorageObject> items = objects.getItems();
  14. token = objects.getNextPageToken();
  15. listObjects.setPageToken(token);
  16. } while (token != null);

字符串

w3nuxt5m

w3nuxt5m1#

我可以得到下一个令牌从文件路径字符串使用以下代码由自己。

如何从path string中获取nextToken

String nextToken = base64encode(0x0a + asciiCode + pathString)
asciiCode可以在0x 01(SOH)和0x 7 f(DEL)之间取。它似乎取决于路径长度。

  • my-bucket
  • a/a(3字节)0x 03
  • a/ab(4字节)0x 04
  • test.txt(8字节)0x 08
    注意事项

如果路径长度大于1024字节,则另一个规则似乎适用。但我找不到规则。
参见Object Name Requirements

  1. import com.google.common.io.BaseEncoding;
  2. String lastFile = "test.csv"
  3. String token = base64Encode(lastFile);
  4. String bucket = "my-bucket"
  5. String prefix = "test"
  6. Storage.Objects.List listObjects = client.objects().list(bucket);
  7. listObjects.setPrefix(prefix);
  8. listObjects.setPageToken(token);
  9. long maxResults = 1;
  10. listObjects.setMaxResults(maxResults);
  11. do {
  12. Objects objects = listObjects.execute();
  13. List<StorageObject> items = objects.getItems();
  14. token = objects.getNextPageToken();
  15. listObjects.setPageToken(token);
  16. } while (token != null);
  17. private String base64Encode(String path) {
  18. byte[] encoding;
  19. byte[] utf8 = path.getBytes(Charsets.UTF_8);
  20. encoding = new byte[utf8.length + 2];
  21. encoding[0] = 0x0a;
  22. encoding[1] = new Byte(String.valueOf(path.length()));
  23. String s = BaseEncoding.base64().encode(encoding);
  24. return s;
  25. }

字符串

展开查看全部
xxls0lw8

xxls0lw82#

正如@sakama所回答的那样,页面令牌确实被编码为base64([LF] + length + name.bytes)。除了他的答案之外,数组的长度是一个varint,它将回答如何编码长于127字节的名称。示例代码:

  1. private static String pageToken(String name) {
  2. var encodedName = name.getBytes(StandardCharsets.UTF_8);
  3. // Use initial size of +3 (0x0a + 2 bytes for length of max 1024)
  4. var bos = new ByteArrayOutputStream(encodedName.length + 3);
  5. bos.write(0x0a);
  6. writeVarInt(bos, encodedName.length);
  7. bos.write(encodedName, 0, encodedName.length);
  8. return Base64.getEncoder().encodeToString(bos.toByteArray());
  9. }
  10. public static void writeVarInt(ByteArrayOutputStream bos, int value) {
  11. while ((value & ~0x7f) != 0) {
  12. bos.write((value & 0x7f) | 0x80);
  13. value >>>= 7;
  14. }
  15. bos.write(value);
  16. }

字符串
最大对象名称大小为1024

展开查看全部
hmmo2u0o

hmmo2u0o3#

我知道这个问题已经得到了回答,并且适用于Java,我想提一下这个问题也适用于PHP。
在上面sakama批准的帖子的帮助下,我想出了他的解决方案的PHP版本。
生成token的PHP等价物如下:
第一个月
字节模式看起来确实是(正如sakama已经提到的):
<line feed><line data length><line data>

相关问题