ruby-on-railsamazon-web-servicesamazon-s3rails-activestorage

Active Storage with Amazon S3 not saving with filename specified but using file key instead


I am having an issue with Active Storage. When I upload to Amazon S3, instead of saving the file inside the bucket with the original name like myfile.zip it is saving it as the key which is associated with that file. So in Cyberduck I am seeing something like this: 5YE1aJQuFYyWNr6BSHxhQ48t. Without any file extension.

I am not sure if there is some setting in Rails 5 or whether it is within Amazon S3 but I have spent hours Googling around to figure out why this is happening.

Any pointers would be really appreciated!

Best regards, Andrew


Solution

  • This is by design, from ActiveStorage. The file is stored by it's key and without extension on S3, but when the URL is generated by ActiveStorage, the disposition and filename are set.

    def url(key, expires_in:, filename:, disposition:, content_type:)
      instrument :url, key: key do |payload|
        generated_url = object_for(key).presigned_url :get, expires_in: expires_in.to_i,
          response_content_disposition: content_disposition_with(type: disposition, filename: filename),
          response_content_type: content_type
    
        payload[:url] = generated_url
    
        generated_url
      end
    end
    

    This is probably done to avoid filename escaping issues that you'd run into otherwise.

    You can read more about the Content-Disposition headers here.