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

2024-04-03

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

File.read("export.opml")

我想过只为 :uploaded_file 创建一个 file_field ,然后尝试使用

File.read(params[:uploaded_file])

但所做的只是抛出一个 TypeError (无法将 HashWithIn DifferentAccess 转换为 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 上传,提交后,将其传递给另一个自定义操作(解析)进行处理。这可能是我的问题的一部分吗?


你们非常接近。检查班级类型 of params[:uploaded_file],它通常应该是StringIO http://ruby-doc.org/stdlib/libdoc/stringio/rdoc/classes/StringIO.html or a Tempfile http://ruby-doc.org/stdlib/libdoc/tempfile/rdoc/classes/Tempfile.html对象——两者都已经充当文件,并且可以使用各自的读取read方法)。

只是为了确定(类类型params[:uploaded_file]可能会有所不同,具体取决于您是否使用 Mongrel、Passenger、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 and method调用时的参数file_field http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#M001610在你看来,或者你的服务器没有给你一个带有像这样的键的哈希值:content_type等等(在这种情况下,请用以下方式评论这篇文章Bad file_data ...输出来自development.log/production.log.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何读取用户上传的文件,而不将其保存到数据库 的相关文章

随机推荐