Как сохранить временные файлы поверх запросов в Rails?

В моем приложении Rails пользователи могут загружать файлы Excel. В моей модели есть класс ImportFile, который использует attachment_fu следующим образом:

class ImportFile < ActiveRecord::Base
  has_attachment :storage => :file_system, :path_prefix => 'public/imports', :max_size => 10.megabytes
end

Когда пользователь нажимает «Добавить файл», он переходит на страницу с полем ‹%= fields.file_field :uploaded_data %>. attachment_fu выполняет свою работу, и загрузка файла выполняется (давайте опустим проблемы с проверкой). Я хочу сохранить этот файл на будущее, поэтому я копирую загруженный файл в другой временный файл. Временный файл работает нормально - я вижу его на диске.

def self.write_to_tmp(data)
    temp_file = Tempfile.new("import", "#{Rails.root}/tmp")
  begin
    temp_file.write(data)
  ensure
    temp_file.close(false)
  end
  temp_file
end

Что я хочу сделать, так это показать пользователю предварительный просмотр, а затем позволить ему выбрать, хочет ли он добавить файл или отказаться от него - есть две кнопки. У меня проблема, когда пользователь выбирает сохранить файл, потому что временный файл, который я только что создал выше, исчез. Удаляется перед запросом.

Есть ли у кого-нибудь подсказки, как этого добиться? Или может указать мне сценарий загрузки файла с предварительным просмотром, подобный тому, который я представил? Я искал несколько дней, но так и не нашел.


person Tomasz Kalkosiński    schedule 16.11.2010    source источник


Ответы (1)


Наиболее надежным подходом к такого рода вещам было бы создание простой модели отслеживания «загрузки», как у вас, но с использованием Скрепка вместо этого. Это может быть настроено для обработки очень большого количества файлов.

Вам нужно сохранить эти записи, чтобы они сохранялись между запросами. Это приведет к потерянным записям, но с помощью простого задания cron или задачи rake вы можете в любое время удалить все неиспользуемые файлы.

Создание большого количества файлов в одном каталоге обычно является плохой идеей. У Paperclip есть параметр пути, который разделит ваш идентификационный номер на части, поэтому, например, запись #903132 переходит в .../90/31/32.

Сохраните обычное вложение, и если они захотят от него отказаться, удалите его, в противном случае используйте его. В какой-то момент позже очистите все неиспользуемые вложения.

person tadman    schedule 16.11.2010
comment
Спасибо за подсказку - полезно. Если я решу оставить какие-то потерянные записи, мне все равно не придется переключаться на Paperclip, так как attachment_fu тоже выполняет свою работу. - person Tomasz Kalkosiński; 16.11.2010