【问题标题】:Issues with the Perl binding of the Rackspace Cloud API and setting/getting object metadataRackspace Cloud API 的 Perl 绑定和设置/获取对象元数据的问题
【发布时间】:2012-11-01 19:07:23
【问题描述】:

使用非官方的Perl binding of the Rackspace Cloud API [Github],我一辈子都无法设置或检索给定对象的元数据。

我可以成功地从云中提取文件,但是当我按照文档中的定义调​​用 object_metadata 时,我收到一个错误,抱怨 uninitialized value。我可以通过云文件管理器验证元数据中是否为 Status 设置了值。我什至试过检查X-Object-Meta-Status(没有成功)。

相关代码如下:

# authentication
# set $container to pre-made container
my @files = $container->objects(prefix => 'tainted/')->all;
FILE: foreach my $file(@files) {

  # throws undefined // have tried capitalized and not, quotes and none
  next FILE if $file->object_metadata->{'status'} != '-1';

  # download file from object & do stuff with it

  # does not update object in cloud (not sure if anything id done locally)
  $file->object_metadata({ status => $status });

}

就像我说的,对象已成功检索,我只是无法查看给定文件的元数据。我已经玩过上面的一些变体,但是对新方法的每次测试都会花费带宽(钱!)。任何帮助将不胜感激!

【问题讨论】:

  • 元数据中到底有什么?尝试使用Data::Dumper 来检查$file->object_metadata 的结构。
  • print Dumper($file->object_metadata); 为每个 $file 输出 $VAR1 = {};
  • 我访问了 Rackspace 网站并打开了一个与销售人员聊天的窗口。他向我提供了一个可以用作沙盒的 20 英镑免费试用帐户。我不知道能为您提供多少服务,但我建议您也这样做。
  • 非常感谢,@simbabque!这非常有帮助。我会看看他们能为我做些什么。

标签: perl api file rackspace-cloud


【解决方案1】:

我感觉根本没有设置元数据。我们来看看WebService::Rackspace::CloudFiles::Object,它是使用Moose构建的:

has 'object_metadata' => (
    is => 'rw',
    isa => 'HashRef',
    required => 0,
    default => sub {
        return {};
    }
);

所以有一个可选属性object_metadata,可以使用内置选择器检索。太好了!

$container->objects 返回的对象是在WebService::Rackspace::CloudFiles::Container 中创建的,如下所示(截图):

foreach my $bit (@bits) {
  push @objects,
    WebService::Rackspace::CloudFiles::Object->new(
    cloudfiles => $self->cloudfiles,
    container => $self,
    name => $bit->{name},
    etag => $bit->{hash},
    size => $bit->{bytes},
    content_type => $bit->{content_type},
    last_modified => $bit->{last_modified},
  );
}

所以如果我没看错的话,这个调用中没有object_metadata 属性,这很好,因为它是可选的。但是如果没有设置,那么检索一个空的 hashref 是有意义的,不是吗?

我想说你可能想自己修补它。 :-/


我做了更多挖掘:在CloudFiles docs 中,它表示元数据在结果的 HTTP 标头中返回。 docs on how to retrieve metadata 本身很好地解释了它是如何传输的。但不幸的是,模块中肯定没有解析。

【讨论】:

  • 实际上,只是深入挖掘,我认为现有代码确实处理了标题(或者至少应该处理)。 See here.
  • @Dan:我认为确实如此,但不是您在问题中描述的情况。至少我是这么认为的。无法真正测试它。 _set_attributes_from_responseObject 中从getheadget_filename 调用,这是有道理的。但如果我没看错,那么Container 中的object 方法永远不会调用这些方法中的任何一个。它只是为在回调中返回的每个$bits 创建一个Object。我无法对其进行测试,但在我看来,只有在您专门请求一个文件时才会设置元数据。
  • 我明白你现在在说什么了。这似乎是合理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2020-04-24
  • 2013-06-20
  • 2010-11-14
相关资源
最近更新 更多