Carrierwave を使用してテキスト ファイルを Rackspace にアップロードしていますが、これは機能しています。私のセットアップは本当に標準的です:
アップローダ:
class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::MimeTypes
storage :fog
def store_dir
"/my/local/path"
end
end
モデル:
class UploadedFile < ActiveRecord::Base
attr_accessible :file
mount_uploader :file, FileUploader
end
Carrierwave 初期ファイル:
CarrierWave.configure do |config|
config.fog_credentials = {
:provider => "Rackspace",
:rackspace_username => "xxxxx",
:rackspace_api_key => "yyyyy"
}
config.fog_directory = "my_container"
config.fog_host = "http://c000000.cdn.rackspacecloud.com"
config.fog_public = false
end
フォームからファイルをアップロードするのではなく、遅延ジョブを使用してバックグラウンド プロセスでファイルを生成し、それを Rackspace にアップロードしています。
file = File.new("/my/local/path/some_text_file.txt", "r")
uploaded_file = UploadedFile.new
uploaded_file.file = file
uploaded_file.save
ここまでは、すべて問題ありません。Rackspace アカウントで自分のファイルを確認できます。また、モデルが保存され、uploaded_files テーブルにレコードがあることもわかります。
私の問題はファイルの取得です。私は次のことを試みました:
downloader = FileUploader.new
downloader.retrieve_from_store!("some_text_file.txt")
私はretrieve_from_storeに気づきました!実際にはファイルをダウンロードしません。ただし、次に来るものは次のとおりです。
downloader.cache_stored_file!
しかし、前の呼び出しから何も取得されていないため、その行は壊れています。
以下は奇妙な出力を生成するため、ダウンロードで根本的に間違ったことをしていると思います。
f = UploadedFile.first
f.file.url
"/my/local/path/some_text_file.txt"
私が見たすべての例に基づいて、f.file.url が Rackspace CDN url を返すことを期待します。しかしそうではなく、代わりに store_dir パスを返します。
編集
UploadedFile モデルの基礎となるテーブルには「ファイル」という名前の列があり、これにはファイルのベース名のみが含まれており、Rackspace クラウド ファイルへの URL やフル パスは含まれていないことに注意してください。これは問題の一部である可能性があります...