【问题标题】:Wildcards in GCS bucket Java client apiGCS 存储桶 Java 客户端 api 中的通配符
【发布时间】:2014-08-25 20:40:13
【问题描述】:

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

但是在java客户端api中

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    通配符是 gsutil 的一项功能,但它们不是 Google Cloud Storage API 的固有部分。但是,您可以像 gsutil 一样处理这个问题。

    如果您想查找以某个前缀开头的每个对象的名称,Google Cloud Storage 的 API 提供了一个带有“前缀”参数的列表方法。只有匹配前缀的对象才会被返回。这不适用于任意正则表达式,但它适用于您的示例。

    documentation for the list method 更详细。

    【讨论】:

      【解决方案2】:

      正如 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);
          }
        }
      }
      

      【讨论】:

      • hii 我正在尝试使用您的代码列出对象我收到以下错误请帮助我解决这个问题 .java.lang.NoSuchMethodError: com.google.api.client.http.HttpRequest.setEnableGZipContent(Z )Lcom/google/api/client/http/HttpRequest;
      • 看起来库版本不匹配。你是如何获得依赖 jar 的?请参阅 maven 列表:mvnrepository.com/artifact/com.google.api-client/… 并确保每个依赖项(尤其是在这种情况下的 http-client )以及该版本都有正确的 jar。
      • @ozarov 我从 list.execute() 收到 GoogleJsonResponseException: 403 ,其中指出:“domain”:“usageLimits”,“message”:“未配置访问。API(云存储 API)未为您的项目启用。请使用 Google Developers Console 更新您的配置。", "reason" : "accessNotConfigured"。我一直在使用 gcs 一段时间(使用 Blobstore API),云存储 API 已打开,我刚刚打开了谷歌云存储 JSON API,但我得到了同样的异常。有任何想法吗?谢谢
      • 抱歉 timmacp,刚刚注意到您的评论。不,我不清楚如果您从一个同时启用“云存储 API”和 JSON API 的项目运行(并且您尝试访问的存储桶属于该项目),为什么会收到这样的错误消息。我假设其他 GCS 操作也会失败,还是仅列出?要进行故障排除,我需要 appid 和存储桶名称(使用我的个人资料中提到的邮件地址)。
      猜你喜欢
      • 1970-01-01
      • 2021-05-30
      • 2020-09-17
      • 2013-01-01
      • 2021-08-13
      • 2021-02-21
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多