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

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

File.read("export.opml") 

我想为刚刚创build一个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上传的自定义操作(upload),在提交之后,它被传递给另一个自定义操作(parse)进行处理。 这可能是我的问题的一部分?

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

可以肯定( params[:uploaded_file]的类types可能会因您是否使用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]是一个散列,请确保在调用视图中的file_field时没有错误地翻转object_namemethod参数,或者你的服务器没有给你一个hash关键字如:content_type等(在这种情况下,请使用来自development.log / production.logBad file_data ...输出来评论这个post)

我需要阅读yaml文件。 我用remotipart和这里的代码:

在html.slim中

  =form_tag('/locations/check_for_import', method: :post, remote: true, multipart: true) 

 <input id="uploadInput" type="file" name="uploadInput"> 

在控制器中

 content = File.read(params[:uploadInput].tempfile) doc = YAML.load(content)