2

バージョンプロセスについて私が得ていない何か...

ファイルが入ったzipファイルがあり、そのファイルをzipの「バージョン」としてアップロードしたいと思います。

アップローダー:

  version :specificFile do
    process :extract_file
  end

  def extract_file
    file = nil
    Zip::ZipFile.open(current_path) do |zip_file|
      file = zip_file.select{|f| f.name.match(/specificFile/)}.first
      zip_file.extract(file, "tmp/" + file.name.gsub("/", "-")){ true }
    end    
    File.open("tmp/" + file.name.gsub("/", "-"))
  end

使用法:

=link_to "Specific File", instance.uploader.specificFile.url

これだけで、zipの2つのコピーを取得できます。明らかに、バージョン/プロセスがどのように機能するかについて私が見逃していることがあり、実際に魔法を説明するドキュメントを見つけることができませんでした。

では、どうすればこれを行うことができ、何が欠けているのでしょうか。

4

1 に答える 1

2

これは「理由」を提供しましたが、理解するのに少し時間がかかり ました。CarrierWaveプロセスで新しいファイルをどのように作成しますか?

言い換えると、バージョンを作成するときに、carrierwaveはファイルのコピーを作成し、プロセスにファイルパスを渡します。プロセスが終了すると、carrierwaveはそのパスの内容をアップロードします。プロセスが返すファイルではなく、これが起こっていると思っていました。

作業コード:

  version :specificFile do
    process :extract_file
    def full_filename (for_file = model.logo.file)
      "SpecificFile.ext"
    end
  end

  def extract_plist
    file = nil
    Zip::ZipFile.open(current_path) do |zip_file|
      file = zip_file.select{|f| f.name.match(/specificFile/)}.first
      zip_file.extract(file, "tmp/" + file.name.gsub("/", "-")){ true }
    end    
    File.delete(current_path)
    FileUtils.cp("tmp/" + file.name.gsub("/", "-"), current_path)
  end

だから、私が起こりたいことを実現するために、私は:

  • 特定のファイル名を使用するようにcarrierwaveに指示します。私はハードコードされた値を使用していますが、あなたはあなたが望むものを何でも使うことができるはずです。

  • current_pathの内容をバージョン名で必要な内容で上書きします。私の場合、「その中に」いる間はzipを上書きすることはできないので(私は思う)、気になるファイルのコピーを作成し、FileとFileUtilsを介してzipを上書きします。

PS-zipの重複を避けるのは良いことですが、carrierwaveに重複をスキップするように指示できるようには見えません。

于 2013-01-09T09:24:48.467 に答える