Как сохранить загруженный файл в базу данных вместо имени - PullRequest
0 голосов
/ 07 марта 2011

Я использую Rails3 и создал простую таблицу документов со столбцом document_name (строка) и document (blob) и несколько других столбцов для метаданных Я добавил

<%= f.label :document %><br />
<%= f.file_field :document %>

к частичному _form.html.erb. Модель не изменяется (генерируется с помощью rails g scaffold ...)

Обновление и новые действия работают нормально для всех столбцов, но загруженный документ не сохраняется в столбце документа. Вместо этого имя загруженного документа сохраняется в столбце документа (а не содержимое файла).

Как записать загруженные двоичные данные в поле документа, а имя загруженного файла в столбец document_name?

Ответы [ 3 ]

2 голосов
/ 07 марта 2011

Я предполагаю, что вы забыли установить :multipart=>true в теге формы.

Не могли бы вы опубликовать всю "новую" форму?

0 голосов
/ 07 марта 2011

Здесь часть формы для создания и редактирования файла.Игнорируйте очевидные пользовательские функции.

<%=form_for  fs_object,:url=>(fs_object.id ? fs_object_path( fs_object) : fs_objects_path),:html=>{:multipart=>true} do |f|%>
        <%=p.prop_capture :image do %>
            <%FsFile.images.each do |i|%>
                <%=  f.radio_button(:image, i)%><%=image_tag i,:height=>50%>
            <%end%>
        <%end%> 
    <%=p.prop "file upload",f.file_field(:content_binary)%>
    <%=link_to "download",download_fs_object_url(@object,:action=>"download"),:remote=>@js,:method=>:post if @object.id%>
    <%=p.prop :content_type %>
<%end%> 

Это действие контроллера по созданию файла или папки.Бинарным содержимым файла управляет handle_content .

def create
        p=params[:fs_folder]||params[:fs_file]
        @object =if params[:fs_folder]
          FsFolder.new(p)
        elsif params[:fs_file]
          FsFile.handle_content p
          h=FsFile.new(p)
        end
    end

Дескриптор содержимого, который управляет двоичным содержимым и типом содержимого в файле FSFile.

   def handle_content p
        if(p)
          if p[:content_binary]
            p=self.class.handle_content(p)
            if !p[:content_ending]
              p[:content_ending]=content_ending
            end
          end   
        end
        p
      end
       def self.handle_content p
        if(p)
          if p[:content_binary]
            logger.info "UPLOADED: #{p[:content_binary]}"
            c=p[:content_binary].read
            ext=File.extname p[:content_binary].original_filename
            p[:content_ending]=ext
            type=File.mime_type? p[:content_binary].original_filename
            debug "'#{p[:content_binary].original_filename}' '#{p[:name]}'"
            p[:name]=p[:content_binary].original_filename if !p[:name]||p[:name].strip==""
            #        type=ext.match(/od./) ? "Open Document file" : type
            p[:content_type]=type
    #        p[:image]=get_image_for_type p[:content_type] if !p[:image]
            p[:content_binary]=c

          end
        end
        p
      end

В моем gemfile я добавил для типов MIME:

gem 'mimetype-fu'

Надеюсь, это помогло.

0 голосов
/ 07 марта 2011

Это называется загрузкой. Вы можете сделать это с нуля (Rails предлагает довольно хорошую поддержку для загрузки) или использовать один из следующих плагинов Rails:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...