我需要能夠從S3存儲桶中以Rails應用程序的形式下載大文件。我通常只是給用戶提供3S桶的URL,但我需要它保持屏蔽,以便我可以隨意過期或刪除URL。我在做類似如下:從S3在Rails上提供大文件
def download
purchase = Purchase.find(params[:id])
data = open(purchase[:download_url])
send_data data.read, filename: purchase[:file_name]
end
它適用於較小的文件,但是,一個就是,說1GB,因爲Heroku的超時限制,用戶得到一個大胖子的520錯誤。
我知道這裏發生了什麼:在發送給用戶之前,整個文件正在我的應用程序中打開,這就是爲什麼大文件超時的原因。我想知道的是,如果有一種解決方法,而不給用戶S3 URL?是否可以,而不是下載文件,只是掩蓋網址(不重定向)?
任何幫助表示讚賞!
編輯
基於上的其他答案,我試圖執行一個到期網址:
def download
purchase = Purchase.find(params[:id])
path = purchase[:download_url].sub! 'entire URL until bucket path', ''
s3URL = AWS::S3::S3Object.new(S3_BUCKET, path)
redirect_to s3URL.url_for(:read).to_s
end
這只是重定向到AWS的AccessDenied
,但也許我建立的網址不正確。再次,任何幫助表示讚賞!
嘿,愛德華謝謝你!我正在選擇你的第二個解決方案,除非我使用'url_for'因爲我使用了gem的v1。它產生類似於https://mybucket.s3.amazonaws.com/bucket_path_file.zip?AWSAccessKeyId = XXXXX&Expires = 1453753227&Signature = XXXXX&response-content-disposition = attachment' - 我現在的問題是'https://mybucket.s3 .amazonaws.com/bucket_path_file.zip'仍然有效。我應該如何處理我的政策/權限以防止出現這種情況? –
是的,生成的url看起來像一個預先註冊的url。你是如何上傳你的物品的?您是否將ACL設置爲「public-read」? –
是的,它是'公開閱讀'。我在我的Rails控制器中創建對象數據,如下所示:'S3_BUCKET.presigned_post(key:「#{SecureRandom.uuid} - $ {filename}」,success_action_status:'201',acl:'public-read')'和然後將這個信息傳遞給[jQuery-File-Upload](https://github.com/blueimp/jQuery-File-Upload)來處理其餘部分。 ACL應該設置爲什麼? –