前提・実現したいこと
ブラウザ側からS3にある画像をダウンロードできるボタンを作成したい。
ボタンでリンク先を指定するところまでは出来ています。
発生している問題
エラーが数過程発生していましたので確認のため段階を追って表示します。
初期の設定
controller
1def download 2 @index = params['id'] 3 myBacket = 'xxxx' 4 bucket = Aws::S3::Resource.new( 5 :region => 'ap-northeast-1', 6 :access_key_id => 'xxxx', 7 :secret_access_key => 'xxxx' 8 ).bucket(myBacket) 9 bucket.objects(:prefix => "name_no#{@index}",:max_keys => 10).each do |object| 10 data = open(URI.encode(object.public_url)) 11 send_file(data, filename: "name_no#{@index}.png", disposition: 'attachment', stream: true) 12 end
これで実行すると
403 Forbidden
となります。調べますとここ-ストックオーバーフローを参考にして
data = open(URI.encode(object.public_url))を
⬇
data = Net::HTTP.get(URI.parse(object.public_url))
これで実行すると、
Cannot read file <?xml version="1.0" encoding="UTF-8"?>
とActionController::MissingFile になります。
URI::parseやNet::HTTP.getなどのドキュメントを調べて推測になりますが、object.public_url
の文字列をどこかで置いてきた模様です。
ちなみにコンソールのエラー表示は
Started GET "/indices/5/download" for 61.245.214.147 at 2018-10-11 00:08:34 +0000 Cannot render console from 61.245.214.147! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by IndicesController#download as HTML Parameters: {"id"=>"5"} Sent file <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>F7976110C0985ADE</RequestId><HostId>DcgkiJv08lEsmQYqZ+YQscQK+EPhGjq2s0SFDXlZxq0P/tkiCGPGuVTZTdxCWnR3TYHe0LHlDwc=</HostId></Error> (0.6ms) Completed 500 Internal Server Error in 1646ms (ActiveRecord: 0.0ms) ActionController::MissingFile (Cannot read file <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>F7976110C0985ADE</RequestId><HostId>DcgkiJv08lEsmQYqZ+YQscQK+EPhGjq2s0SFDXlZxq0P/tkiCGPGuVTZTdxCWnR3TYHe0LHlDwc=</HostId></Error>): app/controllers/indices_controller.rb:49:in `block in download' app/controllers/indices_controller.rb:43:in `download'
その他、念の為send_data
でもやってみましたが空のファイルが生成されるだけでした。
上記のような設定でどうすれば正常にダウンロードされるのかお教えください。
回答1件
あなたの回答
tips
プレビュー