By brytiuk076
Context I use ‘aws-sdk-s3’ ruby gem to upload files to DO spaces.
Issue When uploading file with multiple spaces in sequence in file name, error returned:
Aws::S3::Errors::SignatureDoesNotMatch (Aws::S3::Errors::SignatureDoesNotMatch)
How can I fix this? Is it DO spaces specific error?
How to reproduce?
require "aws-sdk-s3"
require "content_disposition"
resource = Aws::S3::Resource.new(
access_key_id: "...",
secret_access_key: "...",
endpoint: "...",
region: "...",
)
bucket = resource.bucket("...")
object = bucket.object("...")
filename = "multiple spaces.txt"
object.put(
body: "content",
content_disposition: ContentDisposition.inline(filename),
)
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Accepted Answer
Hi,
I tried to reproduce the error you reported but a file was successfully uploaded in my case. I also did another test using s3cmd package on CentOS 7. It worked perfectly well. It is not DO Spaces specific error then.
Here is the configuration I used for reproducing the error.
Droplet - standard Ubuntu image, fully upgraded
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
(...)
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
3.1.2
aws-sdk-s3 (1.87.0)
Author: Amazon Web Services
Homepage: https://github.com/aws/aws-sdk-ruby
License: Apache-2.0
Installed at: /var/lib/gems/2.7.0
AWS SDK for Ruby - Amazon S3
content_disposition (1.0.0)
Author: Jonathan Rochkind
Homepage: https://github.com/shrinerb/content_disposition
License: MIT
Installed at: /var/lib/gems/2.7.0
Ruby gem to create HTTP Content-Disposition headers with proper
escaping/encoding of filenames
My script was just a copy of yours:
require "aws-sdk-s3"
require "content_disposition"
resource = Aws::S3::Resource.new(
access_key_id: "my_access_key",
secret_access_key: "my_secret_key",
endpoint: "https://ams3.digitaloceanspaces.com",
region: "ams3",
)
bucket = resource.bucket("my_bucket")
object = bucket.object("multiple spaces.txt")
filename = "multiple spaces.txt"
object.put(
body: "content",
content_disposition: ContentDisposition.inline(filename),
)
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Full documentation for every DigitalOcean product.
The Wave has everything you need to know about building a business, from raising funding to marketing your product.
Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.
New accounts only. By submitting your email you agree to our Privacy Policy
Scale up as you grow — whether you're running one virtual machine or ten thousand.
Sign up and get $200 in credit for your first 60 days with DigitalOcean.*
*This promotional offer applies to new accounts only.