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),
)

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
Submit an Answer
1 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

cat /etc/os-release
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 -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
gem -v
3.1.2
gem info aws-sdk-s3
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
gem info content_disposition
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),
)
  • Thank you, s3cmd works indeed. Need to move the question to stackoverflow. My env looks similar to one you described. Except OS version.

    cat /etc/os-release
    
    NAME="Ubuntu"
    VERSION="18.04.5 LTS (Bionic Beaver)"
    
    ========
    ruby -v
    
    ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]
    
    ========
    gem -v
    3.2.4
    
    ========
    gem info aws-sdk-s3
    
    aws-sdk-s3 (1.87.0)
        Author: Amazon Web Services
    
    ========
    gem info content_disposition
    content_disposition (1.0.0)
        Author: Jonathan Rochkind