ペーパークリップを使用してファイルをサーバーにアップロードしています。パスを指定しないと、paperclip はファイルをパブリック フォルダーに保存<%= @user.file.url %>
し、ビューでアクセスしてダウンロードできます。しかし、公開されていないフォルダーへのパスを指定すると、明らかに、ビューからファイルを取得することはできません。
保存したファイルをプライベート フォルダーにダウンロードする方法、Web および Ruby スクリプトを使用する方法を知りたいです。
ペーパークリップを使用してファイルをサーバーにアップロードしています。パスを指定しないと、paperclip はファイルをパブリック フォルダーに保存<%= @user.file.url %>
し、ビューでアクセスしてダウンロードできます。しかし、公開されていないフォルダーへのパスを指定すると、明らかに、ビューからファイルを取得することはできません。
保存したファイルをプライベート フォルダーにダウンロードする方法、Web および Ruby スクリプトを使用する方法を知りたいです。
最初に行う必要があるのは、ファイルにアクセスするためのルートを routes.rb に追加することです。
routes.rb を編集して、太字の :member パラメータを追加します。
リソース :users, :member => { :avatars => :get }
たとえば、ユーザー 7 のアバターを取得するには、次のような URL を発行できます。
localhost:3000/users/7/avatars
…そして、リクエストはコントローラーのavatars
アクションにルーティングされusers
ます (ユーザーは複数のスタイルのアバターを持っている可能性があるため、複数形です)。
それでは、アバター メソッドを実装し、クライアントにファイルをダウンロードするためのコードを追加してみましょう。その方法は、ActionController::Streaming::send_fileを使用することです。とても簡単です。クライアントがファイルの表示方法を決定する手がかりとして使用する MIME コンテンツ タイプと同様に、ファイルのパスを send_file に渡す必要があるだけです。理解を深めるために、これらの値をハード コードしてみましょう (お使いのマシンのパスをここで更新してください)。
class UsersController < ApplicationController
def avatars
send_file '/path/to/non-public/system/avatars/7/original/mickey-mouse.jpg',
:type => 'image/jpeg'
end
end
localhost:3000/users/7/avatars
ブラウザに入力すると、ミッキーの画像が表示されます。
avatars メソッドでパスをハード コーディングする代わりに、任意のユーザー レコードの任意のアバター ファイル添付の要求を処理できる必要があることは明らかです。これを行うには、Paperclip を構成し、ファイルが現在ファイル システムに保存されている場所と、routes.rb ファイルを使用するように構成した URL を伝えます。
これを行うには、User モデル (user.rb) の has_attached_file への呼び出しにいくつかのパラメーターを追加する必要があります。
has_attached_file :avatar,
:styles => { :thumb => "75x75>", :small => "150x150>" },
:path =>
':rails_root/non-public/system/:attachment/:id/:style/:basename.:extension',
:url => '/:class/:id/:attachment'
しかし、次のように UserController でコードを一般化して、任意のユーザーを処理できるようになりました。
def avatars
user = User.find(params[:id])
send_file user.avatar.path, :type => user.avatar_content_type
end
localhost:3000/users/7/avatars
これで、何も壊れていないことを確認するためにもう一度テストできます。
乾杯!