【问题标题】:ActionDispatch::Http::UploadedFile#read returns empty stringActionDispatch::Http::UploadedFile#read 返回空字符串
【发布时间】:2015-12-05 02:15:34
【问题描述】:

我有一个 Rails 应用程序,我在其中解析上传的 CSV。我刚刚发现解析已经停止工作,正在调查。

我已经追踪到我在 ActionDispatch::Http::UploadedFile 的一个实例上调用 .read 并返回一个空字符串。

上传的文件不是空的,当我检查UploadedFile对象时,它有一个类似@tempfile=#<File:/tmp/RackMultipart20130530-34976-6jaqt5的属性。如果我 cat 文件系统上的那个文件,它包含我所期望的。

为什么.read 会返回一个空字符串?

我使用的是 Rails 3.2.13。

【问题讨论】:

  • 请发布您的解析代码。
  • @PauloFidalgo - 我的解析代码以CSV.parse(input_string) 开头,然后映射到返回的行。问题是input_string 是空白的,这是因为对read 的调用是空白的。

标签: ruby-on-rails ruby-on-rails-3.2


【解决方案1】:

尝试倒带

我的同事建议在read 之前拨打rewind,这很有效。显然其他一些代码首先读取文件。

更新

据我所知,没有人比我先阅读文件。我创建了一个初始化程序来监视UploadedFile

# config/initializers/uploaded_file.rb
class ActionDispatch::Http::UploadedFile

  alias_method :old_read, :read
  def read(*args)
    Rails.logger.info "file #{self} is getting read by #{caller.first}!"
    old_read(*args)
  end
end

我没有看到对read 的任何其他呼叫。考虑到可能有一些其他方法可以推进读取指针,我更进一步并完全替换了该类:

# config/initializers/uploaded_file.rb
ActionDispatch::Http::UploadedFile = Class.new do

  def initialize(*args)
    Rails.logger.info "initilized with #{args}"
  end

  def method_missing(method_name, *args, &block)
    Rails.logger.info "file got #{method_name} with #{args}.\
      Block? #{block_given?} caller? #{caller.first}"
  end

end

还是什么都没有。我看到了对initialize 的呼叫、对rewind 的呼叫以及对read 的呼叫。

好像这个文件是预卷到最后的。我不确定为什么会这样,但rewind 仍然是我的解决方案。

【讨论】:

  • 我在本地 (MacOS) 遇到了同样的问题,但上传似乎在我们的 linux 服务器上运行良好。倒带也为我工作。我的第一个怀疑是它是我最近更新的 Pow,但是在通过独角兽运行时它以同样的方式失败。如果我发现确凿证据,我会在这里发帖。奇怪的是,这个问题突然发生在我身上,并且与它开始发生的时间差不多——也许是最近更新的 gem 造成的?
  • 今天我遇到了同样的奇怪问题。我使用 git-bisect 将其追溯到 5 月 30 日的提交,在那里我做了 bundle update。不幸的是,还没有时间进一步分解它(更新了很多宝石),但我将Gemfile.lockbundle exec gem list 差异放在一个要点中:gist.github.com/abevoelker/5750689
【解决方案2】:

如果文件刚刚上传和写入,请务必在继续之前将其关闭。例如:

out = File.open(path, 'w')
out.write(stuff)
out.close # omitting this may cause the issue described!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2013-06-14
    • 2015-05-22
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多