Как создать новый файл в процессе CarrierWave? - PullRequest
3 голосов
/ 11 февраля 2011

Мой пользователь загружает zip-файл с 3 файлами (A.ttf, A.svg, A.otf), и я хочу сохранить оригинальный zip плюс 3 файла шрифта внутри него. Я создал 3 версии с этим кодом

version :ttf
    process :font => :ttf
end

version :svg
    process :font => :svg
end

version :otf
    process :font => :otf
end

Он успешно сохраняет 4 копии исходного файла, все с правильным именем файла. Тем не менее, я не знаю, как заставить CarrierWave хранить отдельные файлы. Этот код не работает. (

def font(format)
  new_file = nil

  # Loop through the zip file and extract the files
  Zip::ZipFile.open(@file.file) do |files|
    files.each do |f|
      next unless f.file?

      filename  = f.name.split("/").last
      ext       = filename.split('.').last

      # Save the file with the proper file extension
      new_file = f if ext == format
  end

  # Return the file to be stored by CarrierWave
  new_file
end

Ответы [ 2 ]

5 голосов
/ 11 февраля 2011

Хорошо, после многих часов удара головой о стену наконец-то зажегся свет.Решение в том, как CarrierWave обрабатывает загрузку.Когда вы определяете версию, CW дублирует файл с новым именем ([имя версии] _original_filename) и передает его вам в переменной current_path.С этой ссылкой на файл вы можете делать все, что захотите (т.е. открыть файл и обрезать его, либо заполнить случайной датой и т. Д.), И когда вы закончите, CW сохранит файл для вас.пропустил связь, и когда я понял, что происходит, это почти ослепило меня.Я отвечаю на этот вопрос здесь, чтобы он мог помочь какой-то другой бедной душе, потерянной в темноте.И показать миру свое невежество.: /

0 голосов
/ 11 февраля 2011

Я не знаю о CarrierWave. Но вы возвращаете объект zip-файла обратно. Это то, что вы хотите передать или вы хотите передать имя файла? Или вы хотите, чтобы файл был извлечен и передал путь извлеченного файла обратно?

...