如何设置 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 个文件。
- 我的桶
- /test.csv
- /test2.csv
当我尝试使用以下参数 Google APIs Explorer 时,我可以获得 nextPageToken Cgh0ZXN0LmNzdg==
.
而且我发现我可以通过使用 base64 解码 nextPageToken 得到 test.csv
字符串。
- 桶:我的桶
- 页面令牌:
- 前缀:测试
- 最大结果:1
{"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 字节,则似乎适用另一条规则。但是我找不到规则。
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>
我想设置 pageToken 以获取存储在 Google 云存储中的项目。我正在为 Java v1.19.x.
使用 Google API 客户端库我不知道从文件路径(或文件名)生成 pageToken。
存储桶中存储了 2 个文件。
- 我的桶
- /test.csv
- /test2.csv
当我尝试使用以下参数 Google APIs Explorer 时,我可以获得 nextPageToken Cgh0ZXN0LmNzdg==
.
而且我发现我可以通过使用 base64 解码 nextPageToken 得到 test.csv
字符串。
- 桶:我的桶
- 页面令牌:
- 前缀:测试
- 最大结果:1
{"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 字节,则似乎适用另一条规则。但是我找不到规则。
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>