GCS中的通配符桶Java客户端api

时间:2014-07-04 13:27:23

标签: google-app-engine google-cloud-storage

在文件名中使用通配符我正在尝试从GCS存储桶中读取文件。 在gsutil命令行中,通配符正在指定文件名。

但是在java client api中

GcsFilename filename = new GcsFilename(BUCKETNAME, "big*");

它正在搜索名为" big *"的文件而不是以big开头的文件。 请帮助我如何在GCSFilename中使用通配符。

提前致谢。

2 个答案:

答案 0 :(得分:2)

通配符是gsutil的一项功能,但它们并不是Google云端存储API的固有部分。但是,您可以像gsutil一样处理此问题。

如果您想查找以特定前缀开头的每个对象的名称,Google云端存储的API会提供一个带有"前缀的列表方法"论点。仅返回与前缀匹配的对象。这对任意正则表达式都不起作用,但它适用于您的示例。

documentation for the list method详细介绍。

答案 1 :(得分:1)

正如Brandon Yarbrough所提到的,GcsFilename代表一个GCS对象的名称,它可以包含任何有效的UTF-8字符[不包括一些如\ r \ n但包括'*'的字符 不建议)。有关详情,请参阅https://developers.google.com/storage/docs/bucketnaming#objectnames。 GAE GCS客户端尚不支持列表(虽然计划添加),所以现在您可以直接使用GCS XML或JSON API(使用urlfetch)或使用Java GCS api客户端https://developers.google.com/api-client-library/java/apis/storage/v1 请参阅后一个选项的示例:

public class ListServlet extends HttpServlet {

  public static final List<String> OAUTH_SCOPES =
      ImmutableList.of("https://www.googleapis.com/auth/devstorage.read_write");

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    try {
      String bucket = req.getParameter("bucket");
      AppIdentityCredential cred = new AppIdentityCredential(OAUTH_SCOPES);
      Storage storage = new Storage.Builder(new UrlFetchTransport(), new JacksonFactory(), cred)
        .setApplicationName(SystemProperty.applicationId.get()).build();
      Objects.List list = storage.objects().list(bucket);
      for (StorageObject o : list.execute().getItems()) {
        resp.getWriter().println(o.getName() + " -> " + o);
      }
    } catch (Exception ex) {
      throw new ServletException(ex);
    }
  }
}