Как использовать скрепку с файлом, уже находящимся на моем сервере?
-
05-07-2019 - |
Вопрос
Для справки: я работаю над устаревшим кодом и пытаюсь подключить новую функцию, не сломав при этом все.Прямо сейчас у меня на сервере есть куча файлов:
myapp/public/temp/myfile.doc
Дело в том, что я хочу создать объект Docfile из этих файлов в действии контроллера.
Вот урезанный класс Docfile:
class DocFile < ActiveRecord::Base
has_attached_file :docs,
:path => "#{Constants::DOCFILES_PATH}:basename.:extension",
:url => "http://#{Constants::SITE_URL}/docs/:basename.:extension"
end
У Paperclip есть хорошая документация, если вы загружаете ее из формы, но не в моей ситуации.
Итак, как я могу «имитировать» тот факт, что я загружаю файл?
До сих пор я пробовал это:
temp_file_url = "correct_rails_root/myapp/public/temp/myfile.doc"
@docfile = DocFile.new :docs => temp_file
Но это не работает.
Любые указатели будут оценены!
Редактировать:
Я сделал это:
temp_file_url = Constants::TEMPORARY_UPLOAD_PATH + "/" + params[:temp_file_upload][:doc]
temp_file = File.new(temp_file_url, "w+")
@docfile = DocFile.new :docs => File.open(temp_file_url)
Это все еще не работает
Решение
Мне пришлось сделать это:
temp_file_name = #the filename
temp_file_path = Constants::TEMPORARY_UPLOAD_PATH + "/" + temp_file_name
temp_file = File.new(temp_file_path, "r")
@docfile = DocFile.new :docs => temp_file
Видимо, если бы я не открыл файл как "прочитанный", то это бы не сработало.Для меня это не имеет особого смысла, но теперь это работает!
Другие советы
Я не знаток Rails, но,
@docfile = DocFile.new :docs => temp_file
не должно быть
@docfile = DocFile.new :docs => temp_file_url
Вы должны пройти Paperclip
а File
объект:
temp_file_path = 'correct_rails_root/myapp/public/temp/myfile.doc'
@docfile = DocFile.new :docs => File.open(temp_file_path)
Я думаю, вам нужно будет решить эту проблему с помощью миграции, и для ваших существующих файлов вам нужно будет заполнить столбцы, которые скрепка добавляет в вашу модель (xxx_file_name
, xxx_content_type, xxx_file_size
).Вы не упомянули, если Constants::DOCFILES_PATH
сопоставляется с вашим устаревшим каталогом документов, но даже в этом случае я думаю, вам придется создать символическую ссылку на эти файлы в структуру каталогов, которую ожидает скрепка.