我正在使用Rails3并创建了一个简单的文档表,其中包含document_name(字符串)和document(blob)列以及其他一些用于元数据的列。我添加了
<%= f.label :document %><br />
<%= f.file_field :document %>
到_form.html.erb部分。模型没有变化(通过rails g scaffold生成......)
更新和新操作适用于所有列,但上载的文档未保存到文档列中。相反,上载文档的名称将保存到文档列(而不是文件内容)。
如何将上传的二进制数据写入文档字段,将上传的文件名写入document_name列?
答案 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'
我希望有所帮助。