Search code examples
ruby-on-railsamazon-s3amazon-cloudfront

How to get the object url with alias name from aws s3 using CloudFront


I am uploading files with unique id like 'd9127dfd01182afe7d34a37' as object name to amazon s3 and storing the file information with my local database including original name of the file. And I am using CloudFront url to download the file.

If I download the file using CloudFront url file name is d9127dfd01182afe7d34a37. But I need to change file name again to it's original name wich I have in my database. I don't want to download it. I want to give the url with original name to the client(WebUI) and client can download it through url.

serverside code

 document_url = initialize_cloud_service(document.provider['primary']).get_object_url(document_id, expires_at, 'CloudFront' )

if document_url
            item = {}
            item['id'] = document['_id'].to_s
            item['name'] = document['name']
            item['mime_type'] = document['mime_type']
            item['url'] = document_url
     return {success: true, message: MESSAGES['get_url_succuss'],data: item}.to_json
end

client side code

download: function(response){
        file = response.data
        link = document.createElement('a');
        link.download = file.name;
        link.href = file.url;
        link.click();
    },

Is there any way to achieve this? Please help me out. I am using ruby on rails and mongodb as local database. Thanks


Solution

  • I have achieved by doing the following changes

    Server Side code

                 begin
                    expires_at = Time.now.to_i + 30.seconds.to_i
    
                    options = nil
                    selected_provider = provider || document.provider['primary']
    
                    case selected_provider
                    when "s3"
                        options = {"response-content-disposition" => "attachment; filename=#{document['name']}"}
                        downloadable_url = initialize_cloud_service(selected_provider).get_downloadable_url(document_id, expires_at, options)
    
                    when "google_cloud"
                        downloadable_url = initialize_cloud_service(selected_provider).get_downloadable_url(document_id, expires_at, options)
                        downloadable_url += "&response-content-disposition=attachment%3B%20filename%3D#{document['name']}"
                    end
    
                    item = {}
                    item['id'] = document['_id'].to_s
                    item['name'] = document['name']
                    item['mime_type'] = document['mime_type']
                    item['url'] = downloadable_url
                    return {success: true, message: MESSAGES['get_url_succuss'],data: item}.to_json
                rescue Exception => e
                    puts 'Exception in download, message: ' + e.message
                    return {success: false, message: MESSAGES['default']}.to_json
                end
    

    client side code

            download: function(response){
            var hiddenIFrameID = 'hiddenDownloader',
            iframe = document.getElementById(hiddenIFrameID);
            if (iframe === null) {
            iframe = document.createElement('iframe');
            iframe.id = hiddenIFrameID;
            iframe.style.display = 'none';
            document.body.appendChild(iframe);
            }
            iframe.src = response.data.url;
        },