如何使用CloudFront从aws s3获取具有别名的对象URL

时间:2014-10-07 10:08:22

标签: ruby-on-rails amazon-s3 amazon-cloudfront

我将具有唯一ID的文件(如'd9127dfd01182afe7d34a37')作为对象名称上传到amazon s3,并将文件信息存储在我的本地数据库中,包括文件的原始名称。我正在使用CloudFront网址下载该文件。

如果我使用CloudFront下载文件,则url文件名为d9127dfd01182afe7d34a37。但我需要再次将文件名更改为我在数据库中的原始名称。我不想下载它。我想将带有原始名称的URL提供给客户端(WebUI),客户端可以通过URL下载它。

服务器端代码

 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

客户端代码

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

有没有办法实现这个目标?请帮帮我。我在rails和mongodb上使用ruby作为本地数据库。 谢谢

1 个答案:

答案 0 :(得分:0)

我通过以下更改实现了

服务器端代码

             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

客户端代码

        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;
    },