ruby on rails - रेल: उपयोगकर्ता को वास्तविक S3 यूआरएल दिखाए बिना एस 3 पर संग्रहीत फ़ाइलों के डाउनलोड की अनुमति दें




ruby-on-rails download (2)

मेरे पास हेरोकू पर होस्ट किया गया एक रेल एप्लिकेशन है। ऐप अमेज़ॅन एस 3 पर पीडीएफ फाइलें उत्पन्न और स्टोर करता है। उपयोगकर्ता इन फ़ाइलों को अपने ब्राउज़र में देखने या अपने कंप्यूटर पर सहेजने के लिए डाउनलोड कर सकते हैं।

मेरी समस्या यह है कि हालांकि इन फ़ाइलों को डाउनलोड करना एस 3 यूआरएल (जैसे "https://s3.amazonaws.com/my-bucket/F4D8CESSDF.pdf") के माध्यम से संभव है, यह स्पष्ट रूप से करने का एक अच्छा तरीका नहीं है यह। उपयोगकर्ता को बैकएंड के बारे में इतनी सारी जानकारी का पर्दाफाश करना वांछनीय नहीं है, जो उठने वाले सुरक्षा मुद्दों का उल्लेख न करें।

क्या मेरे ऐप को किसी भी तरह से नियंत्रक में S3 से फ़ाइल डेटा पुनर्प्राप्त करना संभव है, फिर उपयोगकर्ता के लिए एक डाउनलोड स्ट्रीम बनाएं, ताकि अमेज़ॅन यूआरएल का खुलासा न हो?


आप अपनी एस 3 ऑब्जेक्ट्स को निजी के रूप में बना सकते हैं और url_for विधि (aws-s3 मणि) के साथ उनके लिए अस्थायी सार्वजनिक यूआरएल उत्पन्न कर सकते हैं। इस तरह आप अपने ऐप सर्वर के माध्यम से फ़ाइलों को स्ट्रीम नहीं करते हैं, जो अधिक स्केलेबल है। यह सत्र आधारित प्राधिकरण (उदाहरण के लिए आपके ऐप में तैयार) डालने की अनुमति देता है, डाउनलोड ईवेंट की ट्रैकिंग आदि।

ऐसा करने के लिए, एस 3 होस्टेड फ़ाइलों के लिए सीधे लिंक को नियंत्रक / क्रिया के लिंक में बदलें जो अस्थायी यूआरएल बनाता है और इसे रीडायरेक्ट करता है। इस कदर:

class HostedFilesController < ApplicationController

  def show
    s3_name = params[:id] # sanitize name here, restrict access to only some paths, etc
    AWS::S3::Base.establish_connection!( ... )
    url = AWS::S3::S3Object.url_for(s3_name, YOUR_BUCKET, :expires_in => 2.minutes)
    redirect_to url
  end

end

डाउनलोड यूआरएल में अमेज़ॅन डोमेन की छिपाने आमतौर पर DNS एलियासिंग के साथ किया जाता है। आपको s3.amazonaws.com अपने सबडोमेन को s3.amazonaws.com लिए CNAME रिकॉर्ड बनाना होगा , उदाहरण के लिए s3.amazonaws.com । फिर आप निर्दिष्ट कर सकते हैं :server AWS::S3::Base.establish_connection!(:server => "downloads.mydomain", ...) में :server विकल्प AWS::S3::Base.establish_connection!(:server => "downloads.mydomain", ...) और S3 मणि लिंक बनाने के लिए इसका उपयोग करेंगे।


सबसे पहले आपको अपने डोमेन में एक सीएनएन बनाना होगा, जैसे here समझाएं।

दूसरा आपको उसी नाम के साथ एक बाल्टी बनाने की ज़रूरत है जिसे आपने सीएनएन में रखा था।

और समाप्त करने के लिए आपको अपनी कॉन्फ़िगरेशन को अपने कॉन्फ़िगरेशन / प्रारंभकर्ता / carrierwave.rb में जोड़ने की आवश्यकता है:

CarrierWave.configure do |config|
    ...  
    config.asset_host         = 'http://bucket_name.your_domain.com'
    config.fog_directory      = 'bucket_name.your_domain.com'
    ...
end




amazon-s3