When a file is displayed as an image on a page or as video playing in a HTML5 <video>
element the filename is not important. It can be a long string of random characters as the user does not see it.
But when you sign a URL that is meant to be downloaded, such as an Ebook or other downloadable content, the Save as dialog will present the object key as the default. Since this is directly observable by the users, it's important to provide a user-friendly value. Instead of f1945ed5-2d79-4e6e-b53e-bd9a2a1c25b6.pdf
, it's better to use my-great-ebook.pdf
.
There are three ways to determine the filename when a signed URL is downloaded.
The first is the Key of the object. Whatever you defined when you created the object will be the filename if nothing overwrites it.
The second one is the Content Disposition metadata that is attached to the object, most likely when the file was uploaded. For example, with Terraform, the object will be downloaded as ebook.pdf
, no matter what the actual key is:
resource "aws_s3_bucket_object" "object" {
# ...
content_disposition =
"attachment; filename=\"ebook.pdf\""
}
And finally, a new filename can be forced when the URL is signed. This can be done with the ResponseContentDisposition
parameter:
const signedUrl = await getSignedUrl(
s3Client,
new GetObjectCommand({
Bucket: process.env.FILES_BUCKET,
Key: productToDownload.file,
ResponseContentDisposition:
"attachment; filename=\"ebook.pdf\"",
})
);
Use the ResponseContentDisposition
parameter to set the filename. Do not rely on the Key of the object.