ruby-on-rails – 如何读取用户上传的文件,而不将其保存到数据库

我想能够读取用户上传的XML文件(小于100kb),但不必先将该文件保存到数据库。我不需要该文件超过当前操作(其内容被解析并添加到数据库;但是,解析文件不是问题)。由于本地文件可以读取:

File.read("export.opml")

我想到只是创建一个file_field为:uploaded_file,然后尝试读它

File.read(params[:uploaded_file])

但是所做的一切是抛出一个TypeError(不能将HashWithIndifferentAccess转换为String)。我真的尝试了很多种东西(包括从/ tmp目录中读取),但可能没有一个工作。

我希望我的问题的简洁不掩盖我试图解决这个问题我自己的努力,但我不想污染这个问题与一百多种方式如何不完成。非常感谢任何人谁在里面。

这是我的观点:

<% form_for(:uploaded_file, @feed, :url => {:action=>'parse'}, :html=> {:multipart=>true}) do |f| %>  <p>
    <%= f.label :uploaded_file, 'Upload your file.' %><br />
    <%= f.file_field :uploaded_file %>
  </p>
  <p><%= f.submit 'upload' %></p>
<% end %>

我设置了一个处理file_field上传的自定义操作(上传),它在提交后被传递到另一个自定义操作(解析)进行处理。这是我的问题的一部分吗?

你很近。检查params [:uploaded_file]的类类型,它通常应该是一个StringIO或一个Tempfile对象 – 这两个对象已经充当文件,并且可以使用它们各自的读取方法读取。

只是为了确保(类型的params [:uploaded_file]可能会有所不同,具体取决于你使用Mongrel,乘客,Webrick等),你可以做一个更详尽的尝试:

# Note: use form validation to ensure that
#  params[:uploaded_file] is not null

file_data = params[:uploaded_file]
if file_data.respond_to?(:read)
  xml_contents = file_data.read
elsif file_data.respond_to?(:path)
  xml_contents = File.read(file_data.path)
else
  logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}"
end

如果,在你的情况下,事实证明params [:uploaded_file]是一个哈希,确保你没有错误地翻转object_name和方法参数调用file_field在你的视图,或者你的服务器没有给你一个哈希键如:content_type等(在这种情况下,请使用从development.log / production.log中输出的Bad file_data …注释此帖)。

http://stackoverflow.com/questions/2521053/how-to-read-a-user-uploaded-file-without-saving-it-to-the-database

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:ruby-on-rails – 如何读取用户上传的文件,而不将其保存到数据库