Ruby on rails 3 使用CarrierWave上传文件到S3,不带模型,可以吗?

Ruby on rails 3 使用CarrierWave上传文件到S3,不带模型,可以吗?,ruby-on-rails-3,amazon-s3,carrierwave,fog,Ruby On Rails 3,Amazon S3,Carrierwave,Fog,CarrierWave有惊人的文档,直到你需要在没有模型的情况下完成它 我已经设置了上传器和fog设置,当在模型上使用安装的上传器时,它们都可以正常工作,但现在我想在没有模型的情况下这样做 我有这个: uploader = CsvUploader.new something = uploader.store!(File.read(file_path)) uploader.retrieve_from_store!(self.file_name) 当我打电话的时候。商店!代码立即运行,这很奇

CarrierWave有惊人的文档,直到你需要在没有模型的情况下完成它

我已经设置了上传器和fog设置,当在模型上使用安装的上传器时,它们都可以正常工作,但现在我想在没有模型的情况下这样做

我有这个:

 uploader = CsvUploader.new
 something = uploader.store!(File.read(file_path))
 uploader.retrieve_from_store!(self.file_name)
当我打电话的时候。商店!代码立即运行,这很奇怪,因为上传文件需要几秒钟

然后在我打电话之后。从商店取回你!uploader对象具有所有正确的S3信息,比如完整的URL和其他内容

然而,呼吁:

uploader.file.exists?
返回false。浏览S3URL会从s3返回一个key not found错误

那么,我做错了什么??重申一下,它在安装时工作,所以我不认为这是我的雾设置

我的上传者:

class CsvUploader < CarrierWave::Uploader::Base
  # Choose what kind of storage to use for this uploader:
  storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  include CarrierWave::MimeTypes
  process :set_content_type

  def store_dir
    "uploads/public/extranet_csvs"
  end

  def cache_dir
    "/tmp/uploads"
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(csv)
  end
end
类CsvUploader我想你想要
文件。打开
而不是
文件。阅读
。后者返回一个原始字符串,CarrierWave不知道如何存储该字符串

uploader = CsvUploader.new
File.open(file_path) do |file|
  something = uploader.store!(file)
end
uploader.retrieve_from_store!(self.file_name)

这可能在文档中更清楚,但我通过检查文档确认了这一点。很遗憾CarrierWave在这里默默失败。

回答得很好,谢谢!只要提醒一下使用此代码的人,调用
File.open(File\u path)
这样会在存储文件后使其保持打开状态。要让Ruby为您关闭它,请使用
File.open(File|path){| File | something=uploader.store!(File)}
我不需要从商店中检索行,我只是使用
uploader.url
获取我文件的url。当我们执行uploader.store时!(文件)它尝试查找store_dir,在该方法中,我需要导出依赖于模型对象的account_id。但在本例中,模型对象为零。那么,在存储文件时有没有方法传递该ID?