Подтвердить что ты не робот

Загрузка файла в Rails

Я новичок в рельсах, и я пишу веб-сайт RESTful, используя технику CRUD. До сих пор я создал три страницы, каждая из которых позволяет пользователю создавать, редактировать и удалять строку из базы данных. Тем не менее, на моей четвертой странице необходимо будет добавить форму для загрузки файлов, но: а) я не знаю, как файловая система работает с Rails, поэтому я не знаю, где файлы должны храниться. Файл будет около 100 КБ и не может быть сохранен во временном хранилище, потому что он будет постоянно загружаться. И б) Я не знаю, как писать в файл.

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

4b9b3361

Ответ 1

Обновление 2018

Хотя все, что написано ниже, остается верным, Rails 5.2 теперь включает в себя active_storage, который позволяет такие вещи, как загрузка непосредственно в S3 (или другие сервисы облачного хранения), преобразования изображений и т.д. Вы должны ознакомиться с руководством по рельсам и решить для себя, что соответствует вашим потребностям.


Несмотря на то, что существует множество драгоценных камней, которые очень хорошо решают вопросы загрузки файлов (список см. в https://www.ruby-toolbox.com/categories/rails_file_uploads), в rails есть встроенные помощники, которые позволяют легко создавать собственное решение.

Используйте помощник file_field -form в своей форме, и rails обрабатывает загрузку для вас:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>

В контроллере вы получите доступ к загруженному файлу следующим образом:

uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
  file.write(uploaded_io.read)
end

Это зависит от сложности того, чего вы хотите достичь, но этого вполне достаточно для простой загрузки/выгрузки файлов. Этот пример взят из направляющих рельсов, вы можете перейти туда для получения дополнительной информации: http://guides.rubyonrails.org/form_helpers.html#uploading-files

Ответ 2

Сентябрь 2018

Для тех, кто недавно проверял этот вопрос, Rails 5. 2+ теперь имеет ActiveStorage по умолчанию & Я настоятельно рекомендую проверить это.

Поскольку теперь это часть основного Rails 5. 2+, он очень хорошо интегрирован и & обладает отличными возможностями из коробки (все остальные хорошо известные жемчужины, такие как Carrierwave, Shrine, paperclip,... великолепны, но этот предлагает очень хорошие возможности, которые мы можем рассмотреть для любого нового проекта Rails)

Команда Paperclip устарела в пользу Rails ActiveStorage.

Вот страница GitHub для ActiveStorage & множество ресурсов доступно везде

Также я обнаружил, что это видео очень полезно для понимания возможностей Activestorage.

Ответ 3

Есть хороший драгоценный камень, особенно для загрузки файлов: carrierwave. Если wiki не помогает, есть nice RailsCast о наилучшем способе его использования. Подводя итог, в формах Rails существует тип поля file, который вызывает диалог загрузки файла. Вы можете использовать его, но "волшебство" выполняется с помощью carrierwave gem.

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

Ответ 4

Хорошо. Если вы не хотите хранить файл в базе данных и хранить в приложении, например, активы (пользовательская папка), вы можете определить переменную экземпляра не-db, определенную attr_accessor: document, и использовать form_for - f.file_field, чтобы получить файл,

В контроллере

 @person = Person.new(person_params)

Здесь person_params возвращает белый список params[:person] (определите себя)

Сохранить файл как

dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")

Примечание. Добавьте этот путь в .gitignore & если вы хотите использовать этот файл снова, добавьте этот путь asset_path приложения application.rb

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

примечание: Хранение таких файлов увеличит размер приложения, его лучше хранить в базе данных, используя paperclip.

Ответ 5

В вашем intiallizer/carrierwave.rb

if Rails.env.development? || Rails.env.test?
    config.storage = :file
    config.root = "#{Rails.root}/public"
    if Rails.env.test?
      CarrierWave.configure do |config|
        config.storage = :file
        config.enable_processing = false
      end
    end
 end

используйте это, чтобы сохранить в файле во время работы на локальном