2016-12-26 18 views
2

有料ダウンロードでwebappを作成しています。protecting uploadsのCarrierwaveのガイドに従っています。すべてが1つのことを保存することを期待して動作しています。経路を表示しないでCarrierwave URLを表示

ProductsController


製品のファイルアップローダ

... 
def store_dir 
    "#{Rails.root}/downloads/#{model.product_id}/#{model.id}" 
end 
... 

ルート

get "/downloads/:product_id/:product_file_id/:filename", :controller => "products", action: "download", conditions: {method: :get} 

:ここに私の現在の設定です


ダウンロードパスに問題があります。ファイルアップローダで#{Rails.root}を指定したため、ファイルはdownloadsというパブリックフォルダの外部フォルダに保存されます。しかし、これには意図しない副作用があります。私のモデルからURLを取得すると、Rails Rootの相対パスではなく絶対パス全体が得られます。

したがって、ProductFile.first.file.url"/home/doomy/Documents/resamplr/downloads/3/1/aaaa.zip"を返します。代わりに/downloads/3/1/aaa.zipを返す必要があります。

この現象は、ProductFileUploaderで指定されているものに添付されているようです。

たとえば、store_dir"/downloads/#{model.product_id}/#{model.id}"に変更すると、自分のPCのルートにアップロードしようとするとアクセスエラーが発生します。 "downloads/#{model.product_id}/#{model.id}"は、単にダウンロードと呼ばれるpublicディレクトリの新しいフォルダにアップロードします。これは私がしたいことではありません。

進め方についてのアドバイスはありますか?ありがとう。


は編集:

私はRails.rootにCarrierwave設定ファイルにconfig.rootを設定すると、この動作を可能にすることを発見しました。私がこれを行うと、ProductFileUploaderstore_dir"downloads/#{model.product_id}/#{model.id}と指定することができます。

ただし、これは公開ファイルが「/ public/...」リンクで保存されていることを意味します。 Railsはパブリックフォルダ名を自動的に破棄し、URL内のサブディレクトリ名を使用します。

答えて

1

これを解決する方法が見つかりました!

各アップロード者には、目に見えないファイルパスを設定するために使用できる特別な方法rootがあります。まず、私はPublicUploaderという特別なアップローダ基本クラスを作った。

class PublicUploader < CarrierWave::Uploader::Base 
    def root 
    "${Rails.root}/public" 
    end 
end 

次に、CarriersWaveのグローバルルートをRails.rootに設定しました。

CarrierWave.configure do |config| 
    # These permissions will make dir and files available only to the user running 
    # the servers 
    config.permissions = 0600 
    config.directory_permissions = 0700 
    config.storage = :file 

    # This avoids uploaded files from saving to public/ and so 
    # they will not be available for public (non-authenticated) downloading 
    config.root = Rails.root 
end 

これは私のプライベートなファイルアップローダーで、私は単に

def store_dir 
    "downloads/#{model.product_id}/#{model.id}" 
end 

を書くことができますし、"#{Rails.root}/public/downloads/..."とは対照的に、それは"#{Rails.root}/downloads/..."に保存されることを意味します。つまり、コントローラを使ってアクセスを制限することができます。

しかし、私の公共のアップローダーで、私は単に持っていた

...

def store_dir 
    "public/downloads/#{model.product_id}/#{model.id}" 
end 

...私は私の"#{Rails.root}/public"フォルダに保存したかったので。しかし、これはRailsがパスからpublicを省略してレールは、以下の

/public/downloads/myfile.jpg

これが問題となるようなURLを表示することを意味しました。アップローダーは私がrootを定義する特別なクラスから継承するときに上記404しかし、その後、私は単にそれをアップロードし、正しく画像が表示されます

def store_dir 
    "downloads/#{model.product_id}/#{model.id}" 
end 

を言うことができるでしょう!これが誰かを助けることができるといいですね。

関連する問題