2017-04-18 110 views
0

我写了一个Rails API,在aws-sdk-ruby的帮助下,它从AWS中检索一个文件并返回API的响应。我可以通过object.get以某种方式得到文件流,我可以直接从Rails API返回。如何在Object.get中输出文件流

s3 = Aws::S3::Resource.new 
bucket_name = "my_bucket" 
bucket = s3.bucket(bucket_name) 
object = bucket.object("a/b/my.pdf") 
Rails.logger.info 'Downloading file to AWS' 
downloaded_data = object.get({}) 
send_data(downloaded_data, 
    :filename => "my.pdf", 
    :type => "mime/type" 
) 

但它不返回文件。

一种选择我所知道的是,使用该行的文件,先保存在本地:

object.get(response_target: '/tmp/my.pdf') 

比我能回到这个文件但有没有办法跳过这一步,直接返回object.get响应而无需在本地保存

我不能使用this解决方案,因为我的URL不公开,我只是创建一个REST API。

当我试着this解决方案时,我得到如下画面。

enter image description here

+0

@AndreyDeineko ,这个问题是不同的,因为这些文件已经可以通过URL公开访问。 – Saurabh

+0

它不适合你吗?如果不是,我会重新提出这个问题。 –

+0

@AndreyDeineko就我而言,有一件事,我只有REST API返回文件,而不是完整的Rails应用程序,其次没有内容的公共URL。 – Saurabh

回答

0

截至目前我在做什么,从这样的对象得到一个URL:

url = object.presigned_url(:get, expires_in: 3600) 

,并使用下面的代码来发送响应:

data = open(url) 
send_data data.read, filename: file_name, type: "mime/type"