Главная » 2008 » Декабрь » 3 » RoR загрузка файлов
RoR загрузка файлов
15:48
Это не статья а скорее сборка рецептов из интернета и API, на русском языке. Т.к. опыта у меня пока маловато следовать рекомендациям не очень советую но почитать и попробовать можно.

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

Беглый осмотр по ActionView::Helpers::FormTagHelper не очень много дал, но это только на первый взгляд. Достоточно посмотреть на код:

Code

file_field_tag(name, options = {})  

Как станет ясно, что мы сделать можем. Не буду расписывать, просто приведу код примеров из API:
Code

file_field_tag 'attachment'
  # => <input id="attachment" name="attachment" type="file" />

  file_field_tag 'avatar', :class => 'profile-input'
  # => <input class="profile-input" id="avatar" name="avatar" type="file" />

  file_field_tag 'picture', :disabled => true
  # => <input disabled="disabled" id="picture" name="picture" type="file" />

  file_field_tag 'resume', :value => '~/resume.doc'
  # => <input id="resume" name="resume" type="file" value="~/resume.doc" />

  file_field_tag 'user_pic', :accept => 'image/png,image/gif,image/jpeg'
  # => <input accept="image/png,image/gif,image/jpeg" id="user_pic" name="user_pic" type="file" />

  file_field_tag 'file', :accept => 'text/html', :class => 'upload', :value => 'index.html'
  # => <input accept="text/html" class="upload" id="file" name="file" type="file" value="index.html" />

Таким образом мы можем сделать input. Но для отправки файла на сервер этого не достаточно, нам нужно при создании самой формы прописать multipart:

Code

  <% form_for @user, :html => { :multipart => true } do |f| %>
  ...
  <%= f.file_field :avatar %>
  ...
  <%end%>

Многоточие - соотв. другие поля.
На это мы не можем закончить, мы не обрабатываем форму, это дело надо исправить.
Для этого посмотрим на нашу модель user

Code

require "ftools"
class Album < ActiveRecord::Base

# Тут много вашего код
# Зависимости и тд.

  after_save :write_file
  after_destroy :delete_file

  def avatar=(file_data)
  @file_data = file_data
  end

  # Записываем файл на диск
  def write_file
  if @file_data
  File.open("#{AVATAR_STORAGE_PATH}/#{id}.#{extension}", "w") { |file| file.write(@file_data.read) }
  end
  end

  # Удаляет файл аватара пользователя
  def delete_file
  FileUtils.rm_rf("#{AVATAR_STORAGE_PATH}/#{id}.#{extension}")
  end
   
  # Получаем расширение файла
  def extension
  @file_data.original_filename.split(".").last
  end

end

Код взят отсюда с небольшой модификацией.

Оттуда же:

Code

Константа загрузочного пути. Установка значения идет в RAILS_ROOT/config/initializers/globals.rb. Просто создайте файл с понятным именем. Файл загружается при загрузке/перезагрузке сервера.

# Установка пути для загрузки аватаров
AVATAR_STORAGE_PATH = "#{RAILS_ROOT}/../storage/avatars"

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

Категория: Coding | Просмотров: 905 | Добавил: DeT | Теги: rails, file upload
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]