如何将上载的文件保存到数据库而不是名称

时间:2011-03-07 10:01:14

标签: ruby-on-rails

我正在使用Rails3并创建了一个简单的文档表,其中包含document_name(字符串)和document(blob)列以及其他一些用于元数据的列。我添加了

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

到_form.html.erb部分。模型没有变化(通过rails g scaffold生成......)

更新和新操作适用于所有列,但上载的文档未保存到文档列中。相反,上载文档的名称将保存到文档列(而不是文件内容)。

如何将上传的二进制数据写入文档字段,将上传的文件名写入document_name列?

3 个答案:

答案 0 :(得分:2)

我的猜测是您忘记在表单标记中设置:multipart=>true

你能发布整个“新”形式吗?

答案 1 :(得分:0)

这称为上传。你可以从头开始(Rails为上传提供了很好的支持)或使用以下Rails插件之一:

答案 2 :(得分:0)

这里是文件创建和编辑的部分。忽略明显的自定义函数。

<%=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'

我希望有所帮助。