Как сохранить временные файлы над запросами в Rails? - PullRequest
4 голосов
/ 16 ноября 2010

В моем приложении 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

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

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

1 Ответ

1 голос
/ 16 ноября 2010

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

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

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

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

...