AWS-S3
view release on metacpan or search on metacpan
lib/AWS/S3/File.pm view on Meta::CPAN
my $s = shift;
return unless $s->etag;
( my $etag = $s->etag ) =~ s{^"}{};
$etag =~ s{"$}{};
$s->{etag} = $etag;
} # end BUILD()
sub update {
my $s = shift;
my %args = @_;
my @args_ok = grep { /^content(?:s|type)$/ } keys %args;
if ( @args_ok ) {
$s->{$_} = $args{$_} for @args_ok;
$s->_set_contents();
return 1;
}
return;
} # end update()
sub _get_contents {
my $s = shift;
my $type = 'GetFileContents';
my $req = $s->bucket->s3->request(
$type,
bucket => $s->bucket->name,
key => $s->key,
);
return \$req->request->response->decoded_content;
} # end contents()
sub _set_contents {
my ( $s, $ref ) = @_;
my $type = 'SetFileContents';
my %args = ();
my $response = $s->bucket->s3->request(
$type,
bucket => $s->bucket->name,
file => $s,
contents => $ref,
content_type => $s->contenttype,
server_side_encryption => $s->is_encrypted ? 'AES256' : undef,
)->request();
( my $etag = $response->response->header( 'etag' ) ) =~ s{^"}{};
$etag =~ s{"$}{};
$s->{etag} = $etag;
if ( my $msg = $response->friendly_error() ) {
die $msg;
} # end if()
} # end _set_contents()
sub signed_url {
my $s = shift;
my $expires = shift || 3600;
# expiry for v4 signature is in seconds, not epoch time
if ( $expires > time ) {
$expires -= time;
}
my $key = $s->key;
if ( ! $s->bucket->s3->honor_leading_slashes ) {
$key =~ s!^/!!;
}
my $type = "GetPreSignedUrl";
my $uri = $s->bucket->s3->request(
$type,
bucket => $s->bucket->name,
key => $key,
expires => $expires,
)->request;
return $uri;
}
sub delete {
my $s = shift;
my $type = 'DeleteFile';
my $req = $s->bucket->s3->request(
$type,
bucket => $s->bucket->name,
key => $s->key,
);
my $response = $req->request();
if ( my $msg = $response->friendly_error() ) {
die $msg;
} # end if()
return 1;
} # end delete()
__PACKAGE__->meta->make_immutable;
__END__
=pod
=head1 NAME
AWS::S3::File - A single file in Amazon S3
=head1 SYNOPSIS
my $file = $bucket->file('foo/bar.txt');
# contents is a scalarref:
print @{ $file->contents };
print $file->size;
print $file->key;
print $file->etag;
print $file->lastmodified;
lib/AWS/S3/File.pm view on Meta::CPAN
The size in bytes of the file.
=head2 etag
String - read-only.
The Amazon S3 'ETag' header for the file.
=head2 owner
L<ASW::S3::Owner> - read-only.
The L<ASW::S3::Owner> that the file belongs to.
=head2 storage_class
String - read-only.
The type of storage used by the file.
=head2 lastmodified
String - read-only.
A date in this format:
2009-10-28T22:32:00
=head2 contents
ScalarRef|CodeRef - read-write.
Returns a scalar-reference of the file's contents.
Accepts either a scalar-ref or a code-ref (which would return a scalar-ref).
Once given a new value, the file is instantly updated on Amazon S3.
# GOOD: (uses scalarrefs)
my $value = "A string";
$file->contents( \$value );
$file->contents( sub { return \$value } );
# BAD: (not scalarrefs)
$file->contents( $value );
$file->contents( sub { return $value } );
=head1 PUBLIC METHODS
=head2 delete()
Deletes the file from Amazon S3.
=head2 update()
Update contents and/or contenttype of the file.
=head2 signed_url( $expiry_time )
Will return a signed URL for public access to the file. $expiry_time should be a
Unix seconds since epoch, and will default to now + 1 hour is not passed.
Note that the Signature parameter value will be URI encoded to prevent reserved
characters (+, =, etc) causing a bad request.
=head1 SEE ALSO
L<The Amazon S3 API Documentation|http://docs.amazonwebservices.com/AmazonS3/latest/API/>
L<AWS::S3>
L<AWS::S3::Bucket>
L<AWS::S3::FileIterator>
L<AWS::S3::Owner>
=cut
( run in 0.627 second using v1.01-cache-2.11-cpan-39bf76dae61 )