Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change Content-Disposition of existing S3 object

In S3 REST API I am adding metadata to an existing object by using the PUT (Copy) command and copying a key to the same location with 'x-amz-metadata-directive' = 'REPLACE'

What I want to do is change the download file name by setting:

Content-Disposition: attachment; filename=foo.bar;

This sets the metadata correctly but when I download the file it still uses the key name instead of 'foo.bar'

I use a software tool S3 Browser to view the metadata and it looks correct (apart from 'Content-Disposition' being all lower case as that's was S3 ask me to sign)

Then using S3 Browser I just pressed, then save without changing anything and now it works???

What am I missing how come setting a metadata 'Content-Disposition: attachment; filename=foo.bar;' from my web app does not work but does work from S3 Browser?

like image 323
Daveo Avatar asked Apr 10 '10 15:04

Daveo


People also ask

Can you overwrite a file in S3?

Simply upload your new file on top of your old file to replace an old file in an S3 bucket. The existing file will be overwritten by your new file.

Can S3 objects be modified?

The Modify S3 Objects action can be used to modify properties of many S3 objects. Either all objects can be modified, or objects restricted by a specific key prefix.

What happens to existing S3 objects when you enable versioning?

When you enable S3 Versioning on an existing bucket, objects that are already stored in the bucket are unchanged. Their version IDs ( null ), contents, and permissions remain the same.

What is content disposition S3?

S3 provides multiple ways to set the Content-Disposition header of an object being downloaded, two of the main ways are: Set Content Disposition parameter on upload – works for new objects. Set response-content-disposition parameter in request – works for an existing object however requires a signed URL.


2 Answers

Edited for clarity:

Content-Disposition must be set explicitly and not included as x-amz-meta-Content-Disposition. All metadata header names must start with "x-amz-meta-" and be all lowercase.

Thanks to @Eyal for clarifying.

Original:

>SOLVED:
>
>The Doco at http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html
>
>seems to be wrong it says:
>
>Notice how the 'x-amz-' headers are sorted, white-space trimmed, converted tolowercase, and multiple headers with the same name have been joined using a comma toseparate values.
>
>Note how only the Content-Type and Content-MD5HTTPentity headers appear in the StringToSign .The otherContent-* entity headers do not.
However Content-Disposition must be set specifically and not included as : x-amz-meta-Content-Disposition
>
>It now works fine.
like image 140
Daveo Avatar answered Nov 04 '22 11:11

Daveo


here: this uses the cli to set the content-disposition header on all files in a path inside a bucket (and also sets them as public):

aws s3 ls s3://mybucket/brand_img/ios/|awk {'print $4'} > objects.txt

 while read line; do aws s3api copy-object --bucket mybucket  \
--copy-source /mybucket/brand_img/ios/$line --key brand_img/ios/$line \
--metadata-directive REPLACE --metadata Content-Disposition=$line --acl public-read; done < objects.txt
like image 3
FuzzyAmi Avatar answered Nov 04 '22 09:11

FuzzyAmi